请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
查看: 985|回复: 3
收起左侧

请教如何设计EEPROM与内存的映射关系

[复制链接]

3

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2022-9-30 17:47:05 | 显示全部楼层 |阅读模式
1.jpg
各位大神好,目前我设计的项目遇到一个问题,以上图表是我当前的内存与EEPROM的设计思想,任务的配置参数已经固定死了,如果用户要加一些测量点,但又不能改变EEPROM里存储的数据时,该怎么做呢?
  例子:在项目一开始的时候,A任务相关的参数总大小为400个字节,(例如 DI点 AI点 AO点 校准参数等),这些点的数据配置数据已经按顺序存储进EEPROM,但是随着项目的升级,有了新的需求,A任务相关参数要变为500个字节,但是在EEPROM内,A任务相关参数紧邻着B任务相关参数,如果我要扩充A任务的相关配置参数,肯定会影响到B任务的相关配置参数,也影响到上位机读取出阿里的数据,(读取是用标准的MODBUS规约)
  如题所问,有没有一种更好的设计思想,可以使得我可以随意的扩充任务相关配置参数,但是不影响EEPROM内部的参数的顺序以及EEPROM里面的内容呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
发表于 2022-10-1 00:33:09 | 显示全部楼层
非常好的问题贴。

我有个思路不知道是否可行,就是楼主将EEPROM分成等大小的数组块,然后比如任务A使用了一个数值块,需要扩展,就当前使用的这个数组块末尾做个地址链接下一个块的首地址。

这种玩法其实非常好用,各种RTOS都用这种动态内存分配玩法。这样你就可以方便的动态管理了。
回复

使用道具 举报

8

主题

102

回帖

136

积分

初级会员

积分
136
发表于 2022-10-1 15:04:07 | 显示全部楼层
eric2013 发表于 2022-10-1 00:33
非常好的问题贴。

我有个思路不知道是否可行,就是楼主将EEPROM分成等大小的数组块,然后比如任务A使用 ...

这个之前在写星载数据存储管理模块的时候遇到过类似的问题,不过用的是nor flash和nand.这里其实还有一个增加安全的操作。
把整个存储模块,根据业务数据情况和扇区大小,等分为n个相等大小的存储单元块。 在存储单元块的开始,标识该存储块的属性信息,在结尾存储链接信息和安全信息。

属性部分包括该单元块属于哪个任务或者用户,使用或者未使用。这样即使储存块的结尾的指针被异常修改或者在操作过程中异常断电导致链接信息丢失,在每次重新上电或者复位后,都能够根据数据块的属性信息重新建立链接。

数据尾部的链接信息就是如硬汉所说,有指向另外一个属于该任务或用户的存储块地址。以及存储块ecc信息和crc等信息。

属性信息和链接信息等关键信息可以通过三模冗余的方式存储。加固数据读写鲁棒性。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2022-10-10 09:03:51 | 显示全部楼层
1.最终存储的参数不要按照任务去划分,按照类型去划分,比如有8位参数一个数组,所有浮点参数一个数组,然后程序中建立一个映射表去完成参数到任务的映射关系。
2.目的是实现升级后若有新增的参数,需原参数配置不变。那就创建一个参数版本,升级后检测到版本不同,则把原参数备份,然后全部按照新的参数恢复默认参数,最后再把备份的参数替换掉默认参数即可。实现这个的关键因素是所有的参数都有一个依次递增的ID号(新参数不跟以前重复即可)。
3.我们设备里面有上千个参数,就是这么维护的,我们参数是存储在片内FLASH一个扇区中的,一直很稳定。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-3-29 19:41 , Processed in 0.166742 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表