gpt4 book ai didi

c - 安全存储和访问 EEPROM

转载 作者:太空狗 更新时间:2023-10-29 16:44:34 26 4
gpt4 key购买 nike

我最近发现需要将不经常更新的配置变量存储在微 Controller 的 EEPROM 中。将状态添加到程序中会立即迫使人们担心

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

广泛的谷歌搜索只找到一篇地址为 keeping your EEPROM data valid through firmware updates 的文章.有人使用过那篇文章中讨论的方法吗?是否有更好的替代方法?

最佳答案

就个人而言,我更喜欢“标记表格”格式。

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

下面是其中一个表格的示例:

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

我没有存储很多数据,所以我为 header 中的每个字段使用了一个字节。你可以使用任何你需要的尺寸,只要你永远不改变它。数据表依次写入EEPROM。

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

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

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

关于c - 安全存储和访问 EEPROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com