1. 内存基础认知:触摸屏内存架构概览、RAM与Flash的区别、内存泄漏与内存碎片的概念
做触摸屏开发这些年,我见过太多项目栽在内存上。有的跑着跑着就卡死,有的开机正常但用两天就花屏。说白了,很多问题根子都在内存管理上。
这一章我们先打好地基。把触摸屏的内存架构、RAM和Flash的区别、还有内存泄漏和碎片这些概念理清楚。后面优化的时候,你才知道自己在调什么。
1.1 触摸屏的内存架构概览
一块典型的触摸屏模组,内部其实是个小型的嵌入式系统。它的内存架构大致分三层:
- MCU内部SRAM:跑程序、存变量、做显示缓冲区。速度最快,但容量最小。
- 外部SDRAM/PSRAM:很多高性能屏会外挂一颗。用来做大尺寸显存或缓存图片数据。
- Flash存储器:存固件、字库、图标、UI页面配置。掉电不丢。
我习惯把这三层比作「办公桌、文件柜、仓库」。SRAM是桌面,你正在用的东西放上面;SDRAM是文件柜,常用的资料放里面;Flash是仓库,不常用的存起来。
核心认知:触摸屏的内存瓶颈,90%出在SRAM和SDRAM上。Flash一般够用,但读写速度慢,不能当运行内存用。
下面这张图帮你理清整体结构:
1.2 RAM与Flash的区别
很多新手会把RAM和Flash搞混。其实它们完全是两回事。我直接给你列个对比表:
| 对比维度 | RAM(SRAM / SDRAM) | Flash(NOR / NAND) |
|---|---|---|
| 数据保持 | 掉电丢失 | 掉电不丢 |
| 读写速度 | 纳秒级(快) | 微秒级(慢,尤其写操作) |
| 擦写次数 | 无限(理论) | 有限(通常1万~10万次) |
| 主要用途 | 运行代码、变量、显存 | 固件、字库、图片、配置 |
| 容量成本 | 贵,容量小 | 便宜,容量大 |
| 触摸屏典型值 | SRAM: 64KB~512KB SDRAM: 2MB~32MB |
2MB~64MB |
我的经验:做触摸屏UI时,尽量把不常用的图片和字库放Flash里,用的时候再加载到RAM。别一股脑全塞进RAM,否则很快就不够用了。
为什么会这样?因为Flash读一次要几十微秒,而SRAM只要几个纳秒。差了好几个数量级。但Flash便宜,适合存大块数据。
我记得有一次做7寸屏项目,客户要求开机秒出画面。我把开机Logo直接放Flash里,上电后边解压边显示。如果放RAM里,就得等全部加载完才能显示,反而慢了。
1.3 内存泄漏
内存泄漏,说白了就是「借了不还」。你malloc了一块内存,用完了没free。一次两次没事,但反复泄漏,可用内存就越来越少。
在触摸屏上,内存泄漏的典型症状是:
- 刚开机正常,用着用着界面切换变慢
- 触摸响应越来越迟钝
- 最终系统崩溃或看门狗复位
我曾经排查过一个项目,客户反馈机器运行8小时后必死机。我查了三天,最后发现是触摸校准数据每次采样都new一个对象,但只在特定条件下释放。8小时刚好把堆内存耗光。
避坑指南:我曾经在GUI框架的回调函数里反复创建临时位图对象,忘记释放。结果界面越切越卡。后来我养成了一个习惯——每次malloc后面紧跟free,先写释放再写逻辑。
1.4 内存碎片
内存碎片比泄漏更隐蔽。泄漏是总量变少,碎片是总量够但用不了。
想象一下:你有一排连续的停车位。有人停了又走,走了又停。最后空位总数还有10个,但每个空位只够停自行车,停不了汽车。这就是碎片。
在触摸屏里,碎片会导致:
- malloc大块内存失败,但实际剩余总量是够的
- 系统反复重试,性能下降
- 严重时直接宕机
我习惯用两种手段对付碎片:
- 静态分配优先:能编译期确定的缓冲区,直接用全局数组。不动态申请。
- 内存池:固定大小的对象(比如图标句柄、窗口对象)用内存池管理,避免频繁小块分配。
一句话总结:内存泄漏是「总量变少」,内存碎片是「空间不连续」。两者都会让你的触摸屏「看起来还有内存,但就是跑不动」。
嗯,这一章的内容就这些。概念清楚了,后面我们才能聊具体的优化手段。你先把这张架构图印在脑子里,后面每一章都会用到它。