在使用MCU時,通常大家默認MCU復位時RAM會被復位清零,那實際MCU復位時RAM是什么狀態?如何讓mcu復位時RAM保持不變呢?
MCU復位有電源復位、Standby復位、內核復位、看門狗復位、引腳復位等。

其中內部會有掉電動作的復位有電源復位和Standby復位,由于內部電路有掉電所以這些復位RAM是無法保持的,RAM會處于隨機值狀態,實際也不是0值。其他復位由于不掉電,本質上是不會直接復位RAM的。
那為什么一般執行了軟件復位和看門狗復位后RAM會復位,沒有初始化的變量值變成0呢?實際上是因為編譯器自動生成的RAM初始化代碼在MCU啟動后進入main函數前完成的,這些函數我們通過查看編譯后的map文件可以找到他們蹤跡。

以Keil為例,編譯后輸出信息里會看到RW-DATA和ZI-DATA,其中ZI-DATA就是沒有給定初始化值或初始化值給定為0的全局數據。
打開工程設置,在RAM/IRAM的Memory配置里有一個NOINIT的勾選,勾選后就可以配置為不初始化屬性,編譯器將不對這個區域的全局變量進行初始化賦值。

如果我們有希望復位后還能保持的RAM變量可以定義在配置了NOINIT的RAM區域中。
除了直接在工程配置里修改,如果自行編寫鏈接文件,也可以添加NOINIT字段來進行配置。

-
單片機
+關注
關注
6067文章
44982瀏覽量
650311 -
mcu
+關注
關注
146文章
17970瀏覽量
366581 -
嵌入式
+關注
關注
5150文章
19659瀏覽量
317392 -
RAM
+關注
關注
8文章
1392瀏覽量
117465
發布評論請先 登錄

CH32V103復位如何保持變量?
ARM SOC芯片當其熱復位時其系統內存RAM中的原數據是否繼續保持不變
ARM SOC芯片系統當其熱復位時,其系統內存RAM中的原數據是否繼續保持不變?
如何設置STM32單片機非初始化數據變量不被零初始化

評論