Nuvoton(新唐科技)當晶片進行復位(Reset)時,如何保持復位前的SRAM狀態,不對SRAM進行初始化的動作?

以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

★博文內容參考自 網站,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論