初版的代碼在序列化時(shí)沒有考慮到MCU小容量內(nèi)存設(shè)備,需要一次性完成序列化,內(nèi)存開銷較大等等其他問題。
介紹
紅色部分為更新后的重點(diǎn)新特性:
采用表驅(qū)動(dòng)方式統(tǒng)一管理所有參數(shù),包括缺省值、最小值和最大值等
支持定義普通參數(shù),無缺省值、最小值和最大值限制
支持定義普通參數(shù),有缺省值,但無最小值和最大值限制
支持定義普通參數(shù),有缺省值,最小值和最大值限制
采用宏定義快速對參數(shù)進(jìn)行定義、注冊和管理
支持已定義變量做為參數(shù)進(jìn)行管理,如全局變量或者結(jié)構(gòu)體成員變量
支持基本類型參數(shù)和字符串參數(shù)
支持序列化和反序列化操作,可在本地儲存設(shè)備保存/讀取二進(jìn)制數(shù)據(jù)
支持鍵值對的方式儲存,即使后期版本迭代對參數(shù)表刪除/插入數(shù)據(jù)時(shí)也能向下兼容
支持非鍵值對的方式儲存,適合小容量的儲存設(shè)備,序列化后的數(shù)據(jù)內(nèi)容少,但是后期版本迭代對參數(shù)表刪除或插入數(shù)據(jù)時(shí)不能向下兼容,只有通過在參數(shù)表后添加參數(shù)才能向下兼容
通過多次讀寫儲存設(shè)備分別加載參數(shù)和保存參數(shù),更兼容小內(nèi)存的平臺使用(多次調(diào)用回調(diào)函數(shù)處理)
支持在數(shù)據(jù)加載或保存時(shí)當(dāng)參數(shù)當(dāng)前值不合法(超出范圍)觸發(fā)錯(cuò)誤處理回調(diào)函數(shù),有上層應(yīng)用程序決定如何處理(可以恢復(fù)默認(rèn)值)
支持功能配置裁剪
根據(jù)不同的平臺,可以對部分功能裁剪,或者修改配置適用于不同容量的芯片開發(fā)
鍵值對的方式儲存:向下兼容較好
可以選擇只支持基本類型的參數(shù)儲存功能,如字符串類型參數(shù)和64位長度的參數(shù)可裁剪
支持多種操作:宏命令和函數(shù)接口
大部分參數(shù)可以通過宏命令完成相關(guān)操作,如范圍校驗(yàn)等
函數(shù)部分可以用于自己實(shí)現(xiàn)其他功能使用,如參數(shù)顯示、參數(shù)與上位機(jī)交互等
根據(jù)不同場景使用不同的方式進(jìn)行處理
代碼示例
定義參數(shù)表:
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);//為即將綁定的變量定義相關(guān)參數(shù)信息 PARAM_DEFINE_BIND_DAT(sg_tTest_test2,PARAM_FLOAT);//為即將綁定的變量定義相關(guān)參數(shù)信息,初值為sg_tTest變量定義時(shí)的初值 PARAM_DEFINE_BIND_STR_RANGE(sg_tTest_str,sizeof(sg_tTest.str),"const-zpc",6);//為即將綁定的變量定義相關(guān)參數(shù)信息,初值為sg_tTest變量定義時(shí)的初值 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), };
通過宏去操作參數(shù)示例片段代碼:
//首先需要在頭文件聲明 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); //函數(shù)中使用 intmain() { //方法一: //對參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則不處理 PARAM_DAT_SET_NEW_VALUE(g_test_6,50,PARAM_NONE); //對參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則重置為默認(rèn)值 PARAM_DAT_SET_NEW_VALUE(g_test_6,50,PARAM_DEF); //對參數(shù)g_test_6設(shè)置新的值150,如果超出限定范圍則參數(shù)小于最小值則為最小值,參數(shù)大于最大值則為最大值 PARAM_DAT_SET_NEW_VALUE(g_test_6,150,PARAM_MIN_MAX); //方法二: //對參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則不處理 g_test_6=50; PARAM_DAT_CHECK_RANGE(g_test_6,PARAM_NONE); //對參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則重置為默認(rèn)值 g_test_6=50; PARAM_DAT_CHECK_RANGE(g_test_6,PARAM_DEF); //對參數(shù)g_test_6設(shè)置新的值150,如果超出限定范圍則參數(shù)小于最小值則為最小值,參數(shù)大于最大值則為最大值 g_test_6=150; PARAM_DAT_CHECK_RANGE(g_test_6,PARAM_MIN_MAX); }
通過函數(shù)去操作參數(shù)示例片段代碼:
//函數(shù)中使用 intmain() { PARAM_UINT16_Ttmp; //方法一: //對參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則不處理 tmp=50; Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),&tmp,PARAM_NONE); //對參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則重置為默認(rèn)值 tmp=50; Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),&tmp,PARAM_DEF); //對參數(shù)g_test_6設(shè)置新的值150,如果超出限定范圍則參數(shù)小于最小值則為最小值,參數(shù)大于最大值則為最大值 tmp=150; Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),&tmp,PARAM_MIN_MAX); //方法二: //對參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則不處理 g_test_6=50; Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),PARAM_NONE); //對參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則重置為默認(rèn)值 g_test_6=50; Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),PARAM_DEF); //對參數(shù)g_test_6設(shè)置新的值150,如果超出限定范圍則參數(shù)小于最小值則為最小值,參數(shù)大于最大值則為最大值 g_test_6=150; Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager,&g_test_u16),PARAM_MIN_MAX); }
序列化 Demo 的結(jié)果展示:
#配置最多支持15個(gè)參數(shù)時(shí)加載參數(shù)時(shí)分多次讀取/保存操作打印日志 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個(gè)參數(shù)時(shí)的序列化內(nèi)容及長度 "鍵值對序列化":[44]->120a002214003833333333333309404a616263646566000000005108646c020000712d880500000000000000 "序列化":[36]->500014003333333333330940675f746573745f360000006c0200002d0500000000000000 #配置最多支持256個(gè)參數(shù)時(shí)的序列化內(nèi)容及長度 "鍵值對序列化":[52]->02010a0002021400080333333333333309400a046162636465660000000001050804066c02000001072d08080500000000000000 "序列化":[36]->500014003333333333330940675f746573745f360000006c0200002d0500000000000000 #配置最多支持4096個(gè)參數(shù)時(shí)的序列化內(nèi)容及長度 "鍵值對序列化":[60]->0210000a00022000140008300033333333333309400a400061626364656600000000015000080460006c0200000170002d0880000500000000000000 "序列化":[36]->500014003333333333330940675f746573745f360000006c0200002d0500000000000000
審核編輯:劉清
-
mcu
+關(guān)注
關(guān)注
146文章
17263瀏覽量
351978 -
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137279
原文標(biāo)題:C語言參數(shù)管理代碼框架,重大更新!
文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論