學(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ò)棧的大小。
特別推薦
- 音頻放大器的 LLC 設(shè)計(jì)注意事項(xiàng)
- 服務(wù)器電源設(shè)計(jì)中的五大趨勢(shì)
- 電子技術(shù)如何助力高鐵節(jié)能?
- 利用創(chuàng)新FPGA技術(shù):實(shí)現(xiàn)USB解決方案的低功耗、模塊化與小尺寸
- 加速度傳感器不好選型?看這6個(gè)重要參數(shù)!
- 功率器件熱設(shè)計(jì)基礎(chǔ)(十三)——使用熱系數(shù)Ψth(j-top)獲取結(jié)溫信息
- IGBT并聯(lián)設(shè)計(jì)指南,拿下!
技術(shù)文章更多>>
- 解鎖AI設(shè)計(jì)潛能,ASO.ai如何革新模擬IC設(shè)計(jì)
- 汽車拋負(fù)載Load Dump
- 50%的年長(zhǎng)者可能會(huì)聽(tīng)障?!救贖的辦法在這里
- ADI 多協(xié)議工業(yè)以太網(wǎng)交換機(jī)
- 攻略:7種傾斜傳感器的設(shè)計(jì)選擇
技術(shù)白皮書(shū)下載更多>>
- 車規(guī)與基于V2X的車輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車安全隔離的新挑戰(zhàn)
- 汽車模塊拋負(fù)載的解決方案
- 車用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
功率電阻
功率放大器
功率管
功率繼電器
功率器件
共模電感
固態(tài)盤
固體繼電器
光傳感器
光電池
光電傳感器
光電二極管
光電開(kāi)關(guān)
光電模塊
光電耦合器
光電器件
光電顯示
光繼電器
光控可控硅
光敏電阻
光敏器件
光敏三極管
光收發(fā)器
光通訊器件
光纖連接器
軌道交通
國(guó)防航空
過(guò)流保護(hù)器
過(guò)熱保護(hù)
過(guò)壓保護(hù)