在使用MCU時(shí),通常大家默認(rèn)MCU復(fù)位時(shí)RAM會(huì)被復(fù)位清零,那實(shí)際MCU復(fù)位時(shí)RAM是什么狀態(tài)?如何讓mcu復(fù)位時(shí)RAM保持不變呢?
MCU復(fù)位有電源復(fù)位、Standby復(fù)位、內(nèi)核復(fù)位、看門(mén)狗復(fù)位、引腳復(fù)位等。

其中內(nèi)部會(huì)有掉電動(dòng)作的復(fù)位有電源復(fù)位和Standby復(fù)位,由于內(nèi)部電路有掉電所以這些復(fù)位RAM是無(wú)法保持的,RAM會(huì)處于隨機(jī)值狀態(tài),實(shí)際也不是0值。其他復(fù)位由于不掉電,本質(zhì)上是不會(huì)直接復(fù)位RAM的。
那為什么一般執(zhí)行了軟件復(fù)位和看門(mén)狗復(fù)位后RAM會(huì)復(fù)位,沒(méi)有初始化的變量值變成0呢?實(shí)際上是因?yàn)榫幾g器自動(dòng)生成的RAM初始化代碼在MCU啟動(dòng)后進(jìn)入main函數(shù)前完成的,這些函數(shù)我們通過(guò)查看編譯后的map文件可以找到他們蹤跡。

以Keil為例,編譯后輸出信息里會(huì)看到RW-DATA和ZI-DATA,其中ZI-DATA就是沒(méi)有給定初始化值或初始化值給定為0的全局?jǐn)?shù)據(jù)。
打開(kāi)工程設(shè)置,在RAM/IRAM的Memory配置里有一個(gè)NOINIT的勾選,勾選后就可以配置為不初始化屬性,編譯器將不對(duì)這個(gè)區(qū)域的全局變量進(jìn)行初始化賦值。

如果我們有希望復(fù)位后還能保持的RAM變量可以定義在配置了NOINIT的RAM區(qū)域中。
除了直接在工程配置里修改,如果自行編寫(xiě)鏈接文件,也可以添加NOINIT字段來(lái)進(jìn)行配置。

-
單片機(jī)
+關(guān)注
關(guān)注
6057文章
44813瀏覽量
644354 -
mcu
+關(guān)注
關(guān)注
146文章
17699瀏覽量
357845 -
嵌入式
+關(guān)注
關(guān)注
5122文章
19427瀏覽量
312852 -
RAM
+關(guān)注
關(guān)注
8文章
1384瀏覽量
116292
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦

MCU復(fù)位RAM會(huì)保持嗎,如何實(shí)現(xiàn)復(fù)位時(shí)變量數(shù)據(jù)保持?#單片機(jī) #嵌入式開(kāi)發(fā) #RAM
請(qǐng)問(wèn)復(fù)位引腳保持低邏輯觸發(fā)MCU復(fù)位需要多長(zhǎng)時(shí)間?
CH32V103復(fù)位如何保持變量?
ARM SOC芯片當(dāng)其熱復(fù)位時(shí)其系統(tǒng)內(nèi)存RAM中的原數(shù)據(jù)是否繼續(xù)保持不變
ARM SOC芯片系統(tǒng)當(dāng)其熱復(fù)位時(shí),其系統(tǒng)內(nèi)存RAM中的原數(shù)據(jù)是否繼續(xù)保持不變?
如何設(shè)置STM32單片機(jī)非初始化數(shù)據(jù)變量不被零初始化

哪些因素會(huì)導(dǎo)致MCU復(fù)位
PKD01:帶復(fù)位保持模式的單片峰值檢測(cè)器過(guò)時(shí)數(shù)據(jù)表

PKD01:帶復(fù)位保持模式的單片峰值檢測(cè)器數(shù)據(jù)表

華大MCU如何實(shí)現(xiàn)軟件復(fù)位
MCU復(fù)位筆記

初始化mcu程序選用32k_MCU有多少種復(fù)位因素

GD32 MCU電源復(fù)位和系統(tǒng)復(fù)位有什么區(qū)別

如何排查GD32 MCU復(fù)位是由哪個(gè)復(fù)位源導(dǎo)致的?

評(píng)論