前言
作为嵌入式的软件开发工程师,基本都会对参数的概念都不会陌生。
很多功能使用的变量都需要在程序运行过程中改变,掉电重启后还需要恢复原来的状态,就需要这些变量能够保存起来,写入flash或eeprom等储存芯片中,待程序重新运行时读取,这部分保存起来的变量通常称为参数。
参数可区分功能性配置、性能配置和软件内部实现;功能性配置和性能配置参数是指给提供客户关闭功能,配置性能的配置。
- 软件内部实现的参数配置,一般用于研发内部客户或维护部门故障排查和维护,不随意提供给外部。
- 外部的功能和性能配置参数,可提供客户进行修改,部分对于重要参数或因为商务原因,一般建议提供加密方法(不可见或超级管理员密码设置),不建议让客户随意配置
当然,参数并不是简单的保存和读取恢复,由于参数通常关系到软件的运行状态,因此对参数这部分的处理自然与普通变量有所不同,通常需要对参数从储存芯片中读取后做校验,防止掉电写入后的数据发生变化;
常规做法就是判断参数的取值范围,一旦超出范围,就需要缺省值恢复,防止程序运行出现严重异常问题。
介绍
参数管理框架代码,代码主要特点有:
- 采用表驱动方式统一管理所有参数,包括缺省值、最小值和最大值等
- 采用宏定义快速注册和添加参数进行管理
- 支持基本类型参数和字符串参数
- 支持序列化和反序列化,便于保存和读取校验
- 可通过串口协议或其他协议调用接口修改参数
代码示例
部分demo代码如下
PARAM_DEFINE (test, PARAM_INT16, 10, -100, 100);
PARAM_DEFINE (test_2, PARAM_UINT16, 20, 0, 100);
PARAM_DEFINE (test_3, PARAM_DOUBLE, 3.15, -10.5, 10.5);
PARAM_DEFINE_STR (test_str, 10, "abcdef");
const ParamInfo_t sg_tParamList[]=
{
PARAM_REG(1, test, PARAM_INT16),
PARAM_REG(2, test_2, PARAM_UINT16),
PARAM_REG(3, test_3, PARAM_DOUBLE),
PARAM_STR_REG(4, test_str),
};
static ParamTable_t sg_tParamTable = {sg_tParamList, sizeof(sg_tParamList) / sizeof(sg_tParamList[0])};
int main ()
{
uint32_t data = 16;
double fdata = 7.25;
uint8_t databuf[8];
InitAllParam();
ShowAllParam();
printf("\nModify: \n");
memcpy(databuf, &data, sizeof(data));
ModifyByName("test_2", databuf);
memcpy(databuf, &fdata, sizeof(fdata));
ModifyByName("test_3", databuf);
ShowAllParam();
printf("\nReset: \n");
ResetParam();
ShowAllParam();
return 0;
}
下载链接
下载链接(点击阅读原文):参数管理框架源码