T_PID pidParas;

面对这样一个需求,要实现非易失存储,我在将底层的EEPROM/FLASH读写函数实现的基础上,将上述应用数据按照一定顺序存储管理。那么更为理想的方式是什么呢?设计一个模块专门负责存储非易失数据。比如:

typedef struct _t_nv_layout{

void * pElement; /*参数地址*/

int length; /*参数长度*/

}T_NV_LAYOUT;

/*参数映射表*/

T_NV_LAYOUT nvLayout[]={

{&sysParas,sizeof(T_PARAS)},/*参数映射记录*/

{&pidParas,sizeof(T_PID)},

。..

};

/*参数映射表记录条数*/

#define NV_RECORD_NUMBER (sizeof(nvLayout)/sizeof(T_NV_LAYOUT))

void nv_load(T_NV_LAYOUT *pLayout,int nvAddr,int number);

void nv_store(T_NV_LAYOUT *pLayout,int nvAddr,int number);

将上述设计思想,利用UML描述一下:

深入了解void指针背后的机理

在上述基础上,我们只需要设计硬件层抽象,即可设计出一个可行的、比较通用的NV管理子系统,这样设计出的子系统忽略了业务数据,仅仅将其处理为数据,并不关心其业务意义。实现了业务逻辑与后台的隔离解耦。做到了通用性。这里就比较巧妙的利用了void *指针的特性。如果对于该设计思想,在进一步延伸,将底层的抽象在做一层封装,将更细节的底层实现细节隔离抽象,比如:

抽象I2C/SPI EEPROM,将其对上层的调用接口统一,那么如果你的系统原本是存储在I2C EEPROM中,现在做一个新项目,你需要使用另外一种SPI接口的EEPROM,则只需要实现相应的底层处理函数即可。

将存储介质抽象,比如是EEPROM/DATA FLASH等。..

。..。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查