嵌入式代码参数管理框架(C语言)

strongerHuang 2025-09-05 12:18

关注+星标公众,不错过精彩内容

转自 | 大橙子疯嵌入式


嵌入式开发的时候,经常会有很多各种各样的参数需要管理(保存、传输等)。

今天就给大家分享一个用C语言编写的、轻量级的嵌入式代码参数管理框架。

介绍

  • 通过将已定义变量(全局变量)添加到参数表进行参数的统一管理,单个参数包括了当前值、缺省值、最小值、最大值、参数名和属性等信息。

  • 根据不同的场景添加不同要求的参数

  • 无缺省值、最小值和最大值限制,适合于记录类型的参数,比如状态数据或历史数据等

  • 有缺省值,但无最小值和最大值限制,适合于配置类型的参数

  • 有缺省值,最小值和最大值限制,适合于关键性类型的参数,比如用户参数或者关键的状态数据等

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

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

  • 支持两种参数类型

  • 数值类型intfloatdouble 等基本类型的参数

  • 字符串类型char 定义用来储存字符串的数组

  • 支持参数校验

  • 范围校验:根据参数的最大和最小值进行判断,数值类型的参数则根据数值超出范围判断。而字符串则是根据字符串长度超出范围判断。

  • 自定义校验:提供回调函数,每个参数可设置自定义的校验方式,比如某个参数需要设置为多少的倍数,或者根据其他参数决定当前参数的取值范围等。

  • 向下兼容(键值对)

  • 每个参数都需要指定唯一的ID,在后期版本迭代对参数表删除、插入或添加参数时也能向下兼容,不会影响其他参数。

  • 启用键值对后序列化的数据长度也会比较大,因为每个参数序列化时包含了ID和长度信息。

  • 可裁剪

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

使用说明

以代码进行展示,如何快速上手使用。

typedef struct
{

    uint16_t usValue;
    uint8_t ucValue;
    uint32_t uiValue;
    float fValue;
    char szString_1[12];
    double dValue;
    int16_t sValue;
    int8_t cValue;
    int32_t iValue;
    char szString_2[10];
}ParamDemo_t;

ParamDemo_t g_tTestVal = {
    .usValue = 20,
    .ucValue = 10,
    .uiValue = 1000,
    .fValue = 3.14,
    .szString_1 = "abcd",
    .dValue = 5.12,
    .sValue = -100,
    .cValue = -2,
    .iValue = 300,
    .szString_2 = "12234",
};

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

static int CheckSValue(const void *pCurParam);

cotParamInfo_t sg_ParamTable[] = {
    COT_PARAM_ITEM_BIND(1, g_tTestVal.usValue, COT_PARAM_UINT16, COT_PARAM_ATTR_WR),
    COT_PARAM_ITEM_BIND(2, g_tTestVal.ucValue, COT_PARAM_UINT8, COT_PARAM_ATTR_WR, 20),
    COT_PARAM_ITEM_BIND(3, g_tTestVal.uiValue, COT_PARAM_UINT32, COT_PARAM_ATTR_WR, 1000100010000),
    COT_PARAM_ITEM_BIND(4, g_tTestVal.fValue, COT_PARAM_FLOAT, COT_PARAM_ATTR_WR, 10-10.510.5),
    COT_PARAM_ITEM_BIND(5, g_tTestVal.szString_1, COT_PARAM_STRING, COT_PARAM_ATTR_WR, "abcd"3sizeof(g_tTestVal.szString_1)),
    COT_PARAM_ITEM_BIND(6, g_tTestVal.dValue, COT_PARAM_DOUBLE, COT_PARAM_ATTR_WR, 0-90.10100.10),
    COT_PARAM_ITEM_BIND(7, g_tTestVal.sValue, COT_PARAM_INT16, COT_PARAM_ATTR_WR, 100-200200, CheckSValue), // 添加自定义校验
    COT_PARAM_ITEM_BIND_WITH_NAME(8"g_cTest", g_cTest, COT_PARAM_INT8, COT_PARAM_ATTR_WR, 50-100100), // 另取参数名
    COT_PARAM_ITEM_BIND(9, g_szString, COT_PARAM_STRING, COT_PARAM_ATTR_WR, "XXX"36),
};

static int CheckSValue(const void *pCurParam)
{
    constint16_t *p_sValue = (constint16_t *)pCurParam;

    if ((*p_sValue) % 2 != 0)
    {
        return-1;
    }

    return0;
}


int main()
{
    cotParam_Init(&sg_tParamManager, sg_ParamTable, COT_PARAM_TABLE_SIZE(sg_ParamTable));


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

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


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

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

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

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

}

下载链接

下载链接(点击阅读原文),或更新内容可看:

https://gitee.com/cot_package/cot_param

声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

------------ END ------------


资讯配图

●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程


关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

点击“阅读原文”查看更多分享。

声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
嵌入式
more
电子与嵌入式技术年度大展(深圳)观众登记倒计时
嵌入式误操作一键撤销的优雅方案
搞嵌入式,光埋头写代码可不够,出来见见世面更重要
深圳国际电子展暨嵌入式展elexcon开幕,高通、瑞萨等企业嘉宾带来精彩分享!
嵌入式C语言枚举最后"end"有啥作用?
嵌入式产品开发中,为什么要选用核心板?
2025嵌入式开发前景的几个方向!
强烈建议嵌入式工程师尽快搞个软考证!(重大红利期)
90个嵌入式工程师需要掌握的基本概念
嵌入式代码中内联函数与宏的区别
Copyright © 2025 成都区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号