0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言參數(shù)管理代碼框架更新

dyquk4xk2p3d ? 來源:大橙子瘋嵌入式 ? 2023-07-03 09:25 ? 次閱讀

初版的代碼在序列化時(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




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16705

    瀏覽量

    348033
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134442

原文標(biāo)題:C語言參數(shù)管理代碼框架,重大更新!

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言參數(shù)管理代碼框架

    這一篇主要介紹這次的重大更新變化。
    發(fā)表于 07-03 09:23 ?331次閱讀

    AT89C51 C語言框架

    AT89C51 C語言框架
    發(fā)表于 01-13 16:00

    Web框架使用哪些編程語言?

    如果你是做Web開發(fā)的,Web框架一定會很熟悉,框架是Web架構(gòu)開發(fā)中必不可少的工具,不僅可以提高開發(fā)效率,還能讓開發(fā)項(xiàng)目更成熟,并且可以提升代碼的可再用性,Web框架開發(fā)離不開相應(yīng)的
    發(fā)表于 03-28 16:53

    乘客管理系統(tǒng)C語言代碼程序

    乘客管理系統(tǒng)C語言代碼程序,乘客姓名,乘客金額,乘客下車站牌,排序,
    發(fā)表于 07-13 15:11 ?7次下載

    C語言圖書管理系統(tǒng)源代碼下載

    C語言圖書管理系統(tǒng)源代碼
    發(fā)表于 03-24 11:59 ?24次下載

    C++的框架、庫和代碼分析的資料大全

    C++是在C語言的基礎(chǔ)上開發(fā)的一種集面向?qū)ο缶幊?、泛型編程和過程化編程于一體的編程語言。應(yīng)用較為廣泛,是一種靜態(tài)數(shù)據(jù)類型檢查的,支持多重編程的通用程序設(shè)計(jì)
    發(fā)表于 04-24 18:29 ?3次下載
    <b class='flag-5'>C</b>++的<b class='flag-5'>框架</b>、庫和<b class='flag-5'>代碼</b>分析的資料大全

    使用C語言實(shí)現(xiàn)圖書館管理系統(tǒng)的源代碼和函數(shù)及軟件等資料合集

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用C語言實(shí)現(xiàn)圖書館管理系統(tǒng)的源代碼和函數(shù)及軟件等資料合集
    發(fā)表于 03-03 08:00 ?9次下載
    使用<b class='flag-5'>C</b><b class='flag-5'>語言</b>實(shí)現(xiàn)圖書館<b class='flag-5'>管理</b>系統(tǒng)的源<b class='flag-5'>代碼</b>和函數(shù)及軟件等資料合集

    AN-840: 通過I2C?接口更新代碼

    AN-840: 通過I2C?接口更新代碼
    發(fā)表于 03-21 02:02 ?10次下載
    AN-840: 通過I2<b class='flag-5'>C</b>?接口<b class='flag-5'>更新</b><b class='flag-5'>代碼</b>

    嵌入式外中斷c語言代碼

    嵌入式外中斷c語言代碼(arm嵌入式開發(fā)實(shí)例)-嵌入式外中斷c語言代碼,有需要的可以參考!
    發(fā)表于 07-30 11:29 ?4次下載
    嵌入式外中斷<b class='flag-5'>c</b><b class='flag-5'>語言</b><b class='flag-5'>代碼</b>

    C語言冒泡排序工程代碼匯總

    C語言冒泡排序工程代碼匯總
    發(fā)表于 08-30 11:06 ?3次下載

    C語言應(yīng)用】如何用C代碼生成一維碼?

    C語言應(yīng)用】如何用C代碼生成一維碼?
    的頭像 發(fā)表于 08-25 12:42 ?2322次閱讀
    【<b class='flag-5'>C</b><b class='flag-5'>語言</b>應(yīng)用】如何用<b class='flag-5'>C</b><b class='flag-5'>代碼</b>生成一維碼?

    一個(gè)基于參數(shù)更新的遷移學(xué)習(xí)的統(tǒng)一框架

    它提出一個(gè)基于參數(shù)更新的遷移學(xué)習(xí)的統(tǒng)一框架,建立多種參數(shù)優(yōu)化方法之間的聯(lián)系,從而方便理解不同方法背后的關(guān)鍵設(shè)計(jì),進(jìn)而設(shè)計(jì)出只更新更少
    的頭像 發(fā)表于 09-26 10:29 ?1203次閱讀

    178個(gè)經(jīng)典c語言代碼

    178個(gè)經(jīng)典c語言代碼分享
    發(fā)表于 11-17 16:57 ?173次下載

    C語言可變參數(shù)的使用詳解

    c/c++語言具備一個(gè)不同于其他編程語言的的特性,即支持可變參數(shù)。
    的頭像 發(fā)表于 03-08 09:47 ?1508次閱讀

    hex文件如何查看原c語言代碼

    直接將 .hex 文件轉(zhuǎn)換回原始的 C 語言代碼是不可能的,因?yàn)?.hex 文件是二進(jìn)制文件,它包含了單片機(jī)程序編譯后的機(jī)器碼,這些機(jī)器碼與原始的 C
    的頭像 發(fā)表于 09-02 10:37 ?365次閱讀