此方法非常高效,使用结构体+联合体的方式实现flash的参数存储,到底有多简单高效,可以往后面看,如果觉得不高效,完全可以顺着网线来砍我。
前提条件:
1-flash的读写驱动程序,这里不做介绍
实现思路:
2-1结构体创建一个参数列表,大家知道结构体就是一个大箱子,里面放很多变量。
2-2联合体创建一个结构体和数组的组合,联合体多个变量占用同一个内存,这个特性大家有没有一语惊醒你,没有也没关系,下面直接实现代码。
#include <stdio.h>
#include "string.h"
struct NV_T
{
char a;
short b;
int c;
float d;
};
union NV_U
{
struct NV_T nv_list;
unsigned char flash_buf[12]; //保存所有数据的数组
}nv_para;
//验证NV大小是否正确
int check_nv_buf_size()
{
if(sizeof(nv_para.flash_buf) == sizeof(nv_para.nv_list))
{
return 1;
}
printf("nv size dis %d %d\n",sizeof(nv_para.nv_list),sizeof(nv_para.flash_buf));
return 0;
}
int main()
{
if(check_nv_buf_size() ==1 )
{
printf("nv size ok\n");
}
printf("hes:%d %d\n",sizeof(nv_para.nv_list),sizeof(nv_para.flash_buf));
nv_para.nv_list.a =89;
nv_para.nv_list.d =25.456;
//新建一个nv变量,模拟flash
union NV_U nv1={0};
memcpy(nv1.flash_buf,nv_para.flash_buf,sizeof(nv_para.flash_buf));
printf("sn:%d %d\n",nv_para.nv_list.a,nv1.nv_list.a);
printf("sn:%0.3f %0.3f\n",nv_para.nv_list.d,nv1.nv_list.d);
return 1;
}
运行结果:可以看到nv1变量里面的参数列表的值和nv_para里面的值是一样的,我们只是拷贝了联合体的flash_buf变量,没有实际拷贝结构体的变量。
有这个结果是应为联合体的特性,struct NV_T nv_list; unsigned char flash_buf[12]; 这两个变量使用了同一个内存,不管你修改谁,他们都会同步修改,是不是很舒服。
使用这种方式以后添加参数,只需要往结构体里面加变量就ok,非常直接高效,适用于任何存储器。