1、引言
在嵌入式圖形應用系統中,當 CPU 執(zhí)行幀緩沖渲染操作時,建議使用數據緩存(DCache)來提高系統性能,但使用 Cortex-M7 執(zhí)行幀緩沖處理時有時可能會遇到數據不一致導致的花屏問題。
2、問題描述
要避免 DCache 引起的數據不一致問題,可將幀緩沖區(qū)域緩存屬性配置為透寫模式(Write-through)。透寫模式易于管理,無需通過軟件執(zhí)行緩存維護,對于數據一致性更安全,但它會對幀緩沖區(qū)生成大量單次寫入操作,可能會影響整體系統性能。為了更高的性能,可以把幀緩沖區(qū)配置成 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在執(zhí)行完圖形渲染操作后如果沒有執(zhí)行刷新 DCache 操作,可能會產生部分花屏現象。
3、問題分析與定位
通過查看生成的 TouchGFXHAL.cpp,會看到相關提示信息,每當 TouchGFX 引擎執(zhí)行完渲染操作時都會調用 flushFrameBuffer 函數,以通知 TouchGFX 框架已執(zhí)行刷新。
如果幀緩沖區(qū)被配置成 WBWA 模式,Write back 模式在數據更新時只寫入 Cache,這樣做的優(yōu)點是速度快;但如果數據還未同步到物理內存時,LTDC(或其他主機)就對此內存進行訪問,則可能會引發(fā)數據不一致問題,進而產生部分花屏現象。
4、問題解決
當執(zhí)行完 flushFrameBuffer 之后,需要調用 SCB_CleanInvalidateDCache()函數,該函數的作用是 Clean & Invalidate DCache,添加該函數后花屏問題消失。
5、小結
出現花屏的問題可能多種多樣,對于由于數據不一致導致的花屏,可以通過添加以上代碼解決。在有多主設備訪問同一內存區(qū)域的場景下,也需要注意類似問題。