• 招生咨詢熱線:4008-569-579 
  • 手機(jī)版
    用手機(jī)掃描二維碼直達(dá)商品手機(jī)版
招生咨詢熱線
4008-569-579
機(jī)構(gòu)主頁(yè) > 培訓(xùn)資料 > 嵌入式如果解決存儲(chǔ)中的參數(shù)問(wèn)題
機(jī)構(gòu)主頁(yè) > 培訓(xùn)資料>嵌入式如果解決存儲(chǔ)中的參數(shù)問(wèn)題

嵌入式如果解決存儲(chǔ)中的參數(shù)問(wèn)題

來(lái)源:廣州達(dá)內(nèi)教育        時(shí)間:2023-05-30        熱度:28℃        返回列表

   想要學(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 ij;


  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)。

電話咨詢

電話咨詢

咨詢電話:
4008-569-579
回到頂部

回到頂部