微雪RP2040微控制器开发板带1.28 LCD实现LVGL高效率绘图测试
先看最终效果

看着很简单吧?
但就这么个简单的演示,我踩了无数的坑。
本来想仔细说说的,
但是作为一个有100多年开发经验的程序员,必然是选择偷懒。
只说几个重点的吧:
这个演示用的是lvgl负责绘图,只需要写个“简单”的回调就能支持新设备,就是这段my_disp_flush。

然后,这段简单的代码花了我好几周时间,因为刚接触设备开发,当然是从例程开始。
例程能有什么问题呢?最大的问题就是性能!
原始例程里的代码我试着直接用,结果发现不要说每秒30帧,连10帧都无法保证。
仔细看了各种文档资料,阅读了几遍源代码,发现一些“小”问题。
看这段清屏程序,先不说这种用屏幕等大数组做清屏效率高低,就这句,交换高低字节?

这看着就有点不正常,研究了屏幕驱动文档发现,它本该用16位接口传输像素数据,但是它用的居然是8位传输代码。
小数据量无所谓,清屏这种像素颜色相同,可以提前反转原始颜色的也无所谓,问题是真实环境下每像素反转字节序?
那就效率太低了,这是在处理器本不富裕的情况下雪上加霜啊。
后来阅读了代码和显示驱动的开发手册,发现这个问题来自于8位传输,显示驱动的开发手册里明确说明应该用16位传输的,所以我注释了字节反转,换用16位传输(源代码没带,我自己写的)测试,果然一切正常。


然后是演示代码采用 “绘制” “传输” 循环,而传输速度是每秒40兆位,也就是5兆字节。
而在后续测试中,读取出的实际速度还要低一点点。
每屏幕的数据是112.5K字节,也就是说在不绘图的情况下,传输满屏数据本身最高也就40多帧。
所以用DMA传输是必须的,在DMA传输像素数据的时候,绘图可以继续。

我还尝试了利用双核来分开处理绘图和传输,但是想了想没什么必要,可以把另一个核心留着做点别的事。
至于其他代码,都是我现在做实验的,可以无视
另外,作为一个有100多年开发经验的程序员,注释就不要想了,必然是没有(主要是懒)
有问题可以留言,但我未必回答的了,因为我是初学 附上代码,请自取,纯纯的C代码,在树莓派上用vscode编写调试, 链接: https://pan.baidu.com/s/1BMvz-oaHj_JPW32D0CeOzg?pwd=rffx 提取码: rffx