RootCause深度分析:为什么DCache常会导致LCD显示异常(数据一致性问题)
DCache导致LCD显示异常RootCause深度分析
- 问题描述:
- L1/L2 Cache简介
- 问题分析:
- 问题解决:
- 如何编程:
- Invalide
- Clean
- HyperRAM:
- Cache clean/invalidate 操作原理
- LCD显示异常常见原因
- LCD图像位移
- 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,所以在代码编程角度,有以下解决思路:
- EW刷新UI后, clean 一次 Dcache,强制使其保持数据一致性
- 将LCD Buffer中DMA操作的数据设置成NonCacheble的
- 将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传输参数。其它的情况要具体问题具体分析。
博主热门文章推荐:
一篇读懂系列:
- 一篇读懂无线充电技术(附方案选型及原理分析)
- 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信
- 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)
LoRa Mesh系列:
- LoRa学习:LoRa关键参数(扩频因子,编码率,带宽)的设定及解释
- LoRa学习:信道占用检测原理(CAD)
- LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)
网络安全系列:
- ATECC508A芯片开发笔记(一):初识加密芯片
- SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
- 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
- AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例
嵌入式开发系列:
- 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
- IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
- Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
- Android底层调用C代码(JNI实现)
- 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
- Android/Linux设备有线&无线 双网共存(同时上内、外网)
AI / 机器学习系列:
- AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
- AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
- AI: 什么是机器学习的数据清洗(Data Cleaning)
- AI: 机器学习的模型是如何训练的?(在试错中学习)
- 数据可视化:TensorboardX安装及使用(安装测试+实例演示)
RootCause深度分析:为什么DCache常会导致LCD显示异常(数据一致性问题)相关推荐
- LCD显示异常分析——开机闪现花屏【转】
转自LCD显示异常分析--开机闪现花屏 最近在工作中,有同事遇到LCD开机瞬间会闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现. 其实这类问 ...
- LCD显示异常分析——撕裂(tear effect)
概述 在上一篇<LCD显示异常分析--开机闪现花屏>中,我们一起分析了开机花屏的问题,在这一篇中,我将对LCD撕裂(tear effect)问题进行详细分析,以及给出这类问题的常用解决方法 ...
- 防止用户调整微信浏览器字体大小导致的显示异常
防止用户调整微信浏览器字体大小导致的显示异常(加JS代码) // 下面这段代码,防止用户调整微信浏览器字体大小导致的显示异常 (function() {if (typeof WeixinJSBridg ...
- LCD 显示异常定位分析方法
第一种情况: 进入kernel或android 后,如果LCM图像示异常,可以通过如下步骤来判断问题出现在哪个层面. step1:通过DMMS截图,来判断上面刷到LCM的数据是否有问题. 若DMMS获 ...
- LCD显示异常分析——开机闪现花屏
概述 最近在工作中,有同事遇到LCD开机瞬间会闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现. 其实这类问题的原理分析并不难,只是在给别人解 ...
- linux笔记本无法识别显示器,为了解决笔记本外接显示器导致Ubuntu显示异常的问题,我做了这么多事情......
好吧,其实我是标题党来的- 一篇解决实际问题的文章,顺便带你认识下一些Linux的命令以及简单的shell脚本编程- 问题描述: 系统版本:Ubuntu 18.04.4 LTS 我的笔记本电脑外接了一 ...
- web系统时区不一致导致时间显示异常的解决方案
先说一下场景,一般在国内,我们都用的东八区时间,部署系统的时候,如果操作系统的时区也初始化为Asia/Shanghai,这样节点上所有的服务时区默认都会跟操作系统保持一致,用户访问系统页面时,展示的时 ...
- 产业链人士:LCD显示驱动芯片价格有望趋于稳定
8月18日消息,据国外媒体报道,在汽车.消费电子等多领域芯片供不应求,芯片代工商产能普遍紧张的情况下,LCD显示驱动芯片的供应也受到了影响. 今年3月份,产业链方面的人士就透露,LCD面板需求强劲,拉 ...
- Memcached深度分析【zz】
Memcached深度分析 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东西,相信 ...
最新文章
- 为什么大公司还在采用过时的技术?
- webview键盘自适应_苹果笔记本显示器键盘专利曝光:单按键可重新配置
- 关于js选项卡的一些问题
- sendmsg recvmsg函数
- mysql 批量替换 所有表_[收藏]批量替换一个数据库中所有表中所有记录
- Zookeeper启动闪退可能原因及解决方案
- django目录介绍
- werkzeug Request
- 一个关于 TensorFlow 的悲剧故事
- jQuery操作Form表单元素
- 【历史上的今天】5 月 31 日:Amiga 之父诞生;BASIC 语言的共同开发者出生;黑莓 BBM 停运
- numpy的squeeze函数和expand_dims函数
- 微信环境中扫描二维码下载APP(APK)文件的解决方案-自动跳转到手机默认浏览器(AppStore)打开
- 光纤专线与普通宽带区别(ASDL)
- 深度学习案例2:AlexNet网络识别14种鲜花
- 物联网平台是什么,怎么选择合适的物联网平台?
- Java -- 用文本文档写代码
- 计算机毕业设计ssm智创员工管理系统
- UTF-8编码方式汉字和英文各占据的字节数
- 三大统计学相关系数(pearson皮尔森、spearman斯皮尔曼、kendall肯德尔)