C语言参数管理代码框架更新

初版的代码在序列化时没有考虑到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_t sg_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);//函数中使用int main(){//方法一:    // 对参数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);}  
通过函数去操作参数示例片段代码:
//函数中使用int main(){    param_uint16_t tmp;//方法一:    // 对参数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] -> 12 0a 00 22 14 00 38 33 33 33 33 33 33 09 40 4a 61 62 63 64 65        read: [21] -> 66 00 00 00 00 51 08 64 6c 02 00 00 71 2d 88 05 00 00 00 00 00 save param:        save: [3] -> 12 0a 00        save: [3] -> 22 14 00        save: [9] -> 38 33 33 33 33 33 33 09 40        save: [11] -> 4a 61 62 63 64 65 66 00 00 00 00        save: [2] -> 51 08        save: [5] -> 64 6c 02 00 00        save: [2] -> 71 2d        save: [9] -> 88 05 00 00 00 00 00 00 00# 配置最多支持 15 个参数时的序列化内容及长度键值对序列化: [44] -> 12 0a 00 22 14 00 38 33 33 33 33 33 33 09 40 4a 61 62 63 64 65 66 00 00 00 00 51 08 64 6c 02 00 00 71 2d 88 05 00 00 00 00 00 00 00序列化: [36] -> 50 00 14 00 33 33 33 33 33 33 09 40 67 5f 74 65 73 74 5f 36 00 00 00 6c 02 00 00 2d 05 00 00 00 00 00 00 00 # 配置最多支持 256 个参数时的序列化内容及长度键值对序列化: [52] -> 02 01 0a 00 02 02 14 00 08 03 33 33 33 33 33 33 09 40 0a 04 61 62 63 64 65 66 00 00 00 00 01 05 08 04 06 6c 02 00 00 01 07 2d 08 08 05 00 00 00 00 00 00 00序列化: [36] -> 50 00 14 00 33 33 33 33 33 33 09 40 67 5f 74 65 73 74 5f 36 00 00 00 6c 02 00 00 2d 05 00 00 00 00 00 00 00 # 配置最多支持 4096 个参数时的序列化内容及长度键值对序列化: [60] -> 02 10 00 0a 00 02 20 00 14 00 08 30 00 33 33 33 33 33 33 09 40 0a 40 00 61 62 63 64 65 66 00 00 00 00 01 50 00 08 04 60 00 6c 02 00 00 01 70 00 2d 08 80 00 05 00 00 00 00 00 00 00序列化: [36] -> 50 00 14 00 33 33 33 33 33 33 09 40 67 5f 74 65 73 74 5f 36 00 00 00 6c 02 00 00 2d 05 00 00 00 00 00 00 00


abb变频器常见故障
“游戏机”改变医疗:体感技术跨入医疗行业
直线电机模组加持的基因测序设备
华为Mate10什么时候上市?最新消息:外观、配置、价格汇总,iPhone8遇冷原因真相了
智能传感器在安防领域举足轻重
C语言参数管理代码框架更新
闪测仪应用案例:3C小五金尺寸测量
HTC U 11手机拆解视频:内部做工尚可改进
FPGA和其他可编程逻辑IC 的不同之处在于哪
音频工程师容易忽略的不良率原因所在-铝电解
医疗器械安全与获得监管部门批准
一文详解步进电机
介绍几种常见的保护器件类型
MarkLogic数据架构师Kurt Cagle分享了他的洞见
基于LabVIEW的电机故障声测系统
电源适配器的常见修理方法有哪些
YOLOv5 Callback机制解读
到2025年机器人将完成人类一半的工作任务
企业迎接数码转型 凸显数据分析重要性
台积电决定投资上百亿在美国建厂