[分享]采用结构体和共用体配合的方式存储参数

2020-01-04 19:01发布

本帖最后由 bolizhicheng204 于 2018-3-30 10:20 编辑

经常用flash、EEROM保存参数。最笨的办法就是自己计算每一个变量的位置,一个个写入,这个办法效率极其低下,每次修改都要改 一大堆 东西。后来采用结构体和共用体配合的方式,效率高很多。其实论坛里很多人都用这个办法,我做了一些修改,特此分享。欢迎指正!
大概思路:结构体里面放置各种参数变量,在写一个共用体,把刚才的结构体和一个数组放一起,这样数组和结构体公用内存,其数据就可以相互访问了。
此处以芯片内部flash读写为例,见图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
34条回答
zhcj66
1楼-- · 2020-01-05 19:46
本帖最后由 zhcj66 于 2018-3-30 11:13 编辑

一个个定义地址确实麻烦,好处是数据出错好查找,保存速度快,采用结构体和共用体配合的方式存储参数存储需要整个区域存储或者读取,运行效率会慢不少
bolizhicheng204
2楼-- · 2020-01-05 21:32
 精彩回答 2  元偷偷看……
norman33
3楼-- · 2020-01-05 22:11
合体相关的细节:
  1)联合体的末尾有多少个填充单元
  2)联合体的各个成员如何对齐
  3)多字节的数据类型高低字节如何排放顺序
  4)如果包含位字段 (bit-field),各位如何排放
因为这四个原因在不同系统、不同编译器下有太多可能,所以MISRA直接就不准使用了。
takashiki
4楼-- · 2020-01-05 23:03
你这个联合体真繁琐,我都这样用的:
  1. typedef union {
  2.         struct SysParaStruct;
  3.         unsigned char buff[];
  4. } SysParaUnion;
复制代码当然,匿名联合的#pragma anon_unions是要开启的。
bolizhicheng204
5楼-- · 2020-01-06 04:37
norman33 发表于 2018-3-30 11:25
合体相关的细节:
  1)联合体的末尾有多少个填充单元
  2)联合体的各个成员如何对齐

有道理,用指针强制转换的方式替代共用体怎么样?
zhonghua_li
6楼-- · 2020-01-06 08:34
本帖最后由 zhonghua_li 于 2018-3-30 11:35 编辑

这种方式有个缺点:
会吧很多不相关的东西弄到一块去,
比如,我有个变量是模块A的变量Av中的, 有个变量Bv是模块B中的, 把这些变量弄到一个结构体里面去,感觉有点混乱。
以前我做了一个自动分配方案。
直接这么用就可以了  registe_eep(Bv);  save_to_eep(&Bv); load_from_eep(&Bv)

一周热门 更多>