以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(); } …… }
|