OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3038|回复: 2

关于版本升级后怎么利用原来保存的数据的问题

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2020-8-28
在线时间
9 小时
发表于 2020-8-28 11:37:16 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 hsoalgyer 于 2020-8-28 11:44 编辑

问题是这样的,现在有一个结构体
  1. typedef  
  2. {
  3.     int a;
  4.     int b;
  5.     char c[10];
  6.     int d;
  7. }A;
复制代码
然后我创建一个结构体变量,并对其所有成员赋值,最后将结构体写入flash指定地址(即直接以二进制的方式写入)。
完了之后,现在程序升级了,结构体A的定义发生了变化,如下
typedef  
{
    int a;
    int b;
    int e; //成员增加
    char c[20];//元素增加
    int d;
}A;

若现在我烧写程序到单片机,那么程序会从flash中指定地址读回sizeof(A)个字节,并将数据填入新的结构体A中,那样的话数据c,d就会错乱,有什么好的解决方法吗?

我想到的一个不怎么好的方法是,升级后的程序第一次运行时,先把flash中的保存的数据读到旧的结构体,然后再一个一个成员的赋值给新结构体,但这么做有个很大的弊端,就是程序得保留每个版本的结构体A的定义。
比方说一个单片机用的是版本2,因为一些原因他得升级到版本5,那要使用原来保存的数据,就必须先从2->3->4->5,那样相当麻烦
还有就是以字符的方式保存,比方说

“1,a=1”
“2,b=2”
“3,c=hello”
“4,d=4”

这样保存旧结构体参数,让每个行号对应固定的成员,添加新成员的时候,永远添加在末尾,这样就不会影响原本数据的正确读出了
可这样保存,也有些不好的地方,就是要先建立文件系统,当然这个弊端仅针对于我,因为原项目代码写的很不好没有使用文件系统,现在要改改动很大,所以求教还有什么比较方便的解决方案吗?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-8-28 13:11:18 | 显示全部楼层
那就是你设计的不合理导致的,既然要使用原来的数据。那么最好数据结构不要改变。
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4926
金钱
4926
注册时间
2015-1-10
在线时间
618 小时
发表于 2020-8-28 14:06:31 | 显示全部楼层
数据与地址一一对应的话也不会是很大的问题,最多就是第一次运行的时候需要把数据处理好,这个也没有什么更好的解决方案,最后就是前期规划数据存储地址的时候考虑全面一点
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 01:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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