在RTX的改造中,我是这么重启系统的。
1、重启系统的函数:
void rt_Reset(void) // NVIC系统重启
{
SCB->AIRCR = (NVIC_AIRCR_VECTKEY | (SCB->AIRCR & (0x700)) | (1<<NVIC_SYSRESETREQ)); // Keep priority group unchanged */
__DSB(); // 确保内存访问完成
while(1); // 等待,直至重启
}
2、做为系统的SVC服务:
#define __SVC_0 __svc_indirect(0) // 系统SVC中断服务0
#define Sys_Reset() _os_rt_reset((s32)rt_Reset)
void _os_rt_reset(s32 p) __SVC_0;
3、在HardFault中的处理如下:
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
IMPORT rt_Reset
LDR R0, =rt_Reset
BX R0
B .
ENDP
说明:
1、正常情况下,在线程中需要重启系统,直接调用Sys_Reset();
2、当出现异常情况,进入HardFault时,由HardFault重启系统。
|