Программирование ARM Эффективная работа с графическим индикатором Fri, August 18 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Эффективная работа с графическим индикатором Печать
Добавил(а) microsin   

Графические индикаторы (обычно LCD черно-белый или цветной) имеют последовательный или последовательно/параллельный интерфейс, через который на индикатор передается графическая информация, команды по управлению индикатором, а также считывается статус индикатора (готов ли он к приему информации и т. д.).

Наличие шины обмена с индикатором замедляет работу с ним и требует непроизводительных затрат от процессора - вставка циклов ожидания, пока индикатор не будет готов к приему информации, формирование требуемых временнЫх диаграмм на интерфейсе индикатора (согласно протоколу обмена, описанному в даташите на индикатор). Прямая работа с индикатором (вывод на шину информации, когда нужно что-то нарисовать на экране) неэффективна по нескольким причинам:

- программа вывода загружает процессор и затрудняет быструю обработку остальных задач в программе.
- по медленному протоколу шины в индикатор пишутся данные, которые иногда не нужны. Например, в закрашенные области повторно рисуются закрашенные области.
- для того, чтобы индикатор работал с точки зрения пользователя "быстро", вовсе не нужно быстро обновлять содержимое видеопамяти индикатора. Это просто нужно делать строго периодично и с такой частотой, чтобы глаз не успевал отслеживать изменения. Тогда будет использоваться как инерционность человеческого глаза, так и инерционность жидкокристаллических ячеек экрана.

Для перечисленных условий наиболее оптимален (с точки зрения загрузки процессора и визуальной скорости работы для пользователя) следующий принцип работы с индикатором:

1. Программа, которая должна рисовать на экране, рисует то же самое в буфере памяти, который доступен для процессора. Для этого выделяется специальный буфер в сверхбыстром RAM, с которым процессор может работать очень эффективно.
2. По медленной шине на индикатор выводятся только изменения, которые произошли в буфере. Таким образом, объем данных, передаваемых в индикатор, уменьшается, что ускоряет обмен с ним (чем меньше изменяется картинка, тем меньше данных).
3. Данные передаются на индикатор строго периодично с частотой, близкой к пределу инерционности системы (например, для LCD достаточно частоты обновления индикатора в 20 Гц - человек все равно не заметит, если обновлять индикатор чаще).

Теперь немного подробнее. Вывод индикатор разбивается на 2 раздельных по времени и независимых друг от друга процесса. Первый процесс просто пишет в сверхбыстрый буфер данные, когда надо что-то нарисовать - это делает обычная программа в фоновом режиме (основное тело main), и делает это очень быстро, без задержек, в любое удобное для программы время. Второй процесс - вызываемая по таймеру с частотой 20 Гц подпрограмма, которая смотрит, какие изменения произошли в буфере, и эти изменения уже передает на LCD-индикатор по его медленной шине.

По поводу выделения буфера вроде все понятно - нужен блок памяти, равный размеру видеопамяти индикатора. Сложнее сделать отслеживание изменения буфера, чтобы оно работало эффективно. Это можно сделать по-разному - например, выделить для каждой строки индикатора флаг, который должна устанавливать программа, записывающая информацию в буфер (первый процесс). Подпрограмма, которая анализирует изменения в буфере (второй процесс) будет эти флаги считывать и сбрасывать по мере передачи информации в индикатор. Наверное, самый простой по реализации и самый быстрый вариант - выделить 2 одинаковых буфера. В первый буфер пишет данные первый процесс, а второй процесс сравнивает эти 2 буфера - там, где данные отличаются, там и произошли изменения. Эти изменения передаются на индикатор, и второй буфер обновляется (приводится в соответствие с первым буфером).

[Ссылки]

1. Описание на монохромный графический индикатор WinStar WG240128BWG240128B site:winstar.com.tw.
2. Графический интерфейс пользователя с применением микроконтроллеров Microchip site:microchip.com.ru (бесплатная библиотека с исходниками).
3. easyGUI site:easygui.com. Платная библиотека, которая поддерживает почти все микроконтроллеры и множество графических индикаторов и контроллеров.
4. IAR EW ARM: как перенаправить вывод printf и putchar (в статье описан пример подключения индикатора ЖКИ Winstar WG240128B со схемой и исходниками).

 

Добавить комментарий


Защитный код
Обновить

Top of Page