打印
[MCU]

用户数据怎么规划合理

[复制链接]
519|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
thammer|  楼主 | 2015-3-10 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 thammer 于 2015-3-10 10:18 编辑

    一般单片机中用户数据都会特别划分出一块区域来存储,要不是flash,要不是E2PROM里面,我昨天修改碰到的情况是,用户数据存储在flash里面,存储的是一个数据结构,然后我的改动是将此数据结构缩小了,结果由于不细心,忘记和上一个版本的数据兼容,升级后数据不对,打个比方,原来存储的数据结构是:typedef struct USER_DATA
{
        signed char x;
        signed char x_s;
        signed char y;
        signed char y_s;

        signed char z;
        signed char z_s;

}
后来代码作调整,改为:
typedef struct USER_DATA
{
signed char x;
signed char y;
signed char z;
}USER_DATA;

这样一来升级后,x读到flash中的用户值为原来的x,y则变为x_s,z则为y。数据完全错乱,由于我这1K的flash里面只存储了这样的一个结构,所以只要判断存储地址偏移(原来结构体大小-1)的位置是否为0xFF,如果不为,则说明flash中保存的为老的结构,简单的处理下就可以了。
     那么如果我的这个结构如果可能会不断的变大变小,如果有3个版本的软件,上面2个分别命名为A, B.第三版软件为C,C版USER_DATA定义为:
typedef struct USER_DATA
{
signed char x;
signed char z;
}USER_DATA;
那么我如果我作兼容,可能要考虑的情况是用户从A升级到C,从B升级到C,软件可以跨版本升级的。这时我红色字体高亮出来的方法就行不通了,虽然貌似可以判断第三个字节位置是否为0xFF,但是这样太不具通用性了。
       由此可见,我这样定义用户数据结构是相当烂的,我觉得应该把这个结构的第一个成员作为一个数据版本号来设计,这样就不怕数据结构的变动了,因为我清楚每个版本数据的结构是什么样子的。请问各位老鸟有什么好的建议或者经验教教我

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

34

帖子

0

粉丝