想要學(xué)習(xí)好嵌入式技術(shù)的話,那么肯定是要先了解清楚嵌入式的存儲(chǔ)參數(shù)問(wèn)題,一個(gè)產(chǎn)品中的存儲(chǔ)參數(shù)應(yīng)該要怎么存儲(chǔ),把不同的參數(shù)存儲(chǔ)到不同的網(wǎng)頁(yè)的話應(yīng)該要怎么做呢?把幾個(gè)參數(shù)一起捆綁成一個(gè)參數(shù)的話應(yīng)該要怎么做呢?這些都是想要學(xué)習(xí)好嵌入式參數(shù)問(wèn)題的學(xué)員應(yīng)該要把握好的,下面達(dá)內(nèi)科技的小編就給大家講解下。
一、數(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ù)。
二、代碼解析
這種存儲(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ù)清除。下面是源代碼:
#define pUint(address) *((uint *)(address)) #define PageSize 1024 //Stm32F103R8T6 1Page=1024Byte #define ParameterAddress (FLASH_base + (63 * 1024)) #define ParameterSpace PageSize / 4 / 2 static void ReadAllParameter(void) { bool CleanFlag; int i, j;
2.2 參數(shù)的寫(xiě)入
參數(shù)的寫(xiě)入就很簡(jiǎn)單了,根據(jù)數(shù)據(jù)結(jié)構(gòu)中的寫(xiě)入點(diǎn),將變量的地址與值寫(xiě)入Flash中。
static bool WriteParameter(void * dataPointer) {
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ò)棧的大小。
關(guān)于嵌入式如何解決存儲(chǔ)中的參數(shù)問(wèn)題的話,達(dá)內(nèi)科技的小編就給大家講解到這里了,想要學(xué)習(xí)好嵌入式技術(shù)的話還是要經(jīng)過(guò)系統(tǒng)性的學(xué)習(xí)才可以掌握好的。達(dá)內(nèi)科技?xì)g迎每位想要學(xué)習(xí)嵌入式技術(shù)的學(xué)員來(lái)我們公司的嵌入式培訓(xùn)班進(jìn)行實(shí)地考察,或者是也可以點(diǎn)擊我們文章下面的獲取試聽(tīng)資格按鈕來(lái)獲取我們的嵌入式課程免費(fèi)試聽(tīng)資格,來(lái)和我們的講師進(jìn)行面對(duì)面的交流和互動(dòng)。
~嵌入式如果解決存儲(chǔ)中的參數(shù)問(wèn)題?
想要學(xué)習(xí)好嵌入式技術(shù)的話,那么肯定是要先了解清楚嵌入式的存儲(chǔ)參數(shù)問(wèn)題,一個(gè)產(chǎn)品中的存儲(chǔ)參數(shù)應(yīng)該要怎么存儲(chǔ),把不同的參數(shù)存儲(chǔ)到不同的網(wǎng)頁(yè)的話應(yīng)該要怎么做呢?把幾個(gè)參數(shù)一起捆綁成一個(gè)參數(shù)的話應(yīng)該要怎么做呢?這些都是想要學(xué)習(xí)好嵌入式參數(shù)問(wèn)題的學(xué)員應(yīng)該要把握好的,下面達(dá)內(nèi)科技的小編就給大家講解下。
一、數(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ù)。
二、代碼解析
這種存儲(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ù)清除。下面是源代碼:
#define pUint(address) *((uint *)(address)) #define PageSize 1024 //Stm32F103R8T6 1Page=1024Byte #define ParameterAddress (FLASH_base + (63 * 1024)) #define ParameterSpace PageSize / 4 / 2 static void ReadAllParameter(void) { bool CleanFlag; int i, j;
2.2 參數(shù)的寫(xiě)入
參數(shù)的寫(xiě)入就很簡(jiǎn)單了,根據(jù)數(shù)據(jù)結(jié)構(gòu)中的寫(xiě)入點(diǎn),將變量的地址與值寫(xiě)入Flash中。
static bool WriteParameter(void * dataPointer) {
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ò)棧的大小。
關(guān)于嵌入式如何解決存儲(chǔ)中的參數(shù)問(wèn)題的話,達(dá)內(nèi)科技的小編就給大家講解到這里了,想要學(xué)習(xí)好嵌入式技術(shù)的話還是要經(jīng)過(guò)系統(tǒng)性的學(xué)習(xí)才可以掌握好的。達(dá)內(nèi)科技?xì)g迎每位想要學(xué)習(xí)嵌入式技術(shù)的學(xué)員來(lái)我們公司的嵌入式培訓(xùn)班進(jìn)行實(shí)地考察,或者是也可以點(diǎn)擊我們文章下面的獲取試聽(tīng)資格按鈕來(lái)獲取我們的嵌入式課程免費(fèi)試聽(tīng)資格,來(lái)和我們的講師進(jìn)行面對(duì)面的交流和互動(dòng)。