如果在程序运行时进hardfault想要打印出现问题前的错误信息,可按如下操作实现:
我们先找到系统启动文件中的HardFault_Handler汇编入口,将其整个替换为如下写法:
HardFault_Handler\ PROC MOVS r0, #4 MOV r1, LR TST r0, r1 BEQ stacking_used_MSP MRS R0, PSP B get_LR_and_branch stacking_used_MSP MRS R0, MSP get_LR_and_branch MOV R1, LR IMPORT hard_fault_handler_c BL hard_fault_handler_c ENDP
在系统出错时,单片机内部会将出错前的信息记录下来并传送给Hardfault中断,将信息打印出来;
紧接着,我们到main.c中编写Hardfault中断处理函数:
void hard_fault_handler_c(unsigned int * hardfault_args,unsigned lr_value) { PRINT("HardFault_Handler\r\n"); unsigned int stacked_r0; unsigned int stacked_r1; unsigned int stacked_r2; unsigned int stacked_r3; unsigned int stacked_r12; unsigned int stacked_lr; unsigned int stacked_pc; unsigned int stacked_psr; stacked_r0 = ((unsigned long)hardfault_args[0]); stacked_r1 = ((unsigned long)hardfault_args[1]); stacked_r2 = ((unsigned long)hardfault_args[2]); stacked_r3 = ((unsigned long)hardfault_args[3]); stacked_r12 = ((unsigned long)hardfault_args[4]); stacked_lr = ((unsigned long)hardfault_args[5]); stacked_pc = ((unsigned long)hardfault_args[6]); stacked_psr = ((unsigned long)hardfault_args[7]); PRINT("Enter HardFault_Handler\r\n"); PRINT("R0 = %x\n",stacked_r0); PRINT("R1 = %x\n",stacked_r1); PRINT("R2 = %x\n",stacked_r2); PRINT("R3 = %x\n",stacked_r3); PRINT("R12 = %x\n",stacked_r12); PRINT("Stacked LR = %x\n",stacked_lr); PRINT("Stacked PC = %x\n",stacked_pc); PRINT("Stacked PSR = %x\n",stacked_psr); PRINT("Current LR = %x\n",lr_value); while(1); }
标签:hardfault,stacked,打印输出,int,args,unsigned,串口,PRINT,Hardfault From: https://www.cnblogs.com/azou/p/17032235.html