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,所以在代码编程角度,有以下解决思路:

  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传输参数。其它的情况要具体问题具体分析。


博主热门文章推荐:

一篇读懂系列:

  • 一篇读懂无线充电技术(附方案选型及原理分析)
  • 一篇读懂: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显示异常(数据一致性问题)相关推荐

  1. LCD显示异常分析——开机闪现花屏【转】

    转自LCD显示异常分析--开机闪现花屏 最近在工作中,有同事遇到LCD开机瞬间会闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现. 其实这类问 ...

  2. LCD显示异常分析——撕裂(tear effect)

    概述 在上一篇<LCD显示异常分析--开机闪现花屏>中,我们一起分析了开机花屏的问题,在这一篇中,我将对LCD撕裂(tear effect)问题进行详细分析,以及给出这类问题的常用解决方法 ...

  3. 防止用户调整微信浏览器字体大小导致的显示异常

    防止用户调整微信浏览器字体大小导致的显示异常(加JS代码) // 下面这段代码,防止用户调整微信浏览器字体大小导致的显示异常 (function() {if (typeof WeixinJSBridg ...

  4. LCD 显示异常定位分析方法

    第一种情况: 进入kernel或android 后,如果LCM图像示异常,可以通过如下步骤来判断问题出现在哪个层面. step1:通过DMMS截图,来判断上面刷到LCM的数据是否有问题. 若DMMS获 ...

  5. LCD显示异常分析——开机闪现花屏

    概述 最近在工作中,有同事遇到LCD开机瞬间会闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现. 其实这类问题的原理分析并不难,只是在给别人解 ...

  6. linux笔记本无法识别显示器,为了解决笔记本外接显示器导致Ubuntu显示异常的问题,我做了这么多事情......

    好吧,其实我是标题党来的- 一篇解决实际问题的文章,顺便带你认识下一些Linux的命令以及简单的shell脚本编程- 问题描述: 系统版本:Ubuntu 18.04.4 LTS 我的笔记本电脑外接了一 ...

  7. web系统时区不一致导致时间显示异常的解决方案

    先说一下场景,一般在国内,我们都用的东八区时间,部署系统的时候,如果操作系统的时区也初始化为Asia/Shanghai,这样节点上所有的服务时区默认都会跟操作系统保持一致,用户访问系统页面时,展示的时 ...

  8. 产业链人士:LCD显示驱动芯片价格有望趋于稳定

    8月18日消息,据国外媒体报道,在汽车.消费电子等多领域芯片供不应求,芯片代工商产能普遍紧张的情况下,LCD显示驱动芯片的供应也受到了影响. 今年3月份,产业链方面的人士就透露,LCD面板需求强劲,拉 ...

  9. Memcached深度分析【zz】

    Memcached深度分析 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东西,相信 ...

最新文章

  1. 为什么大公司还在采用过时的技术?
  2. webview键盘自适应_苹果笔记本显示器键盘专利曝光:单按键可重新配置
  3. 关于js选项卡的一些问题
  4. sendmsg recvmsg函数
  5. mysql 批量替换 所有表_[收藏]批量替换一个数据库中所有表中所有记录
  6. Zookeeper启动闪退可能原因及解决方案
  7. django目录介绍
  8. werkzeug Request
  9. 一个关于 TensorFlow 的悲剧故事
  10. jQuery操作Form表单元素
  11. 【历史上的今天】5 月 31 日:Amiga 之父诞生;BASIC 语言的共同开发者出生;黑莓 BBM 停运
  12. numpy的squeeze函数和expand_dims函数
  13. 微信环境中扫描二维码下载APP(APK)文件的解决方案-自动跳转到手机默认浏览器(AppStore)打开
  14. 光纤专线与普通宽带区别(ASDL)
  15. 深度学习案例2:AlexNet网络识别14种鲜花
  16. 物联网平台是什么,怎么选择合适的物联网平台?
  17. Java -- 用文本文档写代码
  18. 计算机毕业设计ssm智创员工管理系统
  19. UTF-8编码方式汉字和英文各占据的字节数
  20. 三大统计学相关系数(pearson皮尔森、spearman斯皮尔曼、kendall肯德尔)

热门文章

  1. (5)美团面试题:HashMap1.7是如何形成死循环的(头插法导致的)?(最完整的配图讲解)
  2. Qt功能优化:Qt语音助手
  3. 2023款联想小新 Pro 14 锐龙版和独显版的区别
  4. 深度学习高遥感影像语义分割
  5. python:计算0~100之间所有的偶数之和与奇数之和
  6. 甲醛传感器的检测种类
  7. 邓丽君,王菲《清平调》
  8. 一名程序员的专利代理人之旅
  9. 为智能建筑设计物联网传感器桥
  10. 如何统计在同一商家的所有账单——微信和支付宝