[MM32软件] 嵌入式代码参数管理框架(C语言)

[复制链接]
 楼主| 呐咯密密 发表于 2024-1-30 10:39 | 显示全部楼层 |阅读模式
[color=rgba(0, 0, 0, 0.9)]嵌入式开发的时候,经常会有很多各种各样的参数需要管理(保存、传输等)。
[color=rgba(0, 0, 0, 0.9)]今天就给大家分享一个用C语言编写的、轻量级的嵌入式代码参数管理框架。
  • 无缺省值、最小值和最大值限制,适合于记录类型的参数,比如状态数据或历史数据等
  • 有缺省值,但无最小值和最大值限制,适合于配置类型的参数
  • 有缺省值,最小值和最大值限制,适合于关键性类型的参数,比如用户参数或者关键的状态数据等

  • 同时若单个参数表无法满足参数数目或者参数分类管理,可定义多张参数表

  • 每张参数表中的参数ID唯一,不可重复;不同参数表ID可以重复定义

  • 支持两种参数类型

  • 数值类型:int、[color=var(--weui-LINK)][url=]float[/url]、double 等基本类型的参数
  • 字符串类型:[color=var(--weui-LINK)][url=]char[/url] 定义用来储存字符串的数组

  • 支持参数校验

  • 范围校验:根据参数的最大和最小值进行判断,数值类型的参数则根据数值超出范围判断。而字符串则是根据字符串长度超出范围判断。
  • 自定义校验:提供回调函数,每个参数可设置自定义的校验方式,比如某个参数需要设置为多少的倍数,或者根据其他参数决定当前参数的取值范围等。

  • 向下兼容(键值对)

  • 每个参数都需要指定唯一的ID,在后期版本迭代对参数表删除、插入或添加参数时也能向下兼容,不会影响其他参数。
  • 启用键值对后序列化的数据长度也会比较大,因为每个参数序列化时包含了ID和长度信息。

  • 可裁剪

[color=rgba(0, 0, 0, 0.9)]
  • 根据不同的平台,可以对部分功能裁剪,或者修改配置适用于不同容量的芯片进行开发。


 楼主| 呐咯密密 发表于 2024-1-30 10:40 | 显示全部楼层
使用说明
  1. typedef struct
  2. {
  3.     uint16_t usValue;
  4.     uint8_t ucValue;
  5.     uint32_t uiValue;
  6.     float fValue;
  7.     char szString_1[12];
  8.     double dValue;
  9.     int16_t sValue;
  10.     int8_t cValue;
  11.     int32_t iValue;
  12.     char szString_2[10];
  13. }ParamDemo_t;

  14. ParamDemo_t g_tTestVal = {
  15.     .usValue = 20,
  16.     .ucValue = 10,
  17.     .uiValue = 1000,
  18.     .fValue = 3.14,
  19.     .szString_1 = "abcd",
  20.     .dValue = 5.12,
  21.     .sValue = -100,
  22.     .cValue = -2,
  23.     .iValue = 300,
  24.     .szString_2 = "12234",
  25. };

  26. int8_t g_cTest = 50;
  27. char g_szString[10] = "qwer";

  28. static int CheckSValue(const void *pCurParam);

  29. cotParamInfo_t sg_ParamTable[] = {
  30.     COT_PARAM_ITEM_BIND(1, g_tTestVal.usValue, COT_PARAM_UINT16, COT_PARAM_ATTR_WR),
  31.     COT_PARAM_ITEM_BIND(2, g_tTestVal.ucValue, COT_PARAM_UINT8, COT_PARAM_ATTR_WR, 20),
  32.     COT_PARAM_ITEM_BIND(3, g_tTestVal.uiValue, COT_PARAM_UINT32, COT_PARAM_ATTR_WR, 1000, 1000, 10000),
  33.     COT_PARAM_ITEM_BIND(4, g_tTestVal.fValue, COT_PARAM_FLOAT, COT_PARAM_ATTR_WR, 10, -10.5, 10.5),
  34.     COT_PARAM_ITEM_BIND(5, g_tTestVal.szString_1, COT_PARAM_STRING, COT_PARAM_ATTR_WR, "abcd", 3, sizeof(g_tTestVal.szString_1)),
  35.     COT_PARAM_ITEM_BIND(6, g_tTestVal.dValue, COT_PARAM_DOUBLE, COT_PARAM_ATTR_WR, 0, -90.10, 100.10),
  36.     COT_PARAM_ITEM_BIND(7, g_tTestVal.sValue, COT_PARAM_INT16, COT_PARAM_ATTR_WR, 100, -200, 200, CheckSValue), // 添加自定义校验
  37.     COT_PARAM_ITEM_BIND_WITH_NAME(8, "g_cTest", g_cTest, COT_PARAM_INT8, COT_PARAM_ATTR_WR, 50, -100, 100), // 另取参数名
  38.     COT_PARAM_ITEM_BIND(9, g_szString, COT_PARAM_STRING, COT_PARAM_ATTR_WR, "XXX", 3, 6),
  39. };

  40. static int CheckSValue(const void *pCurParam)
  41. {
  42.     const int16_t *p_sValue = (const int16_t *)pCurParam;

  43.     if ((*p_sValue) % 2 != 0)
  44.     {
  45.         return -1;
  46.     }

  47.     return 0;
  48. }


  49. int main()
  50. {
  51.     cotParam_Init(&sg_tParamManager, sg_ParamTable, COT_PARAM_TABLE_SIZE(sg_ParamTable));


  52.     // 对某个变量当前参数进行范围校验,得到校验结果后自行处理
  53.     cotParam_SingleParamSelfCheck(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3), &eCheckResult);

  54.     if (eCheckResult != COT_PARAM_CHECK_OK) // 修改后检查
  55.     {
  56.         cotParam_SingleParamResetDefValue(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3)); // 如果校验失败,则恢复为默认值
  57.     }


  58.     // 对某个变量参数变更后(当前值已经变化)进行校验处理,若超出范围则恢复默认
  59.     g_test_3 = 1000;
  60.     cotParam_SingleParamCheckProcess(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3), COT_PARAM_RESET_DEF);

  61.     // 对某个变量参数在需要变更前(当前值没有变化)进行校验处理,得到校验结果后自行处理
  62.     double tmp = 1000;
  63.     cotParam_SingleParamCheckInput(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3), &tmp, &eCheckResult);

  64.     if (eCheckResult == COT_PARAM_CHECK_OK)
  65.     {
  66.         g_test_3 = tmp;// 如果校验成功,则修改
  67.     }

  68.     // 对某个变量参数在需要变更前(当前值没有变化)进行校验处理,若新的值超出范围则不更新变量参数当前的值
  69.     double tmp = 1000;
  70.     cotParam_SingleParamUpdate(cotParam_FindParamByParamPtr(&sg_tParamManager, &g_test_3), &tmp, COT_PARAM_RESET_NONE)

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

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4086

帖子

56

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