[程序源码] 轻量级参数管理框架代码

[复制链接]
 楼主| 大橙子疯 发表于 2023-6-19 21:21 | 显示全部楼层 |阅读模式
本帖最后由 大橙子疯 于 2023-6-19 21:21 编辑

1、前言
上一篇介绍了初版的参数管理框架代码功能,这一篇主要介绍这次的重大更新变化。
初版的代码在序列化时没有考虑到MCU小容量内存设备,需要一次性完成序列化,内存开销较大。


2、介绍
红色部分为更新后的重点新特性:

  • 采用表驱动方式统一管理所有参数,包括缺省值、最小值和最大值等
  • 支持定义普通参数,无缺省值、最小值和最大值限制
  • 支持定义普通参数,有缺省值,但无最小值和最大值限制
  • 支持定义普通参数,有缺省值,最小值和最大值限制

  • 采用宏定义快速对参数进行定义、注册和管理
  • 支持已定义变量做为参数进行管理,如全局变量或者结构体成员变量
  • 支持基本类型参数和字符串参数
  • 支持序列化和反序列化操作,可在本地储存设备保存/读取二进制数据
  • 支持键值对的方式储存,即使后期版本迭代对参数表删除/插入数据时也能向下兼容
  • 支持非键值对的方式储存,适合小容量的储存设备,序列化后的数据内容少,但是后期版本迭代对参数表删除或插入数据时不能向下兼容,只有通过在参数表后添加参数才能向下兼容
  • 通过多次读写储存设备分别加载参数和保存参数,更兼容小内存的平台使用(多次调用回调函数处理)
  • 支持在数据加载或保存时当参数当前值不合法(超出范围)触发错误处理回调函数,有上层应用程序决定如何处理(可以恢复默认值)

  • 支持功能配置裁剪
  • 根据不同的平台,可以对部分功能裁剪,或者修改配置适用于不同容量的芯片开发
  • 键值对的方式储存:向下兼容较好
  • 可以选择只支持基本类型的参数储存功能,如字符串类型参数和64位长度的参数可裁剪

  • 支持多种操作:宏命令和函数接口
  • 大部分参数可以通过宏命令完成相关操作,如范围校验等
  • 函数部分可以用于自己实现其他功能使用,如参数显示、参数与上位机交互等
  • 根据不同场景使用不同的方式进行处理


3、代码示例

定义参数表


  1. PARAM_DEFINE_DAT (g_test, PARAM_INT16, 10);
  2. PARAM_DEFINE_DAT_DEF (g_test_2, PARAM_UINT16, 20);
  3. PARAM_DEFINE_DAT_RANGE (g_test_3, PARAM_DOUBLE, 3.15, -10, 10);
  4. PARAM_DEFINE_STR_RANGE (g_test_str, 10, "abcdef", 5);
  5. PARAM_DEFINE_DAT_RANGE (g_test_4, PARAM_INT8, 8, -10, 10);
  6. PARAM_DEFINE_DAT_RANGE (g_test_5, PARAM_UINT32, 620, 500, 10000);
  7. PARAM_DEFINE_DAT_RANGE (g_test_6, PARAM_UINT8, 45, 5, 100);
  8. PARAM_DEFINE_DAT_RANGE (g_test_7, PARAM_INT64, 5, -542, 5450);
  9. PARAM_DEFINE_BIND_DAT_RANGE(sg_tTest_test1, PARAM_UINT16, 20, 10, 2000); // 为即将绑定的变量定义相关参数信息
  10. PARAM_DEFINE_BIND_DAT(sg_tTest_test2, PARAM_FLOAT); // 为即将绑定的变量定义相关参数信息,初值为sg_tTest 变量定义时的初值
  11. PARAM_DEFINE_BIND_STR_RANGE(sg_tTest_str, sizeof(sg_tTest.str), "const-zpc", 6);// 为即将绑定的变量定义相关参数信息,初值为sg_tTest 变量定义时的初值

  12. ParamInfo_t sg_ParamTable[] = {
  13.     PARAM_ITEM_DAT(1, g_test, PARAM_ATTR_WR),
  14.     PARAM_ITEM_DAT_DEF(2, g_test_2, PARAM_ATTR_WR),
  15.     PARAM_ITEM_DAT_RANGE(3, g_test_3, PARAM_ATTR_WR),
  16.     PARAM_ITEM_STR_RANGE(4, g_test_str, PARAM_ATTR_WR),
  17.     PARAM_ITEM_DAT_RANGE(5, g_test_4, PARAM_ATTR_WR),
  18.     PARAM_ITEM_DAT_RANGE(6, g_test_5, PARAM_ATTR_WR),
  19.     PARAM_ITEM_DAT_RANGE(7, g_test_6, PARAM_ATTR_WR),
  20.     PARAM_ITEM_DAT_RANGE(8, g_test_7, PARAM_ATTR_READ), // 只读
  21.     PARAM_ITEM_DAT_RANGE_BIND(9, sg_tTest_test1, sg_tTest.test1, PARAM_ATTR_WR),
  22.     PARAM_ITEM_DAT_BIND(10, sg_tTest_test2, sg_tTest.test2, PARAM_ATTR_WR),
  23.     PARAM_ITEM_STR_RANGE_BIND(11, sg_tTest_str, sg_tTest.str, PARAM_ATTR_WR),
  24. };

通过宏去操作参数示例片段代码

  1. // 首先需要在头文件声明
  2. PARAM_EXTERN_DAT(g_test, PARAM_INT16);
  3. PARAM_EXTERN_DAT(g_test_2, PARAM_UINT16);
  4. PARAM_EXTERN_DAT(g_test_3, PARAM_DOUBLE);
  5. PARAM_EXTERN_STR(g_test_str, 10);
  6. PARAM_EXTERN_DAT(g_test_4, PARAM_INT8);
  7. PARAM_EXTERN_DAT(g_test_5, PARAM_UINT32);
  8. PARAM_EXTERN_DAT(g_test_6, PARAM_UINT8);
  9. PARAM_EXTERN_DAT(g_test_7, PARAM_INT64);


  10. //函数中使用
  11. int main()
  12. {
  13. //方法一:
  14.     // 对参数g_test_6设置新的值50,如果超出限定范围则不处理
  15.     PARAM_DAT_SET_NEW_VALUE(g_test_6, 50, PARAM_NONE);

  16.     // 对参数g_test_6设置新的值50,如果超出限定范围则重置为默认值
  17.     PARAM_DAT_SET_NEW_VALUE(g_test_6, 50, PARAM_DEF);

  18.     // 对参数g_test_6设置新的值150,如果超出限定范围则参数小于最小值则为最小值, 参数大于最大值则为最大值
  19.     PARAM_DAT_SET_NEW_VALUE(g_test_6, 150, PARAM_MIN_MAX);


  20. //方法二:
  21.     // 对参数g_test_6设置新的值50,如果超出限定范围则不处理
  22.     g_test_6 = 50;
  23.     PARAM_DAT_CHECK_RANGE(g_test_6, PARAM_NONE);

  24.     // 对参数g_test_6设置新的值50,如果超出限定范围则重置为默认值
  25.     g_test_6 = 50;
  26.     PARAM_DAT_CHECK_RANGE(g_test_6, PARAM_DEF);

  27.     // 对参数g_test_6设置新的值150,如果超出限定范围则参数小于最小值则为最小值, 参数大于最大值则为最大值
  28.     g_test_6 = 150;
  29.     PARAM_DAT_CHECK_RANGE(g_test_6, PARAM_MIN_MAX);
  30. }

通过函数去操作参数示例片段代码

  1. //函数中使用
  2. int main()
  3. {
  4.     PARAM_UINT16_T tmp;
  5.   
  6. //方法一:
  7.     // 对参数g_test_6设置新的值50,如果超出限定范围则不处理
  8.     tmp = 50;
  9.     Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager, &g_test_u16), &tmp, PARAM_NONE);

  10.     // 对参数g_test_6设置新的值50,如果超出限定范围则重置为默认值
  11.     tmp = 50;
  12.     Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager, &g_test_u16), &tmp, PARAM_DEF);

  13.     // 对参数g_test_6设置新的值150,如果超出限定范围则参数小于最小值则为最小值, 参数大于最大值则为最大值
  14.     tmp = 150;
  15.     Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager, &g_test_u16), &tmp, PARAM_MIN_MAX);


  16. //方法二:
  17.     // 对参数g_test_6设置新的值50,如果超出限定范围则不处理
  18.     g_test_6 = 50;
  19.     Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager, &g_test_u16), PARAM_NONE);

  20.     // 对参数g_test_6设置新的值50,如果超出限定范围则重置为默认值
  21.     g_test_6 = 50;
  22.     Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager, &g_test_u16), PARAM_DEF);

  23.     // 对参数g_test_6设置新的值150,如果超出限定范围则参数小于最小值则为最小值, 参数大于最大值则为最大值
  24.     g_test_6 = 150;
  25.     Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager, &g_test_u16), PARAM_MIN_MAX);
  26. }
序列化 Demo 的结果展示

  1. # 配置最多支持 15 个参数时加载参数时分多次读取/保存操作打印日志
  2. load param:
  3.         read: [21] -> 12 0a 00 22 14 00 38 33 33 33 33 33 33 09 40 4a 61 62 63 64 65
  4.         read: [21] -> 66 00 00 00 00 51 08 64 6c 02 00 00 71 2d 88 05 00 00 00 00 00
  5. save param:
  6.         save: [3] -> 12 0a 00
  7.         save: [3] -> 22 14 00
  8.         save: [9] -> 38 33 33 33 33 33 33 09 40
  9.         save: [11] -> 4a 61 62 63 64 65 66 00 00 00 00
  10.         save: [2] -> 51 08
  11.         save: [5] -> 64 6c 02 00 00
  12.         save: [2] -> 71 2d
  13.         save: [9] -> 88 05 00 00 00 00 00 00 00

  14. # 配置最多支持 15 个参数时的序列化内容及长度
  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
  16. "序列化": [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

  17. # 配置最多支持 256 个参数时的序列化内容及长度
  18. "键值对序列化": [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
  19. "序列化": [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

  20. # 配置最多支持 4096 个参数时的序列化内容及长度
  21. "键值对序列化": [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
  22. "序列化": [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


4、下载链接
轻量级参数管理框架代码:https://gitee.com/const-zpc/param/tree/master







您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

6

帖子

0

粉丝
快速回复 返回顶部 返回列表