學(xué)了這么久的嵌入式,這個(gè)參數(shù)存儲(chǔ)訣竅你或許還不知道
發(fā)布時(shí)間:2017-03-13 責(zé)任編輯:susan
【導(dǎo)讀】如果有幾個(gè)設(shè)置參數(shù)需要存儲(chǔ)到Flash中,我們一般會(huì)怎么存儲(chǔ)呢?將不同的參數(shù)都存儲(chǔ)到不同的頁(yè)中,還是將這幾個(gè)參數(shù)捆綁成一種結(jié)構(gòu)體,每次修改都同時(shí)寫(xiě)入一次呢?
將參數(shù)存儲(chǔ)到固定的地址,則每個(gè)參數(shù)都將占用Flash的一個(gè)塊。而將全部參數(shù)捆綁一起存入Flash塊中,那么只有一個(gè)參數(shù)修改時(shí),也需要將全部參數(shù)一起存一遍。那么有什么更好的方法嗎?
前段時(shí)間學(xué)習(xí)Msos,看到其中使用的參數(shù)存儲(chǔ)的方法設(shè)計(jì)的很好,它將參數(shù)的變量地址與值,一同存儲(chǔ)入Flash中。出彩之處是使用參數(shù)的變量地址來(lái)標(biāo)記不同的變量。
一、數(shù)據(jù)結(jié)構(gòu)
這種存儲(chǔ)方式使用兩個(gè)數(shù)據(jù)結(jié)構(gòu):
typedef struct
{
uint Address; //參數(shù)變量的地址
uint Data; //參數(shù)變量的值
}CellStruct;
要存儲(chǔ)某個(gè)變量,需要將這個(gè)變量的地址和它的值一同存儲(chǔ)到存儲(chǔ)區(qū)。這種存儲(chǔ)方式的核心就是這個(gè)數(shù)據(jù)結(jié)構(gòu)。這樣就可以使用*((uint *)(Address)) = Data 直接將存儲(chǔ)值賦值給對(duì)應(yīng)的變量。簡(jiǎn)單的說(shuō)就是根據(jù)地址值來(lái)標(biāo)記各個(gè)不同的參數(shù)。
2.存儲(chǔ)區(qū)的數(shù)據(jù)結(jié)構(gòu)
typedef struct {
二、代碼解析
這種存儲(chǔ)方式的使用兩個(gè)函數(shù):
讀取存儲(chǔ)區(qū)中的變量值并更新變量的值
變量的存儲(chǔ)函數(shù)
2.1 參數(shù)的讀取
流程圖如上,主要步驟如下:
根據(jù)Flash中存寫(xiě)的變量地址,更新變量的值;
將Flash中存寫(xiě)的地址值存入臨時(shí)數(shù)組中,并根據(jù)地址值判斷是否存在重復(fù)存儲(chǔ)的無(wú)效數(shù)據(jù),并將無(wú)效數(shù)組失效;
清空Flash存儲(chǔ)區(qū),將臨時(shí)數(shù)組中有效的變量重新存入Flash中。
通過(guò)這些步驟,將存儲(chǔ)區(qū)中存儲(chǔ)的變量讀出,并將存儲(chǔ)區(qū)中的重復(fù)的無(wú)效數(shù)據(jù)清除。下面是源代碼:
2.2 參數(shù)的寫(xiě)入
參數(shù)的寫(xiě)入就很簡(jiǎn)單了,根據(jù)數(shù)據(jù)結(jié)構(gòu)中的寫(xiě)入點(diǎn),將變量的地址與值寫(xiě)入Flash中。
2.3 使用方法
使用方法:
每次上電啟動(dòng)時(shí),調(diào)用讀取全部變量的函數(shù);
修改某個(gè)參數(shù)的時(shí)候,調(diào)用寫(xiě)參數(shù)函數(shù);
三、注意事項(xiàng)
在讀取參數(shù)時(shí),需要在RAM中建立一個(gè)ParameterSpace大小的數(shù)組,如果這個(gè)值太大,會(huì)超過(guò)棧的大小,使得內(nèi)存溢出。因此存儲(chǔ)區(qū)不能開(kāi)辟的太大。
四、總結(jié)
這種方式使用簡(jiǎn)便,尤其是在更新變量值時(shí),根據(jù)存儲(chǔ)的變量地址更新相應(yīng)的值。其實(shí)其本質(zhì)與我們使用變量名來(lái)標(biāo)記不同的變量是一樣的。不過(guò)也有缺點(diǎn):
首先其同時(shí)存儲(chǔ)變量的地址與變量的值,相當(dāng)于多使用一倍的存儲(chǔ)空間;
像上面的注意事項(xiàng)中說(shuō)的,存儲(chǔ)區(qū)不能開(kāi)辟的過(guò)大,否則會(huì)使臨時(shí)數(shù)組超過(guò)棧的大小。
特別推薦
- AMTS 2025展位預(yù)訂正式開(kāi)啟——體驗(yàn)科技驅(qū)動(dòng)的未來(lái)汽車(chē)世界,共迎AMTS 20周年!
- 貿(mào)澤電子攜手安森美和Würth Elektronik推出新一代太陽(yáng)能和儲(chǔ)能解決方案
- 功率器件熱設(shè)計(jì)基礎(chǔ)(六)——瞬態(tài)熱測(cè)量
- 貿(mào)澤開(kāi)售Nordic Semiconductor nRF9151-DK開(kāi)發(fā)套件
- TDK推出用于可穿戴設(shè)備的薄膜功率電感器
- 日清紡微電子GNSS兩款新的射頻低噪聲放大器 (LNA) 進(jìn)入量產(chǎn)
- 中微半導(dǎo)推出高性價(jià)比觸控 MCU-CMS79FT72xB系列
技術(shù)文章更多>>
- 意法半導(dǎo)體推出首款超低功耗生物傳感器,成為眾多新型應(yīng)用的核心所在
- 是否存在有關(guān) PCB 走線電感的經(jīng)驗(yàn)法則?
- 智能電池傳感器的兩大關(guān)鍵部件: 車(chē)規(guī)級(jí)分流器以及匹配的評(píng)估板
- 功率器件熱設(shè)計(jì)基礎(chǔ)(八)——利用瞬態(tài)熱阻計(jì)算二極管浪涌電流
- AHTE 2025展位預(yù)訂正式開(kāi)啟——促進(jìn)新技術(shù)新理念應(yīng)用,共探多行業(yè)柔性解決方案
技術(shù)白皮書(shū)下載更多>>
- 車(chē)規(guī)與基于V2X的車(chē)輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車(chē)安全隔離的新挑戰(zhàn)
- 汽車(chē)模塊拋負(fù)載的解決方案
- 車(chē)用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門(mén)搜索
生產(chǎn)測(cè)試
聲表諧振器
聲傳感器
濕度傳感器
石英機(jī)械表
石英石危害
時(shí)間繼電器
時(shí)鐘IC
世強(qiáng)電訊
示波器
視頻IC
視頻監(jiān)控
收發(fā)器
手機(jī)開(kāi)發(fā)
受話器
數(shù)字家庭
數(shù)字家庭
數(shù)字鎖相環(huán)
雙向可控硅
水泥電阻
絲印設(shè)備
伺服電機(jī)
速度傳感器
鎖相環(huán)
胎壓監(jiān)測(cè)
太陽(yáng)能
太陽(yáng)能電池
泰科源
鉭電容
碳膜電位器