安全地存储和访问EEPROM[英] Safely storing and accessing EEPROM

本文是小编为大家收集整理的关于安全地存储和访问EEPROM的处理方法,想解了安全地存储和访问EEPROM的问题怎么解决?安全地存储和访问EEPROM问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我最近确定需要在微控制器的 EEPROM 中存储不经常更新的配置变量.向程序添加状态会立即让人担心

  • 检测 EEPROM 中的未初始化数据(即首次启动),
  • 转换旧固件版本的数据或使数据失效,以及
  • 解决多个结构,每个结构都可能在固件更新中增长.

Extensive Googling 只发现了一篇涉及 通过固件更新保持您的 EEPROM 数据有效.有没有人使用过那篇文章中讨论的方法?有没有更好的替代方法?

推荐答案

我个人更喜欢"标记表"格式.

在这种格式中,您的数据被分成一系列"表格".每个表都有一个遵循可预测格式的标题和一个可以根据需要更改的正文.

以下是其中一张表的示例:

Byte 0: Table Length   (in 16-bit words)
Byte 1: Table ID       (used by firmware to determine what this data is)
Byte 2: Format Version (incremented every time the format of this table changes)
Byte 3: Checksum       (simple sum-to-zero checksum)
Byte 4: Start of body
...
Byte N: End of body

我没有存储大量数据,因此我为标题中的每个字段使用了一个字节.你可以使用任何你需要的尺寸,只要你从不改变它.数据表依次写入EEPROM.

当您的固件需要从 EEPROM 中读取数据时,它会从第一个表开始读取.如果固件识别表 ID 并支持列出的表版本,它会从表体中加载数据(当然是在验证校验和之后).如果 ID、版本或校验和未检出,则简单地跳过该表.长度字段用于定位链中的下一个表.当固件看到一个长度为零的表时,它就知道它已经到达数据的末尾并且没有更多的表要处理了.

我发现这种格式灵活(我可以将任何类型的数据添加到表的主体中)且稳健(保持标题格式不变,并且数据表将向前和向后兼容).

有一些注意事项,尽管它们并不太繁琐.首先,您需要确保您的固件可以处理重要数据不在表中或使用不受支持的格式版本的情况.您还需要将 EEPROM 存储区域的第一个字节初始化为零(这样在第一次启动时,您就不会以为它是数据而开始加载垃圾).由于每个表都知道它的长度,因此可以扩展或缩小表;但是,您必须移动表格存储区域的其余部分以确保没有"漏洞"(如果整个表格链无法放入设备的内存中,那么此过程可能会很烦人).就个人而言,我认为这些都不是什么大问题,与使用其他一些数据存储方法相比,我节省的麻烦是非常值得的.

本文地址:https://www.itbaoku.cn/post/359226.html