当前位置: 首页 > news >正文

工作笔记-----ICache对中文显示的影响问题

工作笔记-----ICache对中文显示的影响问题

@@ Author:明月清了个风

@@ Date:2025.10.7

@@ PS:在开发LCD驱动程序的过程中遇到的一个中文显示问题,硬件为STM32H563,记录现象和解决方法,以供参考

@@ Version:First published date 2025.10.7

现象回顾:ICache 对中文显示的影响

使用 LCD 显示中文时,未开启 ICache(指令缓存)会导致中文无法显示,但代码不报错;而开启 ICache 后一切正常,同样存储在 Flash 中的图片数据(更大的 const 数组)却能正常显示。

在 STM32H563 上开发 LCD 显示功能时,发现一个特殊现象:

  • 中文显示依赖字库(const 数组存储在 Flash),未开启 ICache 时无法显示,无报错信息;
  • 开启 ICache 后,中文显示恢复正常;
  • 同样以 const 数组形式存储在 Flash 中的图片数据,无论是否开启 ICache 都能正常显示。

这一现象涉及 STM32H5 的存储架构、缓存机制及数据访问模式的底层逻辑,下面逐一解析。

核心原因 1:ICache 与 Flash 访问效率的关联

STM32H563 作为高性能 MCU,主频最高可达 250MHz,但其内置 Flash 的物理读取速度无法直接匹配 CPU 高频访问需求。ICache(指令缓存)的作用正是弥补这一差距:

  • 未开启 ICache 时:CPU 每次访问 Flash 中的数据(如中文字库)都需直接读取 Flash 芯片,而 Flash 读取存在固定延迟(尤其是高频模式下需配置多个等待周期)。对于频繁访问的场景,这种延迟会导致数据无法及时传输到 LCD 控制器。

  • 开启 ICache 时:ICache 会缓存最近访问的 Flash 数据(包括指令和常量),后续访问相同数据可直接从高速缓存读取,大幅降低访问延迟,确保字库数据能实时供给 LCD 显示。

中文字库作为高频访问的常量数据,对 Flash 访问效率极其敏感,因此成为 ICache 开关影响的“重灾区”。

核心原因 2:中文与图片的访问模式差异

同样是存储在 Flash 中的 const 数组,中文与图片的显示差异本质上源于访问模式的不同

特性中文字库(中文显示)图片数据(图片显示)
数据单元小字模(如 16x16 字模仅 32 字节)连续像素块(通常数十 KB 至 MB)
访问方式离散随机访问(频繁切换字模地址)连续顺序访问(从起始到结束不间断)
访问频率极高(每个汉字需逐行解析字模)中等(一次性连续传输)
  • 图片的连续访问优势:Flash 控制器内置“预取缓冲区”,可自动预加载后续连续数据。图片的连续访问模式能充分利用这一机制,即使无 ICache,也能通过预取优化减少延迟,满足显示需求。

  • 中文的离散访问劣势:显示一行文字需频繁切换不同字模的地址(如从“你”到“好”),属于随机离散访问。此时预取缓冲区失效,每次访问都需等待 Flash 响应,延迟累积导致数据传输中断,最终无法显示。

验证与解决方案

若需进一步验证上述原理,可通过以下方法测试:

方法 1:强制字库存储到 SRAM

将中文字库从 Flash 移至 SRAM(利用 section 属性),避开 Flash 访问延迟:

// 强制中文字库存储到 SRAM 的 .data 段
unsigned char chinese_font[] __attribute__((section(".data"))) = {// 16x16 "你"字模0x00, 0x00, 0x23, 0xF8, 0x12, 0x08, ...,// 16x16 "好"字模0x00, 0x00, 0x7F, 0xFC, 0x01, 0x00, ...
};

此时即使关闭 ICache,因 SRAM 访问速度远高于 Flash,中文也能正常显示(需注意 SRAM 空间是否充足)。

注意这里字模数据就不能是const了,否则会报错,const类型是存储在.rodata段的。

方法 2:保持 ICache 开启

STM32H5 系列在高频场景下,开启 ICache 是官方推荐的最佳实践:

  • 无需修改代码,直接在初始化时使能 ICache:
    HAL_ICache_Enable(); // 使能指令缓存
    
  • 既能保证中文显示正常,又能提升整体代码执行效率,且不占用额外 SRAM。

总结

STM32H563 中“中文显示依赖 ICache”的现象,本质是数据访问模式与 Flash 效率不匹配的结果:

  • 中文显示的离散、高频小字模访问对延迟极其敏感,依赖 ICache 消除 Flash 读取延迟;
  • 图片的连续大块访问可通过 Flash 预取机制优化,对 ICache 依赖较低。

开发中建议保持 ICache 开启,既能充分发挥 STM32H5 的高性能,又能避免类似兼容性问题。理解存储访问特性与缓存机制的关联,能帮助我们更高效地调试嵌入式系统中的“玄学”问题。

http://www.dtcms.com/a/453127.html

相关文章:

  • 什么是 Maven?关于 Maven 的命令、依赖传递、聚合与继承
  • nat静态地址转化
  • 计算机网站开发要考什么证竞价培训班
  • 《算法与数据结构》第七章[算法3]:图的最小生成树
  • 文科和理科思维差异:推演与归纳
  • 雨雪“开关式”监测:0.5秒精准响应,守护户外安全
  • 做文化传播公司网站手机建立网站
  • HTML的本质——网页的“骨架”
  • 徐州双语网站制作wordpress 外链视频
  • React 快速入门:菜谱应用实战教程
  • 网站备案和域名备案网页源码app
  • Tomcat本地部署SpringBoot项目
  • 大模型开发 - 04 QuickStart_DeepSeek 模型调用流程源码解析:从 Prompt 到远程请求
  • 怎么把在微企点做响应式网站深圳专业网站建
  • 认识三极管
  • gRPC从0到1系列【23】
  • Element Plus 完整教程:从背景到实践
  • Qt编写上下界面切换效果/前进到下一个界面/后退到上一个页面/零件工艺及管理设计系统
  • 第3章 多线程服务器的适用场合与常用编程模型
  • 网站开发什么课程佛山建站模板制作
  • Lua语法(2)
  • npm、npx、pnpm 深度解析:从原理到实战的全方位指南
  • Qt Qml Drag and Drop-鼠标拖动添加组件
  • 神经网络之为什么回归任务的输出是高斯分布的均值
  • 《深入理解 Django 中间件:请求-响应生命周期与执行顺序全解析》
  • HC32项目搭建
  • 台式真空共晶炉口碑企业
  • 网站开发宣传标语网站建设基本情况
  • [效率]学习哔哩哔哩视频的的笔记|对于书签的想法思考
  • 网站一级页面标题怎么做wordpress js库