使用keil判斷ARM的冷啟動和熱啟動的方法

2021-06-27 15:44:16 字數 1166 閱讀 6996

** 

微處理器:lpc2114

編譯環境:keil mdk v4.10

思路:常把微控制器系統的復位分為冷啟動和熱啟動。所謂冷啟動,也就是一般所說的上電復位冷啟動後片內外ram的內容是隨機的,通常是0x00或0xff;微控制器的熱啟動是通過外部電路給執行中的微控制器的復位端一復位電平而實現的,也就是所說的按鍵復位或看門狗復位。復位後,ram的內容都沒有改變。在某些場合,必須區分出裝置的重啟是熱重啟還是冷重啟。常用的方法是:確定某記憶體單位為標誌位(如0x40003ff4~0x40003ff7 ram單元),啟動時首先讀該記憶體單元的內容,如果它等於乙個特定的值(例如為0xaa55aa55),就認為是熱啟動,否則就是冷啟動。

根據以上的設計思路思路定義乙個變數:

uint32unstartflag;

在程式啟動時判斷:

if(unstartflag==0xaa55aa55)

else

然而實際除錯中發現,無論是熱啟動還是冷啟動,開機後所有記憶體單元的值都被復位為0,當然也實現不了熱啟動的要求。通過看keil mdk自帶的啟動**startup.s,在這個啟動**中也並沒有發現將整個ram區域清零的語句。反匯程式設計序,發現從啟動**執行結束到跳轉到main函式過程中,編譯器還執行了很多庫函式,其中__scatterload_zeroinit函式將所有w/r ram都初始化為0(預設設定下)。為了判斷冷、熱啟動,必須人為控制某些特定ram在復位時不被編譯器初始化為0。通過查詢編譯器手冊,在為處理器的ram中分出一塊小片ram,設定為noinit格式(不對其初始化為0),如下圖:

然後使用__at關鍵字將冷、熱啟動標誌位定位到這個noinit區域:

uint32 unstartflag __at (0x40003ff4);

這樣,當熱啟動時,變數unstartflag所在的記憶體區域就不會被初始化為0,也實現了冷熱啟動的判斷。

定義鐵電0xff7~0xff8區域儲存冷啟動次數

0xff9~0xffa區域儲存熱啟動次數

0xffb~0xffc區域儲存總啟動次數

使用keil判斷ARM的冷啟動和熱啟動的方法

微處理器 lpc2114 編譯環境 keil mdk v4.10 思路 常把微控制器系統的復位分為冷啟動和熱啟動。所謂冷啟動,也就是一般所說的上電復位,冷啟動後片內外ram的內容是隨機的 微控制器的熱啟動是通過外部電路給執行中的微控制器的復位端一復位電平而實現的,也就是所說的按鍵復位或看門狗復位。復...

加速遊戲的冷啟動

1.專案中新增乙個loading場景,這個場景會是遊戲啟動的第乙個場景。2.在loading場景中盡量少的依賴,盡量少的紋理依賴 assetbundle依賴 依賴,總之,這個loading場景一定要盡量少的依賴,這個場景一定要盡量簡單,這樣才能保證盡快的載入速度。3.在遊戲中盡量少的使用resour...

冷啟動與熱啟動的區別

冷啟動對電子產品影響才大。從電路角度來看 熱啟動是在系統仍通電的情況下重新啟動系統,熱啟動也是一次軟體復位。熱啟動清除易失性系統記憶體,並重新裝載作業系統。冷啟動是用關閉電源來啟動系統,冷啟動還對硬體進行復位,它檢查硬體,並重新裝載作業系統。最重要的是冷啟動對硬體進行一次檢查。現在的電腦這個過程好像...