前言
這一篇主要介紹這次的重大更新變化。
初版的代碼在序列化時(shí)沒有考慮到MCU小容量?jī)?nèi)存設(shè)備,需要一次性完成序列化,內(nèi)存開銷較大等等其他問題。
介紹
紅色部分為更新后的重點(diǎn)新特性:
采用表驅(qū)動(dòng)方式統(tǒng)一管理所有參數(shù),包括缺省值、最小值和最大值等
支持定義普通參數(shù),無缺省值、最小值和最大值限制
支持定義普通參數(shù),有缺省值,但無最小值和最大值限制
支持定義普通參數(shù),有缺省值,最小值和最大值限制
采用宏定義快速對(duì)參數(shù)進(jìn)行定義、注冊(cè)和管理
支持已定義變量做為參數(shù)進(jìn)行管理,如全局變量或者結(jié)構(gòu)體成員變量
支持基本類型參數(shù)和字符串參數(shù)
支持序列化和反序列化操作,可在本地儲(chǔ)存設(shè)備保存/讀取二進(jìn)制數(shù)據(jù)
支持鍵值對(duì)的方式儲(chǔ)存,即使后期版本迭代對(duì)參數(shù)表刪除/插入數(shù)據(jù)時(shí)也能向下兼容
支持非鍵值對(duì)的方式儲(chǔ)存,適合小容量的儲(chǔ)存設(shè)備,序列化后的數(shù)據(jù)內(nèi)容少,但是后期版本迭代對(duì)參數(shù)表刪除或插入數(shù)據(jù)時(shí)不能向下兼容,只有通過在參數(shù)表后添加參數(shù)才能向下兼容
通過多次讀寫儲(chǔ)存設(shè)備分別加載參數(shù)和保存參數(shù),更兼容小內(nèi)存的平臺(tá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ù)不同的平臺(tái),可以對(duì)部分功能裁剪,或者修改配置適用于不同容量的芯片開發(fā)
鍵值對(duì)的方式儲(chǔ)存:向下兼容較好
可以選擇只支持基本類型的參數(shù)儲(chǔ)存功能,如字符串類型參數(shù)和64位長(zhǎng)度的參數(shù)可裁剪
支持多種操作:宏命令和函數(shù)接口
大部分參數(shù)可以通過宏命令完成相關(guān)操作,如范圍校驗(yàn)等
函數(shù)部分可以用于自己實(shí)現(xiàn)其他功能使用,如參數(shù)顯示、參數(shù)與上位機(jī)交互等
根據(jù)不同場(chǎng)景使用不同的方式進(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_t?sg_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ù)中使用 int?main() { //方法一: ????//?對(duì)參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則不處理 ????PARAM_DAT_SET_NEW_VALUE(g_test_6,?50,?PARAM_NONE); ????//?對(duì)參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則重置為默認(rèn)值 ????PARAM_DAT_SET_NEW_VALUE(g_test_6,?50,?PARAM_DEF); ????//?對(duì)參數(shù)g_test_6設(shè)置新的值150,如果超出限定范圍則參數(shù)小于最小值則為最小值,?參數(shù)大于最大值則為最大值 ????PARAM_DAT_SET_NEW_VALUE(g_test_6,?150,?PARAM_MIN_MAX); //方法二: ????//?對(duì)參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則不處理 ????g_test_6?=?50; ????PARAM_DAT_CHECK_RANGE(g_test_6,?PARAM_NONE); ????//?對(duì)參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則重置為默認(rèn)值 ????g_test_6?=?50; ????PARAM_DAT_CHECK_RANGE(g_test_6,?PARAM_DEF); ????//?對(duì)參數(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ù)中使用 int?main() { ????PARAM_UINT16_T?tmp; //方法一: ????//?對(duì)參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則不處理 ????tmp?=?50; ????Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager,?&g_test_u16),?&tmp,?PARAM_NONE); ????//?對(duì)參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則重置為默認(rèn)值 ????tmp?=?50; ????Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager,?&g_test_u16),?&tmp,?PARAM_DEF); ????//?對(duì)參數(shù)g_test_6設(shè)置新的值150,如果超出限定范圍則參數(shù)小于最小值則為最小值,?參數(shù)大于最大值則為最大值 ????tmp?=?150; ????Param_SetNewValue(Param_FindParamByParamPtr(&sg_tParamManager,?&g_test_u16),?&tmp,?PARAM_MIN_MAX); //方法二: ????//?對(duì)參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則不處理 ????g_test_6?=?50; ????Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager,?&g_test_u16),?PARAM_NONE); ????//?對(duì)參數(shù)g_test_6設(shè)置新的值50,如果超出限定范圍則重置為默認(rèn)值 ????g_test_6?=?50; ????Param_CheckRange(Param_FindParamByParamPtr(&sg_tParamManager,?&g_test_u16),?PARAM_DEF); ????//?對(duì)參數(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]?->?12?0a?00?22?14?00?38?33?33?33?33?33?33?09?40?4a?61?62?63?64?65 ????????read:?[21]?->?66?00?00?00?00?51?08?64?6c?02?00?00?71?2d?88?05?00?00?00?00?00? save param: ????????save:?[3]?->?12?0a?00 ????????save:?[3]?->?22?14?00 ????????save:?[9]?->?38?33?33?33?33?33?33?09?40 ????????save:?[11]?->?4a?61?62?63?64?65?66?00?00?00?00 ????????save:?[2]?->?51?08 ????????save:?[5]?->?64?6c?02?00?00 ????????save:?[2]?->?71?2d ????????save:?[9]?->?88?05?00?00?00?00?00?00?00 #?配置最多支持?15?個(gè)參數(shù)時(shí)的序列化內(nèi)容及長(zhǎng)度 "鍵值對(duì)序列化":?[44]?->?12?0a?00?22?14?00?38?33?33?33?33?33?33?09?40?4a?61?62?63?64?65?66?00?00?00?00?51?08?64?6c?02?00?00?71?2d?88?05?00?00?00?00?00?00?00 "序列化":?[36]?->?50?00?14?00?33?33?33?33?33?33?09?40?67?5f?74?65?73?74?5f?36?00?00?00?6c?02?00?00?2d?05?00?00?00?00?00?00?00? #?配置最多支持?256?個(gè)參數(shù)時(shí)的序列化內(nèi)容及長(zhǎng)度 "鍵值對(duì)序列化":?[52]?->?02?01?0a?00?02?02?14?00?08?03?33?33?33?33?33?33?09?40?0a?04?61?62?63?64?65?66?00?00?00?00?01?05?08?04?06?6c?02?00?00?01?07?2d?08?08?05?00?00?00?00?00?00?00 "序列化":?[36]?->?50?00?14?00?33?33?33?33?33?33?09?40?67?5f?74?65?73?74?5f?36?00?00?00?6c?02?00?00?2d?05?00?00?00?00?00?00?00? #?配置最多支持?4096?個(gè)參數(shù)時(shí)的序列化內(nèi)容及長(zhǎng)度 "鍵值對(duì)序列化":?[60]?->?02?10?00?0a?00?02?20?00?14?00?08?30?00?33?33?33?33?33?33?09?40?0a?40?00?61?62?63?64?65?66?00?00?00?00?01?50?00?08?04?60?00?6c?02?00?00?01?70?00?2d?08?80?00?05?00?00?00?00?00?00?00 "序列化":?[36]?->?50?00?14?00?33?33?33?33?33?33?09?40?67?5f?74?65?73?74?5f?36?00?00?00?6c?02?00?00?2d?05?00?00?00?00?00?00?00?
?
審核編輯:湯梓紅
評(píng)論
查看更多