以M031晶片被看門狗計時器(WDT)復位為例。
晶片進行復位後,會由startup_M031Series.s開始執行程式碼。其中會跳轉到system_M031Series.c中的System_Init的函數,再跳轉至__main函數。
LDR R0, =SystemInit // 設定R0為SystemInit的位置
BLX R0 // 跳轉至R0位置並執行Thumb指令
LDR R0, =__main // 設定R0為__main函數的位置
BX R0 // 跳轉至R0的位置
__main函數是由編譯器自行創建,此函數會對SRAM進行初始化的動作,包含將RW-data與ZI-data複製到SRAM、初始化ZI-data為0等,再跳轉至__rt_entry函數。
__rt_entry函數也由編譯器自行創建,此函數會建立執行程式所需的環境,包含初始化Stack與Heap以及Library等,最後再跳轉至main()函數。
若是使用者在晶片受到看門狗計時器復位後想要保持復位前的SRAM狀態,只要在進入__main函數前,直接跳轉至main()函數即可。
extern int32_t main(void);
void SystemInit(void)
{
/* If the last reset source is WDT Reset, do not reset SRAM */
if(SYS->RSTSRC & SYS_RSTSRC_RSTS_WDT_Msk)
{
main();
}
……
}
註: 本流程圖引用自KEIL官方文件
欲瞭解更詳細的Startup 行為請參考KEIL的官方文件: http://www.keil.com/support/man/docs/armclang_intro/armclang_intro_asa1505906246660.htm
評論