使用 LVGL 及 DMA2D 必须知道的事

LVGL 在我看了是一个中规中矩的界面库, 当你慢慢熟悉后会发现没有太多的惊喜,

运行效率一般, 图形处理会原生阻塞并占用一些CPU资源,

所以不适合华丽的界面设计,适合一些简单的界面切换,否则会对CPU带来较大开销,

 

另外,对于一些高端的单片机。 选择Lvgl反而会影响单片机中的gpu图形加速单元的发挥。 因为Lvgl只对很少的器件支持了图形加速,SM32的dma2d算不上gpu图形加速。所以如果用stm32的高端芯片,还是不太适合用lvgl,更适合st官方推出的touchgfx。

所以 LVGL 适合 那些没有GPU图形加速的中低端单片机,H7 系列就不适合,因为H7带 GPU加速

LVGL不支持,或者仅支持个别的厂家,  LVGL也就只适合做一些 小的项目,大项目不建议用LVGL,因为在复杂界面中,LVGL处理时比较吃CPU资源,小的项目界面简单 可以用。

有DMA2D 的 单片机 在LVGL中作用不大,能提升一点效率,但是LVGL的刷屏数据都是单片机CPU处理的,

我测试了STM32开启LVGL自带的DMA2D库, 没有明显变化。

 

lvgl中,就算使用DMA2D 它也是默认阻塞方式, 即使你希望启用   DMA2D在运行等待结束的过程中进行任务调度,那也不会加速它自己的图形处理速度,只是把CPU等待时间让了出来,这对多任务系统有一定帮助。但是感觉他自身的任务还在阻塞,并没有提高效率。这将成为整个系统的短板。

 

 

LVGL8 的 DMA2D 库 不是用中断模式写的,而是用阻塞查询模式实现的DMA2D

这个就很扯,经过在STM32H7上的初步比较测试 ,用不用DMA2D CPU占用率都差不多,

而且LVGL9 宣布不在主动支持ST的DMA2D ,说是优先给合作伙伴 提供GPU支持,
就是说只有ST提供经费作为合作伙伴才会继续支持。

就算志愿者 愿意贡献代码  作者也不会接受

https://github.com/lvgl/lvgl/issues/5555
 

db4a7eb88742429b85822a5e36012827.png

6c24a4bac2174c19ae233313688406a6.png

 

 

 

 

 

### DMA2DLVGL结合使用 #### 配置DMA2D支持 为了使DMA2D能够有效地加速图像处理操作,在STM32CubeMX中配置DMA2D外设是必要的。通过启用DMA2D并设置其参数来匹配LCD屏幕的需求,可以显著提高图形渲染效率[^1]。 对于具体的硬件平台如正点原子阿波罗 STM32F429而言,除了基本的DMA2D初始化之外,还需要确保该模块被正确集成到了项目当中。这通常涉及到修改`stm32f4xx_hal_conf.h`文件中的宏定义以激活相应的功能位[^2]。 ```c #define HAL_DMA2D_MODULE_ENABLED ``` #### 示例代码展示 下面给出一段简单的C语言代码片段,展示了如何利用DMA2D完成两个缓冲区之间的颜色转换任务: ```c // 初始化DMA2D void MX_DMA2D_Init(void){ hdma2d.Instance = DMA2D; // 设置模式为内存到内存传输 hdma2d.Init.Mode = DMA2D_M2M_PFC; hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565; if (HAL_DMA2D_Init(&hdma2d) != HAL_OK){ Error_Handler(); } } // 使用DMA2D执行色彩空间变换 void StartColorConversion(uint32_t* src, uint32_t* dst, int width, int height){ __HAL_LOCK(&hdma2d); hdma2d.LayerCfg[1].InputOffset = 0; hdma2d.LayerCfg[1].Alpha = 0xFF; hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_ARGB8888; hdma2d.LayerCfg[1].RedBlueSwap = ENABLE; hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; if(HAL_DMA2D_ConfigLayer(&hdma2d, 1)!= HAL_OK){ Error_Handler(); } if(HAL_DMA2D_Start(&hdma2d, (uint32_t*)src, (uint32_t*)dst, width,height )!= HAL_OK){ Error_Handler(); } while (__HAL_DMA2D_GET_FLAG(&hdma2d,DMA2D_FLAG_TC)== RESET); __HAL_UNLOCK(&hdma2d); } ``` 这段代码首先完成了DMA2D实例化对象(`hdma2d`)的相关属性设定,接着调用了`HAL_DMA2D_Init()`函数来进行初始化工作;之后定义了一个名为`StartColorConversion`的过程用来启动一次由源地址指向目标地址的颜色格式转换过程。 #### 性能优化建议 当考虑将DMA2D应用于LVGL框架下时,应该注意以下几点以便获得最佳性能表现: - **减少CPU干预**:尽可能让DMA控制器独立完成数据搬运作业,从而释放处理器资源给其他更重要的计算密集型任务。 - **批量处理请求**:如果存在多个连续的小规模绘图指令,则尝试将其合并成单次较大范围的操作提交给DMA引擎去执行。 - **合理规划缓存策略**:针对特定应用场景调整好内部SRAM分配方案以及外部SDRAM访问机制,避免不必要的带宽浪费现象发生。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值