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 有写入寿命限制,不能频繁写。

我的做法

  1. 使用环形缓冲区思想,循环覆盖旧数据
  2. 每次写入前检查擦写次数,超过阈值就换块
  3. 写入完成后做 CRC 校验,防止数据损坏

2.3.3 避坑指南

我曾经踩过一个坑——在写入 Flash 时突然掉电,导致数据损坏。后来我加了两个措施:

  • 写前备份:先备份旧数据,再写新数据
  • 写后校验:写入完成后读回来对比

重要提醒:不要直接写 Flash!一定要用文件系统或者自己实现磨损均衡。否则,某个块被写坏了,整个设备就废了。

2.4 小结

好了,今天的内容就这些。总结一下:

  • Flash 存大容量数据,EEPROM 存小量关键参数,SRAM 做临时工作区
  • 存储层次要合理设计,速度与容量要平衡
  • 数据持久化是消防报警系统的底线,一定要做好保护

下一章,我会讲如何用代码实现 Flash 的读写操作。到时候我会分享一个我实际用过的驱动库,保证实用。

记住,存储选型错了,后面全白干。选对了,系统才能稳定跑十年。