C語(yǔ)言參數(shù)管理代碼框架
掃描二維碼
隨時(shí)隨地手機(jī)看文章
前言
作為嵌入式的軟件開(kāi)發(fā)工程師,基本都會(huì)對(duì)參數(shù)的概念都不會(huì)陌生。
很多功能使用的變量都需要在程序運(yùn)行過(guò)程中改變,掉電重啟后還需要恢復(fù)原來(lái)的狀態(tài),就需要這些變量能夠保存起來(lái),寫入flash或eeprom等儲(chǔ)存芯片中,待程序重新運(yùn)行時(shí)讀取,這部分保存起來(lái)的變量通常稱為參數(shù)。
參數(shù)可區(qū)分功能性配置、性能配置和軟件內(nèi)部實(shí)現(xiàn);功能性配置和性能配置參數(shù)是指給提供客戶關(guān)閉功能,配置性能的配置。
軟件內(nèi)部實(shí)現(xiàn)的參數(shù)配置,一般用于研發(fā)內(nèi)部客戶或維護(hù)部門故障排查和維護(hù),不隨意提供給外部。
外部的功能和性能配置參數(shù),可提供客戶進(jìn)行修改,部分對(duì)于重要參數(shù)或因?yàn)樯虅?wù)原因,一般建議提供加密方法(不可見(jiàn)或超級(jí)管理員密碼設(shè)置),不建議讓客戶隨意配置
當(dāng)然,參數(shù)并不是簡(jiǎn)單的保存和讀取恢復(fù),由于參數(shù)通常關(guān)系到軟件的運(yùn)行狀態(tài),因此對(duì)參數(shù)這部分的處理自然與普通變量有所不同,通常需要對(duì)參數(shù)從儲(chǔ)存芯片中讀取后做校驗(yàn),防止掉電寫入后的數(shù)據(jù)發(fā)生變化;
常規(guī)做法就是判斷參數(shù)的取值范圍,一旦超出范圍,就需要缺省值恢復(fù),防止程序運(yùn)行出現(xiàn)嚴(yán)重異常問(wèn)題。
介紹
參數(shù)管理框架代碼,代碼主要特點(diǎn)有:
采用表驅(qū)動(dòng)方式統(tǒng)一管理所有參數(shù),包括缺省值、最小值和最大值等
采用宏定義快速注冊(cè)和添加參數(shù)進(jìn)行管理
支持基本類型參數(shù)和字符串參數(shù)
支持序列化和反序列化,便于保存和讀取校驗(yàn)
可通過(guò)串口協(xié)議或其他協(xié)議調(diào)用接口修改參數(shù)
代碼示例
部分demo代碼如下,閱讀全部代碼可下載源碼。
PARAM_DEFINE (test, PARAM_INT16, 10, -100, 100); PARAM_DEFINE (test_2, PARAM_UINT16, 20, 0, 100); PARAM_DEFINE (test_3, PARAM_DOUBLE, 3.15, -10.5, 10.5); PARAM_DEFINE_STR (test_str, 10, "abcdef"); const ParamInfo_t sg_tParamList[]= { PARAM_REG(1, test, PARAM_INT16), PARAM_REG(2, test_2, PARAM_UINT16), PARAM_REG(3, test_3, PARAM_DOUBLE), PARAM_STR_REG(4, test_str), }; static ParamTable_t sg_tParamTable = {sg_tParamList, sizeof(sg_tParamList) / sizeof(sg_tParamList[0])}; int main () { uint32_t data = 16; double fdata = 7.25; uint8_t databuf[8]; InitAllParam(); ShowAllParam(); printf("\nModify: \n"); memcpy(databuf, &data, sizeof(data)); ModifyByName("test_2", databuf); memcpy(databuf, &fdata, sizeof(fdata)); ModifyByName("test_3", databuf); ShowAllParam(); printf("\nReset: \n"); ResetParam(); ShowAllParam(); return 0; }
下載鏈接
下載鏈接(點(diǎn)擊閱讀原文):https://gitee.com/const-zpc/param/tree/master





