RootCause深度分析:为什么DCache常会导致LCD显示异常(数据一致性问题)

问题描述:

很多具备Dcache的 LCD显示设备,在MCU程序设计中,经常会发生由于使用DCache引起的数据错误/混乱等问题,导致LCD显示异常,例如出现花屏、页面显示错位、屏幕显示失真等现象。

这都是属于数据一致性问题

既Cache与外部存储中的数据不一致,会导致core(软件)与硬件模块(例如PXP, eLCDIF)之间配合失败,也会导致不同软件函数间协调失败(比如需要判断flag的)。

接下来深度分析一下,从根本上理解,才能今后尽量规避这类issue~

L1/L2 Cache简介

以ARM Cortex-M7 举例:
在这里插入图片描述

• L1,L2 Cache指的都是CPU的缓存,也叫一级/二级缓存,他们比内存快,但是很昂贵,所以用作缓存
• CPU查找数据的时候首先在L1,然后看L2,找到数据了就叫命中,如果都没找到(未命中),再去访问内存

Cortex-M7 架构图如下:
在这里插入图片描述

问题分析:

数据不一致问题是一个比较常见的嵌入式开发issue,因为外部设备memory操作(如HyperRAM、Flash、DMA)对于CPU来说也是不透明的,外部设备操作导致内存中数据更新,对于CPU来说是完全不可见的。反之亦然,CPU写入数据到缓冲区,其实是写到了cache,还未写入到外部memory (既cache和外部memory数据不一致)

而在我们的案例中,RootCause正是由于HyperRam与Cache的数据不一致,导致MCU更新LCD 的Framebuffer有误,产生LCD显示异常现象。

再细节一点,就是由于HyperRAM速率和LCD刷新频率不协调,并且由于硬件原因,这两个速率可调整的范围较小,无法完美融合,这些问题导致Framebuffer数据更新不及时,既导致cache中的数据不能及时被更新到HyperRAM,既Framebuffer 数据不能正常更新,发生LCD显示页面花屏、错位等。

这里的数据流是:页面显示过程中,MCU将要变更的Framebuffer数据先写到Cache,然后通过cache 写入到对应HyperRAM地址,而LCD引擎只通过获取HyperRAM里的Framebuffer某一起始地址数据进行显示

在这里插入图片描述

问题解决:

因为我们项目中使用GUI lib 是Embedded Wizard(EW),RAM扩展了HyperRAM,所以在代码编程角度,有以下解决思路:

  1. EW刷新UI后, clean 一次 Dcache,强制使其保持数据一致性
  2. 将LCD Buffer中DMA操作的数据设置成NonCacheble的
  3. 将Dcache关掉

实际应用中,由于第3条关掉Dcache后,我们的LCD显示和操作都会变很慢,所以不能使用

所以最终使用了1、2两种方案结合解决该问题:

如何编程:

在刷新UI页面时,保持Dcache数据一致性可以通过调用Cache 提供的功能性API Lib。
例如在NXP平台,可以调动如下API:

Invalide

首先是Invalide, 强制使cache中的内容无效(相当于invalidate会丢弃cache里的数据,下面会介绍原理)

可以调用:

  • L1CACHE_InvalidateDCacheByRange()

注意Invalidate操作的地址需要 32-byte对齐

  • 在EW每次Fill data时将Dcache对应内容先Invalid,在End时候做Clean,保持一致性:

在这里插入图片描述
在这里插入图片描述

L1CACHE_InvalidateDCacheByRange()里其实调用的的SCB_InvalidateDCache_by_Addr()

完整调用栈如下:
在这里插入图片描述

Clean

Clean操作会将cache中尚未写入到主存中的数据强制写到主存(既将cache和外部存储数据刷新一次, 下面会介绍原理)

通过调用:

  • L1CACHE_CleanDCacheByRange()

在这里插入图片描述
完整调用栈如下:
在这里插入图片描述

HyperRAM:

因为我们项目还用到了HyperRam,所以在读取HyperRam上的Frambuffer更新到LCD后,也需要将这段存放数据的内存进行clean cache操作:

在这里插入图片描述

Cache clean/invalidate 操作原理

ARM Cache官方文档标注如下:
在这里插入图片描述
通过以上说明,可以得出结论:

clean:将cache中尚未写入到主存中的数据强制写到主存。(可以重建cache与主存之间的一致性,写入后会把cache中的Dirty flag清零)

invalidate:== flush,将cache中的invalid标志位设置为1/0,使本cache中的内容无效。(相当于invalidate会丢弃cache里的数据。)

如下描述
在这里插入图片描述

实际代码调用栈示例:
在这里插入图片描述

在这里插入图片描述

LCD显示异常常见原因

LCD图像位移

LCD显示在水平方向发生位移,或者在上面或底部有一条几个像素的彩色、白色或黑色条纹。一般来说,出现这种情况,都是因为初始化参数设置不对,和行同步或者场同步信号有关。

显示位置有位移或者错位,就检查LCD模组和CPU上的LCD控制器的行同步与场同步信号的宽度、前后延时、极性的匹配。最可能的就是回扫的前后延时时间不匹配。

另外,这种情况通常错位不会很多,如果出现错位了一半的图像之类的情况,通常就是别的原因造成的了。而且有时候,有的LCD的行信号、场信号的设置还和LCD驱动芯片的部分电压参数的取值设置有关。

LCD图片错位、叠加、重复常见原因

LCD显示上大范围的图像出现错位、叠加或者重复,出现这种情况一般不会是行同步或者场同步信号的延时引起的,基本可以排除这方面的影响。

可以检查下抽样等功能的参数是否正常,还有就是因为LCD的硬件平台不同,而在时序或者时钟频率上存在差异引起的。碰见这种情况首先应该做的就是先仔细计算DMA传输参数。其它的情况要具体问题具体分析。


在这里插入图片描述

博主热门文章推荐:

一篇读懂系列:

LoRa Mesh系列:

网络安全系列:

嵌入式开发系列:

AI / 机器学习系列:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HowieXue

求打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值