Эффективная работа с графическим индикатором |
![]() |
Добавил(а) microsin |
Графические индикаторы (обычно LCD черно-белый или цветной) имеют последовательный или последовательно/параллельный интерфейс, через который на индикатор передается графическая информация, команды по управлению индикатором, а также считывается статус индикатора (готов ли он к приему информации и т. д.). Наличие шины обмена с индикатором замедляет работу с ним и требует непроизводительных затрат от процессора - вставка циклов ожидания, пока индикатор не будет готов к приему информации, формирование требуемых временнЫх диаграмм на интерфейсе индикатора (согласно протоколу обмена, описанному в даташите на индикатор). Прямая работа с индикатором (вывод на шину информации, когда нужно что-то нарисовать на экране) неэффективна по нескольким причинам: - программа вывода загружает процессор и затрудняет быструю обработку остальных задач в программе. Для перечисленных условий наиболее оптимален (с точки зрения загрузки процессора и визуальной скорости работы для пользователя) следующий принцип работы с индикатором: 1. Программа, которая должна рисовать на экране, рисует то же самое в буфере памяти, который доступен для процессора. Для этого выделяется специальный буфер в сверхбыстром RAM, с которым процессор может работать очень эффективно. Теперь немного подробнее. Вывод индикатор разбивается на 2 раздельных по времени и независимых друг от друга процесса. Первый процесс просто пишет в сверхбыстрый буфер данные, когда надо что-то нарисовать - это делает обычная программа в фоновом режиме (основное тело main), и делает это очень быстро, без задержек, в любое удобное для программы время. Второй процесс - вызываемая по таймеру с частотой 20 Гц подпрограмма, которая смотрит, какие изменения произошли в буфере, и эти изменения уже передает на LCD-индикатор по его медленной шине. По поводу выделения буфера вроде все понятно - нужен блок памяти, равный размеру видеопамяти индикатора. Сложнее сделать отслеживание изменения буфера, чтобы оно работало эффективно. Это можно сделать по-разному - например, выделить для каждой строки индикатора флаг, который должна устанавливать программа, записывающая информацию в буфер (первый процесс). Подпрограмма, которая анализирует изменения в буфере (второй процесс) будет эти флаги считывать и сбрасывать по мере передачи информации в индикатор. Наверное, самый простой по реализации и самый быстрый вариант - выделить 2 одинаковых буфера. В первый буфер пишет данные первый процесс, а второй процесс сравнивает эти 2 буфера - там, где данные отличаются, там и произошли изменения. Эти изменения передаются на индикатор, и второй буфер обновляется (приводится в соответствие с первым буфером). [Ссылки] 1. Описание на монохромный графический индикатор WinStar WG240128B: WG240128B site:winstar.com.tw. |