2、嵌入式存储基础:存储介质分类、存储层次结构与数据持久化
大家好,我是老张。今天咱们聊聊嵌入式存储。说实话,这可能是整个消防报警系统里最容易被忽视,但又最关键的部分。你想想看,火灾记录要是丢了,那后果可不堪设想。
2.1 存储介质分类:Flash、EEPROM、SRAM
嵌入式系统里常用的存储介质,说白了就三种:Flash、EEPROM 和 SRAM。它们各有各的脾气,选错了可是要出大问题的。
2.1.1 Flash(闪存)
Flash 是目前嵌入式系统的主力存储。我做过一个项目,用 SPI Flash 存储了整整 3 个月的消防报警日志,一点问题没有。
- 特点:非易失性,掉电不丢数据。容量大,从几 MB 到几 GB 都有。
- 写入方式:按页写入,按块擦除。注意,擦除操作很慢,而且有寿命限制。
- 典型应用:存储固件、历史记录、配置文件。
关键参数:
- 擦写寿命:通常 10 万次(NAND)到 100 万次(NOR)
- 擦除时间:块擦除约 2-10ms
- 写入时间:页写入约 0.5-3ms
2.1.2 EEPROM
EEPROM 和 Flash 有点像,但有个关键区别——它可以按字节擦写。嗯,这里要注意,EEPROM 的容量通常很小,几 KB 到几十 KB。
我个人习惯用 EEPROM 存一些关键参数,比如报警阈值、设备地址。为什么?因为改一个字节不用动整个块,方便多了。
我的经验:我曾经在一个消防项目中,用 EEPROM 存储了 256 字节的配置信息。每次修改只写一个字节,效率很高。但要注意,EEPROM 的写入速度比 Flash 慢,大约 5-10ms 一个字节。
2.1.3 SRAM
SRAM 是静态随机存取存储器。速度快,但掉电就丢数据。说白了,它就是个临时工作区。
- 特点:读写速度极快,纳秒级。容量小,通常几十 KB 到几 MB。
- 用途:CPU 的缓存、堆栈、临时变量。
- 注意:SRAM 不需要刷新,但功耗比 DRAM 高。
避坑指南:我曾经遇到过一个问题——SRAM 在高温下数据保持时间会缩短。消防报警设备经常在高温环境工作,所以一定要选工业级 SRAM(-40°C 到 85°C)。
2.2 存储层次结构
嵌入式系统的存储层次,就像一座金字塔。从上到下,速度越来越慢,容量越来越大。
| 层次 | 介质 | 速度 | 容量 | 成本 |
|---|---|---|---|---|
| 寄存器 | 触发器 | 最快(~1ns) | 几十字节 | 最高 |
| Cache(L1/L2) | SRAM | 快(~10ns) | 几十 KB | 高 |
| 主存(RAM) | SRAM/DRAM | 中等(~100ns) | 几 MB | 中等 |
| 非易失存储 | Flash/EEPROM | 慢(~ms) | 几 MB 到几 GB | 低 |
你想想看,为什么要有这个层次?因为成本和速度的平衡。SRAM 快但贵,Flash 慢但便宜。所以,我们得把最常用的数据放在最快的地方,不常用的放慢的地方。
我记得有个项目,为了优化日志写入速度,我用了双缓冲机制。先把日志写到 SRAM 缓冲区,等缓冲区满了再一次性写入 Flash。这样既保证了速度,又延长了 Flash 的寿命。
2.3 数据持久化概念
数据持久化,说白了就是让数据在掉电后还能活着。对于消防报警系统,这简直是命根子。
2.3.1 为什么需要持久化?
消防报警记录必须保存至少 30 天(国标要求)。如果掉电就丢,那还怎么追溯火灾原因?
- 历史记录:报警时间、设备编号、报警类型
- 配置参数:阈值、联动规则、网络设置
- 系统状态:故障记录、维护日志
2.3.2 持久化的实现方式
常见的做法是使用文件系统,比如 FATFS、LittleFS。但要注意,Flash 有写入寿命限制,不能频繁写。
我的做法:
- 使用环形缓冲区思想,循环覆盖旧数据
- 每次写入前检查擦写次数,超过阈值就换块
- 写入完成后做 CRC 校验,防止数据损坏
2.3.3 避坑指南
我曾经踩过一个坑——在写入 Flash 时突然掉电,导致数据损坏。后来我加了两个措施:
- 写前备份:先备份旧数据,再写新数据
- 写后校验:写入完成后读回来对比
重要提醒:不要直接写 Flash!一定要用文件系统或者自己实现磨损均衡。否则,某个块被写坏了,整个设备就废了。
2.4 小结
好了,今天的内容就这些。总结一下:
- Flash 存大容量数据,EEPROM 存小量关键参数,SRAM 做临时工作区
- 存储层次要合理设计,速度与容量要平衡
- 数据持久化是消防报警系统的底线,一定要做好保护
下一章,我会讲如何用代码实现 Flash 的读写操作。到时候我会分享一个我实际用过的驱动库,保证实用。
记住,存储选型错了,后面全白干。选对了,系统才能稳定跑十年。