前言
這一篇主要介紹這次的重大更新變化。
初版的代碼在序列化時沒有考慮到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_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), };
?
通過宏去操作參數示例片段代碼:
?
//?首先需要在頭文件聲明 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); //函數中使用 int?main() { //方法一: ????//?對參數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); }
?
通過函數去操作參數示例片段代碼:
?
//函數中使用 int?main() { ????PARAM_UINT16_T?tmp; //方法一: ????//?對參數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]?->?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?個參數時的序列化內容及長度 "鍵值對序列化":?[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?個參數時的序列化內容及長度 "鍵值對序列化":?[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?個參數時的序列化內容及長度 "鍵值對序列化":?[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?
?
審核編輯:湯梓紅
評論
查看更多