0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

dyquk4xk2p3d 来源:大橙子疯嵌入式 2023-07-03 09:25 次阅读

初版的代码在序列化时没有考虑到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
    mcu
    +关注

    关注

    146

    文章

    16254

    浏览量

    345621
  • C语言
    +关注

    关注

    180

    文章

    7552

    浏览量

    131969

原文标题:C语言参数管理代码框架,重大更新!

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言参数管理代码框架

    这一篇主要介绍这次的重大更新变化。
    发表于 07-03 09:23 300次阅读

    AT89C51 C语言框架

    AT89C51 C语言框架
    发表于 01-13 16:00

    Web框架使用哪些编程语言

    如果你是做Web开发的,Web框架一定会很熟悉,框架是Web架构开发中必不可少的工具,不仅可以提高开发效率,还能让开发项目更成熟,并且可以提升代码的可再用性,Web框架开发离不开相应的
    发表于 03-28 16:53

    乘客管理系统C语言代码程序

    乘客管理系统C语言代码程序,乘客姓名,乘客金额,乘客下车站牌,排序,
    发表于 07-13 15:11 7次下载

    220个经典的C语言代码

    本文档中包含了220个C语言程序源代码,供网友参考。
    发表于 08-31 17:47 92次下载

    C语言图书管理系统源代码下载

    C语言图书管理系统源代码
    发表于 03-24 11:59 24次下载

    C++的框架、库和代码分析的资料大全

    C++是在C语言的基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言。应用较为广泛,是一种静态数据类型检查的,支持多重编程的通用程序设计
    发表于 04-24 18:29 3次下载
    <b class='flag-5'>C</b>++的<b class='flag-5'>框架</b>、库和<b class='flag-5'>代码</b>分析的资料大全

    使用C语言实现图书馆管理系统的源代码和函数及软件等资料合集

    本文档的主要内容详细介绍的是使用C语言实现图书馆管理系统的源代码和函数及软件等资料合集
    发表于 03-03 08:00 9次下载
    使用<b class='flag-5'>C</b><b class='flag-5'>语言</b>实现图书馆<b class='flag-5'>管理</b>系统的源<b class='flag-5'>代码</b>和函数及软件等资料合集

    AN-840: 通过I2C®接口更新代码

    AN-840: 通过I2C®接口更新代码
    发表于 03-21 02:02 10次下载
    AN-840: 通过I2<b class='flag-5'>C</b>®接口<b class='flag-5'>更新</b><b class='flag-5'>代码</b>

    嵌入式外中断c语言代码

    嵌入式外中断c语言代码(arm嵌入式开发实例)-嵌入式外中断c语言代码,有需要的可以参考!
    发表于 07-30 11:29 4次下载
    嵌入式外中断<b class='flag-5'>c</b><b class='flag-5'>语言</b><b class='flag-5'>代码</b>

    C语言冒泡排序工程代码汇总

    C语言冒泡排序工程代码汇总
    发表于 08-30 11:06 3次下载

    C语言应用】如何用C代码生成一维码?

    C语言应用】如何用C代码生成一维码?
    的头像 发表于 08-25 12:42 2192次阅读
    【<b class='flag-5'>C</b><b class='flag-5'>语言</b>应用】如何用<b class='flag-5'>C</b><b class='flag-5'>代码</b>生成一维码?

    一个基于参数更新的迁移学习的统一框架

    它提出一个基于参数更新的迁移学习的统一框架,建立多种参数优化方法之间的联系,从而方便理解不同方法背后的关键设计,进而设计出只更新更少
    的头像 发表于 09-26 10:29 1105次阅读

    178个经典c语言代码

    178个经典c语言代码分享
    发表于 11-17 16:57 170次下载

    C语言可变参数的使用详解

    c/c++语言具备一个不同于其他编程语言的的特性,即支持可变参数
    的头像 发表于 03-08 09:47 1102次阅读