初版的代码在序列化时没有考虑到MCU小容量内存设备,需要一次性完成序列化,内存开销较大等等其他问题。
介绍
红色部分为更新后的重点新特性:
采用表驱动方式统一管理所有参数,包括缺省值、最小值和最大值等
支持定义普通参数,无缺省值、最小值和最大值限制
支持定义普通参数,有缺省值,但无最小值和最大值限制
支持定义普通参数,有缺省值,最小值和最大值限制
采用宏定义快速对参数进行定义、注册和管理
支持已定义变量做为参数进行管理,如全局变量或者结构体成员变量
支持基本类型参数和字符串参数
支持序列化和反序列化操作,可在本地储存设备保存/读取二进制数据
支持键值对的方式储存,即使后期版本迭代对参数表删除/插入数据时也能向下兼容
支持非键值对的方式储存,适合小容量的储存设备,序列化后的数据内容少,但是后期版本迭代对参数表删除或插入数据时不能向下兼容,只有通过在参数表后添加参数才能向下兼容
通过多次读写储存设备分别加载参数和保存参数,更兼容小内存的平台使用(多次调用回调函数处理)
支持在数据加载或保存时当参数当前值不合法(超出范围)触发错误处理回调函数,有上层应用程序决定如何处理(可以恢复默认值)
支持功能配置裁剪
根据不同的平台,可以对部分功能裁剪,或者修改配置适用于不同容量的芯片开发
键值对的方式储存:向下兼容较好
可以选择只支持基本类型的参数储存功能,如字符串类型参数和64位长度的参数可裁剪
支持多种操作:宏命令和函数接口
大部分参数可以通过宏命令完成相关操作,如范围校验等
函数部分可以用于自己实现其他功能使用,如参数显示、参数与上位机交互等
根据不同场景使用不同的方式进行处理
代码示例
定义参数表:
PARAM_DEFINE_DAT(g_test,PARAM_INT16,10); PARAM_DEFINE_DAT_DEF(g_test_2,PARAM_UINT16,20); PARAM_DEFINE_DAT_RANGE(g_test_3,PARAM_DOUBLE,3.15,-10,10); PARAM_DEFINE_STR_RANGE(g_test_str,10,"abcdef",5); PARAM_DEFINE_DAT_RANGE(g_test_4,PARAM_INT8,8,-10,10); PARAM_DEFINE_DAT_RANGE(g_test_5,PARAM_UINT32,620,500,10000); PARAM_DEFINE_DAT_RANGE(g_test_6,PARAM_UINT8,45,5,100); PARAM_DEFINE_DAT_RANGE(g_test_7,PARAM_INT64,5,-542,5450); PARAM_DEFINE_BIND_DAT_RANGE(sg_tTest_test1,PARAM_UINT16,20,10,2000);//为即将绑定的变量定义相关参数信息 PARAM_DEFINE_BIND_DAT(sg_tTest_test2,PARAM_FLOAT);//为即将绑定的变量定义相关参数信息,初值为sg_tTest变量定义时的初值 PARAM_DEFINE_BIND_STR_RANGE(sg_tTest_str,sizeof(sg_tTest.str),"const-zpc",6);//为即将绑定的变量定义相关参数信息,初值为sg_tTest变量定义时的初值 ParamInfo_tsg_ParamTable[]={ PARAM_ITEM_DAT(1,g_test,PARAM_ATTR_WR), PARAM_ITEM_DAT_DEF(2,g_test_2,PARAM_ATTR_WR), PARAM_ITEM_DAT_RANGE(3,g_test_3,PARAM_ATTR_WR), PARAM_ITEM_STR_RANGE(4,g_test_str,PARAM_ATTR_WR), PARAM_ITEM_DAT_RANGE(5,g_test_4,PARAM_ATTR_WR), PARAM_ITEM_DAT_RANGE(6,g_test_5,PARAM_ATTR_WR), PARAM_ITEM_DAT_RANGE(7,g_test_6,PARAM_ATTR_WR), PARAM_ITEM_DAT_RANGE(8,g_test_7,PARAM_ATTR_READ),//只读 PARAM_ITEM_DAT_RANGE_BIND(9,sg_tTest_test1,sg_tTest.test1,PARAM_ATTR_WR), PARAM_ITEM_DAT_BIND(10,sg_tTest_test2,sg_tTest.test2,PARAM_ATTR_WR), PARAM_ITEM_STR_RANGE_BIND(11,sg_tTest_str,sg_tTest.str,PARAM_ATTR_WR), };
通过宏去操作参数示例片段代码:
//首先需要在头文件声明 PARAM_EXTERN_DAT(g_test,PARAM_INT16); PARAM_EXTERN_DAT(g_test_2,PARAM_UINT16); PARAM_EXTERN_DAT(g_test_3,PARAM_DOUBLE); PARAM_EXTERN_STR(g_test_str,10); PARAM_EXTERN_DAT(g_test_4,PARAM_INT8); PARAM_EXTERN_DAT(g_test_5,PARAM_UINT32); PARAM_EXTERN_DAT(g_test_6,PARAM_UINT8); PARAM_EXTERN_DAT(g_test_7,PARAM_INT64); //函数中使用 intmain() { //方法一: //对参数g_test_6设置新的值50,如果超出限定范围则不处理 PARAM_DAT_SET_NEW_VALUE(g_test_6,50,PARAM_NONE); //对参数g_test_6设置新的值50,如果超出限定范围则重置为默认值 PARAM_DAT_SET_NEW_VALUE(g_test_6,50,PARAM_DEF); //对参数g_test_6设置新的值150,如果超出限定范围则参数小于最小值则为最小值,参数大于最大值则为最大值 PARAM_DAT_SET_NEW_VALUE(g_test_6,150,PARAM_MIN_MAX); //方法二: //对参数g_test_6设置新的值50,如果超出限定范围则不处理 g_test_6=50; PARAM_DAT_CHECK_RANGE(g_test_6,PARAM_NONE); //对参数g_test_6设置新的值50,如果超出限定范围则重置为默认值 g_test_6=50; PARAM_DAT_CHECK_RANGE(g_test_6,PARAM_DEF); //对参数g_test_6设置新的值150,如果超出限定范围则参数小于最小值则为最小值,参数大于最大值则为最大值 g_test_6=150; PARAM_DAT_CHECK_RANGE(g_test_6,PARAM_MIN_MAX); }
通过函数去操作参数示例片段代码:
//函数中使用 intmain() { PARAM_UINT16_Ttmp; //方法一: //对参数g_test_6设置新的值50,如果超出限定范围则不处理 tmp=50; Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),&tmp,PARAM_NONE); //对参数g_test_6设置新的值50,如果超出限定范围则重置为默认值 tmp=50; Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),&tmp,PARAM_DEF); //对参数g_test_6设置新的值150,如果超出限定范围则参数小于最小值则为最小值,参数大于最大值则为最大值 tmp=150; Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),&tmp,PARAM_MIN_MAX); //方法二: //对参数g_test_6设置新的值50,如果超出限定范围则不处理 g_test_6=50; Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),PARAM_NONE); //对参数g_test_6设置新的值50,如果超出限定范围则重置为默认值 g_test_6=50; Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),PARAM_DEF); //对参数g_test_6设置新的值150,如果超出限定范围则参数小于最小值则为最小值,参数大于最大值则为最大值 g_test_6=150; Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),PARAM_MIN_MAX); }
序列化 Demo 的结果展示:
#配置最多支持15个参数时加载参数时分多次读取/保存操作打印日志 load param: read:[21]->120a002214003833333333333309404a6162636465 read:[21]->66000000005108646c020000712d88050000000000 save param: save:[3]->120a00 save:[3]->221400 save:[9]->383333333333330940 save:[11]->4a61626364656600000000 save:[2]->5108 save:[5]->646c020000 save:[2]->712d save:[9]->880500000000000000 #配置最多支持15个参数时的序列化内容及长度 "键值对序列化":[44]->120a002214003833333333333309404a616263646566000000005108646c020000712d880500000000000000 "序列化":[36]->500014003333333333330940675f746573745f360000006c0200002d0500000000000000 #配置最多支持256个参数时的序列化内容及长度 "键值对序列化":[52]->02010a0002021400080333333333333309400a046162636465660000000001050804066c02000001072d08080500000000000000 "序列化":[36]->500014003333333333330940675f746573745f360000006c0200002d0500000000000000 #配置最多支持4096个参数时的序列化内容及长度 "键值对序列化":[60]->0210000a00022000140008300033333333333309400a400061626364656600000000015000080460006c0200000170002d0880000500000000000000 "序列化":[36]->500014003333333333330940675f746573745f360000006c0200002d0500000000000000
审核编辑:刘清
-
mcu
+关注
关注
146文章
17376浏览量
353043 -
C语言
+关注
关注
180文章
7616浏览量
138063
原文标题:C语言参数管理代码框架,重大更新!
文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论