在使用MCU時,通常大家默認MCU復(fù)位時RAM會被復(fù)位清零,那實際MCU復(fù)位時RAM是什么狀態(tài)?如何讓mcu復(fù)位時RAM保持不變呢?
MCU復(fù)位有電源復(fù)位、Standby復(fù)位、內(nèi)核復(fù)位、看門狗復(fù)位、引腳復(fù)位等。
其中內(nèi)部會有掉電動作的復(fù)位有電源復(fù)位和Standby復(fù)位,由于內(nèi)部電路有掉電所以這些復(fù)位RAM是無法保持的,RAM會處于隨機值狀態(tài),實際也不是0值。其他復(fù)位由于不掉電,本質(zhì)上是不會直接復(fù)位RAM的。
那為什么一般執(zhí)行了軟件復(fù)位和看門狗復(fù)位后RAM會復(fù)位,沒有初始化的變量值變成0呢?實際上是因為編譯器自動生成的RAM初始化代碼在MCU啟動后進入main函數(shù)前完成的,這些函數(shù)我們通過查看編譯后的map文件可以找到他們蹤跡。
以Keil為例,編譯后輸出信息里會看到RW-DATA和ZI-DATA,其中ZI-DATA就是沒有給定初始化值或初始化值給定為0的全局數(shù)據(jù)。
打開工程設(shè)置,在RAM/IRAM的Memory配置里有一個NOINIT的勾選,勾選后就可以配置為不初始化屬性,編譯器將不對這個區(qū)域的全局變量進行初始化賦值。
如果我們有希望復(fù)位后還能保持的RAM變量可以定義在配置了NOINIT的RAM區(qū)域中。
除了直接在工程配置里修改,如果自行編寫鏈接文件,也可以添加NOINIT字段來進行配置。
-
單片機
+關(guān)注
關(guān)注
6040文章
44587瀏覽量
636795 -
mcu
+關(guān)注
關(guān)注
146文章
17194瀏覽量
351880 -
嵌入式
+關(guān)注
關(guān)注
5087文章
19150瀏覽量
306376 -
RAM
+關(guān)注
關(guān)注
8文章
1369瀏覽量
114813
發(fā)布評論請先 登錄
相關(guān)推薦
評論