Встроенный «умный» персонаж ЖК-драйвер. Это хорошая идея?

StackOverflow https://stackoverflow.com/questions/2892407

Вопрос

У меня есть встроенный проект, над которым я работаю, и я в настоящее время кодирующую персонаж ЖК-драйвер.

На данный момент ЖК-драйвер поддерживает только «тупое» письмо. Например, давайте скажем, строка 1 имеет какой-то текст на нем, и я звоню на функцию, которая пишет в строку. Функция просто будет стремиться к началу линии и написать текст (плюс достаточно пробел, чтобы стереть все, что было прошедшим написано).

Это хорошо и хорошо, но я чувствую, что это ужасно неэффективно иногда, поскольку некоторые строки просто: «Некоторые чтение: какое-то значение»

А не «грубая сила», заменяя всю строку, я хотел разработать какой-код, который выяснил бы лучший способ к Обновить информация о ЖК-дисплее.

(Так же, как фон, требуется 2 байта, чтобы искать любую позицию Char. Я могу начать писать строку)

Моя идея состояла в том, чтобы сначала была петля. Этот цикл сравнил бы вход к последней записи, а при этом он охватил бы две вещи:

A: Соберите все различия между последней записью и входом. Для каждого смежного сегмента (будь то же или разные) добавьте два байта в счет байта. Это упоминается в B, чтобы определить, потрачем ли мы последовательную пропускную способность.

B: Цикл определит, что это действительно умная вещь. Если мы в конечном итоге используем больше байтов для обновления строки, чем «грубую силу» в строке, то мы должны просто вернуться и позволить методу грубой силы взять на себя. Мы должны выйти из функции Smart Write, как только это условие будет выполнено, чтобы избежать трафарета времени.

Следующая часть функции примет все различия, стремиться к нужным символам на ЖК-дисплее и писать их.

Таким образом, если у нас есть строка, как это уже на ЖКД: «Текущая температура: 80F», и мы хотим обновить его на «Текущая температура: 79F»

Функция пройдет и увидит, что потребуется меньше пропускной способности, чтобы просто стремиться к «8» и написать «79». «7» будет покрывать «8», а «9» охватит «0». Таким образом, мы не тратим время, пишу всю строку.

Это похоже на практическую идею?

Это было полезно?

Решение

Это не имеет никакого смысла оптимизировать это. Передача 20 байтов при 9600 боудах принимает оборудование 21 миллисекунды. И принимает программное обеспечение несколько микросекунд. Достаточно быстро, чтобы иметь возможность обновить дисплей быстрее, чем человеческий глаз, который может когда-либо воспринимать в 2 раза. И не похоже, вам нужна «пропускная способность», нет никаких дополнительных данных, которые я могу подумать хочу мультиплексировать на последовательном канале.

Другие советы

Предполагая, что смещение в отображении авто-приращений, и это единственная запись для вывода каждого последовательного символа, я был бы склонен просто написать всю строку дисплея каждый раз, если нет конкретной задачи производительности, которую вы пытаетесь исправить. То есть: ненужные оптимизации являются потенциальными будущими головными болями в будущем, и ваше время «оптимизация» лучше потратить на то, что на самом деле влияет на производительность общего приложения.

Примечание. Если обновление дисплея на самом деле является приложением, влияющим на проблему с производительностью, у вас, вероятно, ощущение того, насколько быстрее его должно быть .... Тогда вы (а не нами) могут стать вашим собственным руководством к тому, сколько достаточно оптимизации.

Реализация, которую вы планируете, кажется, слишком сложны для проблемы. Все необходимое сравнение может фактически замедлить операцию, если процессор не будет быстро.

Если вам нужно только обновить, например, только значение температуры, вы должны просто обновить значение температуры и игнорировать фиксированные тексты. Вам необходимо иметь координаты в памяти для каждого поля, которая должна быть обновлена. Затем просто переместите положение записи в это место и напишите значение. Вот как я обычно делаю это.

Если обновление экрана все еще слишком медленно, вы можете рассмотреть возможность использования языка сборки. Например, несколько лет назад я сделал программное обеспечение для устройства наручного часа с помощью ЖК-дисплея TOT MATRIX. Обновление дисплея было слишком медленным (почти секунду, чтобы обновить весь дисплей, например, при прокрутке), поэтому я написал только наименьший уровень рутины в сборке (замена около 20 строк C с 30 линиями сборки). Полученную функцию было половину размера и в 3 раза быстрее, чем оптимизированная функция C, и теперь скорость обновления дисплея была адекватной.

Таким образом, мы не тратим время, пишу всю строку.

Вы не должны тратить много времени вообще, безусловно, меньше, чем время, чтобы сделать всю эту проверку.

Какова связь с ЖК-дисплеем? SPI / I2C / Parellel?

Что бы это ни было, если DMA поддерживается SOC на интерфейсе, используйте его.

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

Используйте либо процедуру прерывания, чтобы обработать отправку каждого байта, либо использовать подход «гибридный», если вы сможете контролировать маршрутизацию прерывания (выполняют это для экономии энергии). Theres интересная запись здесь

Для дисплея персонажа этот вид оптимизации обновления - это то, что curses Библиотека была все о. Вернувшись в день, когда мы говорили с большими компьютерами с глупыми терминалами и телефонными линиями в 1200 бодах или менее, часто было трудно обновить экран достаточно быстро, чтобы программы были интерактивными через медленную модемную ссылку. Библиотека Curses сделала ее практично, сохраняя кэш каким-то, что должно быть на экране пользователя и отправка близкого к оптимальному количеству команд перемещения и стирания, перемеженные с обычными символами для отображения. Это требовалось, чтобы терминал поддерживал некоторую форму позиционирования курсора.

Библиотека проклятий живет в паре форм и NCURSES, Например, хорошо известно, открытый источник и лицензирован под GPL.

В принципе, вы можете адаптировать NCurses, чтобы поговорить с вашим контроллером дисплея и позволить ему сделать всю тяжелую работу.

Открытый вопрос заключается в том, стоит ли это усилия. В 9600 Baud вы можете отправить 960 символов в секунду. Это достаточно быстро, чтобы полностью перекрасить 4 строки на 20 столбцов LCD 12 раз в секунду. Поэтому, если вы не бегаете на рис или на ноте, где вам, возможно, придется реализовать, что UART в программном обеспечении и нуждается в циклах, чтобы на самом деле сделать что-то полезное, вероятно, будет малое преимущество, чтобы быть слишком умным.

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

Текстовый режим ЖК-дисплей

Я согласен с другими, если вы пишете в текстовом режиме, на самом деле нет никакой точки, делая это на уровне символов. Время обработки, необходимое для расчетов, скорее всего, будет займет время до тех пор, пока на самом деле написать материал.

Кроме того, уровень персонажа будет пережевывать немного памяти, как вам нужно будет буфер, что в данный момент отображается (т. Е. Что было в последнее время).

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

Сокращение дизайном

Вместо того, чтобы оставить это до драйвера для достижения, вы можете уменьшить время записи на уровне приложений, убедившись, что вы только написали вещи, которые меняются. Это может быть достигнуто путем обозначения определенных значений клетки, по сути, выполняя следующее:

char text[50];
int val;
...
lcd_print("The count is ", 0, 0); // Print static text at the coords (0,0)
sprintf(text, "%d", val);
lcd_print(text, 0, 13); // Print changing text at (0,13)
...
sprintf(text, "%d", val);
lcd_print(text, 0, 13); // Print changing text at (0,13)

И не:

char text[50];
int val;
...
sprintf(text, "The count is %d", val);
lcd_print(text, 0, 0); // Print all text at the coords (0,0)
...
sprintf(text, "The count is %d", val);
lcd_print(text, 0, 0); // Print all text at the coords (0,0)

Режим графики ЖК-дисплей

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

Письмо каждого символа на основе на каждого персонажа требуется вручную перемещение курсора записи на линию пикселей, предполагая ваш рисунок горизонтально, а затем сверху вниз. Этот шаг можно удалить, написав все верхние строки всех символов на текстовой строке или даже лучше измененного подмножества (то есть «ABC», а затем отдельно «I» в «XXXDEFGHX» -> «abcdefghi»).

Конечно, точное сохранение с использованием последнего метода будет зависеть от того, сколько пиксельных линий составляют высоту символа. Чем больше строк, тем больше сохранение (потому что вы обязаны перемещать курсор более раз).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top