我最近发现需要将不经常更新的配置变量存储在微控制器的 EEPROM 中。向程序添加状态会立即让人担心
- 检测 EEPROM 中未初始化的数据(即首次启动),
- 转换旧固件版本的数据或使其无效,以及
- 多个结构的寻址,每个结构都可能在固件更新中增长。
广泛的谷歌搜索只找到了一篇文章来解决通过固件更新保持 EEPROM 数据有效 http://embeddedgurus.com/stack-overflow/2009/11/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
我没有存储大量数据,因此我为标头中的每个字段使用一个字节。您可以使用任何您需要的尺寸,只要您不改变它即可。数据表被依次写入EEPROM中。
当您的固件需要从 EEPROM 中读取数据时,它会从第一个表开始读取。如果固件识别表 ID 并支持列出的表版本,则会从表主体中加载数据(当然,在验证校验和之后)。如果 ID、版本或校验和未签出,则直接跳过该表。长度字段用于定位链中的下一个表。当固件看到长度为零的表时,它知道它已到达数据末尾,并且没有更多的表需要处理。
我发现这种格式灵活(我可以将任何类型的数据添加到表主体中)并且强大(保持标头格式不变,并且数据表将向前和向后兼容)。
有一些警告,尽管它们并不是太繁重。首先,您需要确保您的固件可以处理重要数据不在表中或使用不受支持的格式版本的情况。您还需要将 EEPROM 存储区域的第一个字节初始化为零(这样在第一次启动时,您就不会开始加载垃圾并认为它是数据)。由于每个表都知道其长度,因此可以扩展或缩小表;但是,您必须移动表存储区域的其余部分,以确保没有“漏洞”(如果整个表链无法放入您的设备内存中,那么此过程可能会很烦人)。就我个人而言,我认为这些都不是大问题,而且使用其他一些数据存储方法省去的麻烦是值得的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)