日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 大橙子瘋嵌入式


前言

上一篇介紹了初版的參數(shù)管理框架代碼功能,這一篇主要介紹這次的重大更新變化。

初版的代碼在序列化時沒有考慮到MCU小容量內(nèi)存設(shè)備,需要一次性完成序列化,內(nèi)存開銷較大等等其他問題。

介紹

紅色部分為更新后的重點(diǎn)新特性:

  • 采用表驅(qū)動方式統(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ù)據(jù)內(nèi)容少,但是后期版本迭代對參數(shù)表刪除或插入數(shù)據(jù)時不能向下兼容,只有通過在參數(shù)表后添加參數(shù)才能向下兼容

  • 通過多次讀寫儲存設(shè)備分別加載參數(shù)和保存參數(shù),更兼容小內(nèi)存的平臺使用(多次調(diào)用回調(diào)函數(shù)處理)

  • 支持在數(shù)據(jù)加載或保存時當(dāng)參數(shù)當(dāng)前值不合法(超出范圍)觸發(fā)錯誤處理回調(diào)函數(shù),有上層應(yīng)用程序決定如何處理(可以恢復(fù)默認(rèn)值)

  • 支持功能配置裁剪

  • 根據(jù)不同的平臺,可以對部分功能裁剪,或者修改配置適用于不同容量的芯片開發(fā)

  • 鍵值對的方式儲存:向下兼容較好

  • 可以選擇只支持基本類型的參數(shù)儲存功能,如字符串類型參數(shù)和64位長度的參數(shù)可裁剪

  • 支持多種操作:宏命令和函數(shù)接口

  • 大部分參數(shù)可以通過宏命令完成相關(guān)操作,如范圍校驗等

  • 函數(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 變量定義時的初值 PARAM_DEFINE_BIND_STR_RANGE(sg_tTest_str, sizeof(sg_tTest.str), "const-zpc", 6);// 為即將綁定的變量定義相關(guān)參數(shù)信息,初值為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),
};

通過宏去操作參數(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() { //方法一: // 對參數(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ù)中使用 int main() {
 PARAM_UINT16_T tmp; //方法一: // 對參數(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 個參數(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 個參數(shù)時的序列化內(nèi)容及長度
"鍵值對序列化": [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 個參數(shù)時的序列化內(nèi)容及長度
"鍵值對序列化": [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 個參數(shù)時的序列化內(nèi)容及長度
"鍵值對序列化": [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 



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉