Эффективная работа с графическим индикатором |
Написал microsin | |
01.03.2009 | |
Графические индикаторы (обычно LCD черно-белый или цветной) имеют последовательный или последовательно/параллельный интерфейс, через который на индикатор передается графическая информация, команды по управлению индикатором, а также считывается статус индикатора (готов ли он к приему информации и т. д.).
Наличие шины обмена с индикатором замедляет работу с ним и требует непроизводительных затрат от процессора - вставка циклов ожидания, пока индикатор не будет готов к приему информации, формирование требуемых временнЫх диаграмм на интерфейсе индикатора (согласно протоколу обмена, описаному в даташите на индикатор). Прямая работа с индикатором (вывод на шину информации, когда нужно что-то нарисовать на экране) неэффективна по нескольким причинам:
Для перечисленых условий наиболее оптимален (с точки зрения загрузки процессора и визуальной скорости работы для пользователя) следующий принцип работы с индикатором: Теперь немного комментариев. Вывод индикатор разбивается на 2 раздельных по времени и независимых друг от друга процесса. Первый процесс просто пишет в сверхбыстрый буфер данные, когда надо что-то нарисовать - это делает обычная программа в фоновом режиме (основное тело main), и делает это очень быстро, без задержек, в любое удобное для программы время. Второй процесс - вызываемая по таймеру с частотой 20 Гц подпрограмма, которая смотрит, какие изменения произошли в буфере, и эти изменения уже передает на LCD-индикатор по его медленной шине. По поводу выделения буфера вроде все понятно - нужен блок памяти, равный размеру видеопамяти индикатора. Сложнее сделать отслеживание изменения буфера, чтобы оно работало эффективно. Это можно сделать по-разному - например, выделить для каждой строки индикатора флаг, который должна устанавливать программа, записывающая информацию в буфер (первый процесс). Подпрограмма, которая анализирует изменения в буфере (второй процесс) будет эти флаги считывать и сбрасывать по мере передачи информации в индикатор. Наверное, самый простой по реализации и самый быстрый вариант - выделить 2 одинаковых буфера. В первый буфер пишет данные первый процесс, а второй процесс сравнивает эти 2 буфера - там, где данные отличаются, там и произошли изменения. Эти изменения передаются на индикатор, и второй буфер обновляется (приводится в соответствие с первым буфером). [Ссылки]
1. http://www.winstar.com.tw/products_detail_ov.php?lang=ru&ProID=72 |
|
Последнее обновление ( 04.01.2010 ) |