欢迎光临散文网 会员登陆 & 注册

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

2023-04-11 12:40 作者:SnowNova  | 我要投稿

先看最终效果

看着很简单吧?

但就这么个简单的演示,我踩了无数的坑。

本来想仔细说说的,

但是作为一个有100多年开发经验的程序员,必然是选择偷懒。

只说几个重点的吧:

这个演示用的是lvgl负责绘图,只需要写个“简单”的回调就能支持新设备,就是这段my_disp_flush。

my_disp_flush代码

然后,这段简单的代码花了我好几周时间,因为刚接触设备开发,当然是从例程开始。

例程能有什么问题呢?最大的问题就是性能!

原始例程里的代码我试着直接用,结果发现不要说每秒30帧,连10帧都无法保证。

仔细看了各种文档资料,阅读了几遍源代码,发现一些“小”问题。

看这段清屏程序,先不说这种用屏幕等大数组做清屏效率高低,就这句,交换高低字节?

字节序调换

这看着就有点不正常,研究了屏幕驱动文档发现,它本该用16位接口传输像素数据,但是它用的居然是8位传输代码。

小数据量无所谓,清屏这种像素颜色相同,可以提前反转原始颜色的也无所谓,问题是真实环境下每像素反转字节序?

那就效率太低了,这是在处理器本不富裕的情况下雪上加霜啊。

后来阅读了代码和显示驱动的开发手册,发现这个问题来自于8位传输,显示驱动的开发手册里明确说明应该用16位传输的,所以我注释了字节反转,换用16位传输(源代码没带,我自己写的)测试,果然一切正常。

16位传输

然后是演示代码采用 “绘制” “传输” 循环,而传输速度是每秒40兆位,也就是5兆字节。

而在后续测试中,读取出的实际速度还要低一点点。

每屏幕的数据是112.5K字节,也就是说在不绘图的情况下,传输满屏数据本身最高也就40多帧。

所以用DMA传输是必须的,在DMA传输像素数据的时候,绘图可以继续。

初始化LVGL时初始化DMA

我还尝试了利用双核来分开处理绘图和传输,但是想了想没什么必要,可以把另一个核心留着做点别的事。

至于其他代码,都是我现在做实验的,可以无视

另外,作为一个有100多年开发经验的程序员,注释就不要想了,必然是没有(主要是懒)

有问题可以留言,但我未必回答的了,因为我是初学 附上代码,请自取,纯纯的C代码,在树莓派上用vscode编写调试, 链接: https://pan.baidu.com/s/1BMvz-oaHj_JPW32D0CeOzg?pwd=rffx 提取码: rffx

微雪RP2040微控制器开发板带1.28 LCD实现LVGL高效率绘图测试的评论 (共 条)

分享到微博请遵守国家法律