1、引言
在嵌入式图形应用系统中,当 CPU 执行帧缓冲渲染操作时,建议使用数据缓存(DCache)来提高系统性能,但使用 Cortex-M7 执行帧缓冲处理时有时可能会遇到数据不一致导致的花屏问题。
2、问题描述
要避免 DCache 引起的数据不一致问题,可将帧缓冲区域缓存属性配置为透写模式(Write-through)。透写模式易于管理,无需通过软件执行缓存维护,对于数据一致性更安全,但它会对帧缓冲区生成大量单次写入操作,可能会影响整体系统性能。为了更高的性能,可以把帧缓冲区配置成 Normal write-back, write and read allocate(TEX=1, C=1, B=1)模式,简称 WBWA,关于根据 TEX, C, B, and S 参数来配置不同的MPU 属性,可以参考 PM0253 Table 91. TEX, C, B, and S encoding 表格。但 TouchGFX在执行完图形渲染操作后如果没有执行刷新 DCache 操作,可能会产生部分花屏现象。
3、问题分析与定位
通过查看生成的 TouchGFXHAL.cpp,会看到相关提示信息,每当 TouchGFX 引擎执行完渲染操作时都会调用 flushFrameBuffer 函数,以通知 TouchGFX 框架已执行刷新。
如果帧缓冲区被配置成 WBWA 模式,Write back 模式在数据更新时只写入 Cache,这样做的优点是速度快;但如果数据还未同步到物理内存时,LTDC(或其他主机)就对此内存进行访问,则可能会引发数据不一致问题,进而产生部分花屏现象。
4、问题解决
当执行完 flushFrameBuffer 之后,需要调用 SCB_CleanInvalidateDCache()函数,该函数的作用是 Clean & Invalidate DCache,添加该函数后花屏问题消失。
5、小结
出现花屏的问题可能多种多样,对于由于数据不一致导致的花屏,可以通过添加以上代码解决。在有多主设备访问同一内存区域的场景下,也需要注意类似问题。
730