嵌入式软件升级的时候,如何处理配置变量?
在上电的时候,从eeprom中读取配置数据到ram中。
可是,如果软件升级了,所需要的配置变量发生了改变(增加、修改、删除),怎么实现软件升级后,读取前一个版本的配置变量?
还是:完全不考虑兼容,把变量初始化为默认变量?
或者说,大家在涉及这种配置变量的时候,是怎么处理的呢?
※ 来源:·水木社区 newsmth.net·[FROM: 114.249.223]
本地升级,可以做过Migration的工具,远程升级的话,Migration复杂些
我觉得一开始设计的时候应该预留足够的空间,类似这样
typedef struct {
unsigned long min_r; // * 10000 for each
unsigned long max_r;
unsigned long min_t;
unsigned long max_t;
unsigned short size;
unsigned short type;
unsigned long checksum;
} IndexInfo_t;
typedef struct {
IndexInfo_t info;
char reserved[40];
char name[64];
} IndexHeader_t;
以后需要增加新变量的时候就从reserved里找点空间出来,保证已有变量的存储偏移不变
不过如果变化很大,那也只能整个推倒重来了~
就怕顺序发生变化呢
配置变量的描述表,提供了变量名、变量类型、ram中的配置变量
这样,显示也很方便--对描述表进行处理就好了
如果,确定旧变量没用的了,显示的时候这个位置是可以跳过去
调整显示顺序,是为了让同一类变量更好的在一个配置页面展示
可是顺序变了,你的这个方法就不行了
【 在 tom6bj (tom) 的大作中提到: 】
: : :
: 顺序为啥要变。。。
: 如果有空间,就在后面另建新的成员变量,换个名字,然后升级时把数据复制过去
: 升级几个版本、确认旧变量没用了之后,
: 再把原来的变量改成xxx_deprecated之类,如果没问题,之后可以考虑空间回收再利用
:
: ps. 还得考虑结构体成员对齐。。。 特别是cortex-m0之类不支持对齐访问的mcu,
: 如果前面设置了#pragma pack(1), 然后访问结构体里跨对齐边界的成员就会直接进HardFault,很麻烦。所以尽可能4字节对齐。
:
: 【 在 airflow (坚持就是胜利-曙光) 的大作中提到: 】
: 就怕顺序发生变化呢
:
: 【 在 tom6bj (tom) 的大作中提到: 】
: : : : : :
: : 我觉得一开始设计的时候应该预留足够的空间,类似这样
: : typedef struct {
: : unsigned long min_r; // * 10000 for each
: : unsigned long max_r;
: : unsigned long min_t;
: : unsigned long max_t;
: : unsigned short size;
: : unsigned short type;
: : unsigned long checksum;
: : } IndexInfo_t;
: :
: : typedef struct {
: : IndexInfo_t info;
: : char reserved[40];
: : char name[64];
: : } IndexHeader_t;
: :
: : 以后需要增加新变量的时候就从reserved里找点空间出来,保证已有变量的存储偏移不变
: : 不过如果变化很大,那也只能整个推倒重来了~
: :
: : 【 在 airflow (坚持就是胜利-曙光) 的大作中提到: 】
: : : : : : : : : :
: : 配置变量是存储在eeprom里面,有一个配置变量表(flash中)用来描述存储在eeprom里面的数据格式。
: : 在上电的时候,从eeprom中读取配置数据到ram中。
: : 可是,如果软件升级了,所需要的配置变量发生了改变(增加、修改、删除),怎么实现软件升级后,读取前一个版本的配置变量?
: : 还是:完全不考虑兼容,把变量初始化为默认变量?
: :
: : 或者说,大家在涉及这种配置变量的时候,是怎么处理的呢?
: :
: :
: :
: :
: : --
: :
:
:
:
:
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 124.16.226]
※ 来源:·水木社区 newsmth.net·[FROM: 114.249.230]