C語言參數管理代碼框架 焦點熱訊

2023-07-03 09:04:21 來源:良許Linux

前言

這一篇主要介紹這次的重大更新變化。

初版的代碼在序列化時沒有考慮到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]->120a002214003833333333333309404a6162636465read:[21]->66000000005108646c020000712d88050000000000save param:save:[3]->120a00save:[3]->221400save:[9]->383333333333330940save:[11]->4a61626364656600000000save:[2]->5108save:[5]->646c020000save:[2]->712dsave:[9]->880500000000000000#配置最多支持15個參數時的序列化內容及長度"鍵值對序列化":[44]->120a002214003833333333333309404a616263646566000000005108646c020000712d880500000000000000"序列化":[36]->500014003333333333330940675f746573745f360000006c0200002d0500000000000000#配置最多支持256個參數時的序列化內容及長度"鍵值對序列化":[52]->02010a0002021400080333333333333309400a046162636465660000000001050804066c02000001072d08080500000000000000"序列化":[36]->500014003333333333330940675f746573745f360000006c0200002d0500000000000000#配置最多支持4096個參數時的序列化內容及長度"鍵值對序列化":[60]->0210000a00022000140008300033333333333309400a400061626364656600000000015000080460006c0200000170002d0880000500000000000000"序列化":[36]->500014003333333333330940675f746573745f360000006c0200002d0500000000000000

審核編輯:湯梓紅

標簽:

上一篇:ARM SCP入門-簡介和代碼下載編譯
下一篇:最后一頁