我有一个正在进行的嵌入式项目,目前正在编码角色LCD驱动程序。

目前,LCD驱动程序仅支持“愚蠢”的写作。例如,假设第1行上有一些文本,我会呼叫写入该行的函数。该函数将简单地寻求线条的开头并编写文本(加上足够的空格以擦除上次写的任何内容)。

这是很好的,但是我感觉到有时候它效率非常低,因为有些行简称:“某些阅读:某个值”

我想开发一些代码,而不是“蛮力”代替整个行 更新 有关LCD的信息。

(作为背景,要寻找任何字符的位置需要2个字节。然后我可以开始编写字符串)

我的想法是首先有一个循环。该循环将输入与上一篇文字进行比较,并且这样做将涵盖两件事:

答:收集上一篇写入和输入之间的所有差异。对于每个连续段(相同或不同),将两个字节添加到字节数。在B中引用了这一点,以确定我们是否正在浪费串行带宽。

B:循环将确定这是否真的是一件明智的事情。如果我们最终使用更多的字节来更新线路,而不是“蛮力”行,那么我们应该返回并让蛮力方法接管。我们应该在满足此条件后立即退出智能写作功能,以避免浪费时间。

该功能的下一部分将占据所有差异,寻求LCD上所需的字符,然后写下它们。

因此,如果我们已经在LCD上有这样的字符串:“当前温度:80F”,并且我们希望将其更新为“当前温度:79F”

该功能将通过,并发现简单地寻找“ 8”并写“ 79”所需的带宽所需的带宽。 “ 7”将覆盖“ 8”,“ 9”将覆盖“ 0”。这样,我们就不会浪费时间写整个字符串。

这似乎是一个实用的想法吗?

有帮助吗?

解决方案

优化这一点没有任何意义。在9600 Baud的传输20个字节以21毫秒为单位。并将该软件几微秒。足够快,能够比人眼更快地更新显示屏。 'd想要在串行通道上复用。

其他提示

假设显示自动提示中的偏移量,并且是单个写入以输出每个连续字符的单个写入,则除非您试图解决的特定性能问题,否则每次都只能写整个显示行。 IE:不必要的优化是潜在的未来维护头痛,而您的时间“优化”将更好地用于实际影响整体应用程序的性能。

注意:如果显示更新实际上是一个影响性能问题的应用程序,那么您可能会感觉到它需要的速度要快。...您(而不是我们)可以成为您自己的优化足够的指南。

您计划的实施似乎太复杂了。如果处理器不快,则所有所需的比较实际上可能会减慢操作的速度。

如果您只需要更新例如温度值,则应只需更新温度值并忽略固定文本即可。您需要将需要更新的每个字段的内存中的坐标。然后只需将写入位置移至该位置并写入值即可。这就是我通常这样做的。

如果屏幕更新仍然太慢,则可以考虑使用汇编语言。例如,几年前,我为带有点矩阵LCD显示器的手表类型设备制作了软件。显示更新太慢了(例如,在滚动时更新整个显示),因此我仅编写了组装中最低的级别例程(用30行组件替换约20行C)。最终的功能是大小的一半,比优化的C函数快3倍,现在显示更新速度足够了。

这样,我们就不会浪费时间写整个字符串。

您不应该浪费太多时间,肯定比进行所有检查所需的时间要少。

LCD的连接是什么? spi/i2c/parellel?

不管是什么,如果DMA受到界面上SOC的支持,请使用它。

如果没有,您不应该在TX字节之间等待,特别是如果处理器的指令时钟比数据链接的时钟高得多。这可能是正确的,因为我与我合作过的大多数角色显示器具有低最大时钟规格。

如果您可以控制中断路由(正在为节省功率),请使用中断例程来处理发送每个字节或使用“混合”方法。有一个有趣的写作 这里

对于角色显示,这种更新优化是 curses 图书馆全都是关于。过去,当我们与1200 Baud或更少的哑端和电话线的大型计算机进行交谈时,通常很难快速更新屏幕以使程序在慢速调制解调器链接上感到互动。诅咒库通过保留用户屏幕上应该存在的内容,并发送接近最佳的移动和擦除正常字符以显示显示的最佳命令,从而使其实用。它确实要求终端支持某种形式的光标定位。

诅咒图书馆以几种形式生活, ncurses, 例如,是众所周知的,开源的,并在GPL下获得许可。

原则上,您可以调整ncurses与您的显示控制器进行交谈,并让它完成所有艰苦的工作。

开放的问题是是否值得付出努力。在9600波特时,您可以每秒发送960个字符。这足够快,可以完全重新粉刷4线乘20列LCD每秒12次。因此,除非您在图片或Attiny中运行,否则您可能必须在软件中实现该UART,并且需要周期才能实际做一些有用的事情,否则太聪明了,可能几乎没有优势。

也就是说,一次绘制固定的文本,而只是更改显示的值时,通常仍然很有意义。

文本模式LCD

我同意别人的观点,如果您是在文本模式下写的,那么在角色层面上确实没有任何意义。进行计算所需的处理时间可能需要花费实际编写内容的时间。

此外,每个字符级别将通过一些内存来咀嚼,因为您需要缓冲当前显示的内容(即最后写的内容)。

您可以通过将屏幕分为几节(最方便),然后在该行更改时进行标记来简化过程。如果要写入屏幕的存储器缓冲区,并在以后将其同步(例如,在定时中断)。

通过设计减少

您可以通过确保仅写更改的内容来减少驱动程序的驱动程序。这可以通过指定特定的价值单元格来实现,从本质上进行以下操作:

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)

图形模式LCD

另一方面,如果您的写作过程非常昂贵,例如我的(约20个字节,在图形模式下绘制字符),那么在角色基础上节省时间将是有用的。您可以使用两种方案。首先是您所描述的,但是您也可能想考虑(如果使用图形模式)通过文本线缓冲水平像素线的概念。

按照每个字符编写每个字符,需要手动将写光标移动到像素线上,假设您的图形水平图纸,然后将其上下移动。可以通过在文本行上编写所有字符的所有上线,甚至可以更好地删除此步骤,或者甚至更改了一个更改的子集(即“ ABC”,然后在“ xxxdefghx” - >“ abcdefghi”中单独“ i”)。

当然,使用后一种方法的确切保存将取决于构成字符高度的像素线。线越多,节省越大(因为您需要移动光标更多次)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top