之前文章说了原理,这里把最终实现的代码总结:
IAR
1 void hard_fault_handler_c (unsigned int * hardfault_args) 2 { 3 unsigned int stacked_r0; 4 unsigned int stacked_r1; 5 unsigned int stacked_r2; 6 unsigned int stacked_r3; 7 unsigned int stacked_r12; 8 unsigned int stacked_lr; 9 unsigned int stacked_pc; 10 unsigned int stacked_psr; 11 12 stacked_r0 = ((unsigned long) hardfault_args[0]); 13 stacked_r1 = ((unsigned long) hardfault_args[1]); 14 stacked_r2 = ((unsigned long) hardfault_args[2]); 15 stacked_r3 = ((unsigned long) hardfault_args[3]); 16 17 stacked_r12 = ((unsigned long) hardfault_args[4]); 18 stacked_lr = ((unsigned long) hardfault_args[5]); 19 stacked_pc = ((unsigned long) hardfault_args[6]); 20 stacked_psr = ((unsigned long) hardfault_args[7]); 21 22 printf (" [Hard fault handler - all numbers in hex] "); 23 printf ("R0=%x ",stacked_r0); 24 printf ("R1=%x ",stacked_r1); 25 printf ("R2=%x ",stacked_r2); 26 printf ("R3=%x ",stacked_r3); 27 printf ("R12=%x ",stacked_r12); 28 printf ("LR[R14]=%x subroutine call return address ",stacked_lr); 29 printf ("PC[R15]=%x program counter ",stacked_pc); 30 printf ("PSR=%x ",stacked_psr); 31 printf ("BFAR=%x ",(*((volatile unsigned long *)(0xE000ED38)))); 32 printf ("CFSR=%x ",(*((volatile unsigned long *)(0xE000ED28)))); 33 printf ("HFSR=%x ",(*((volatile unsigned long *)(0xE000ED2C)))); 34 printf ("DFSR=%x ",(*((volatile unsigned long *)(0xE000ED30)))); 35 printf ("AFSR=%x ",(*((volatile unsigned long *)(0xE000ED3C)))); 36 printf ("SCB_SHCSR=%x ", SCB->SHCSR); 37 38 39 while (1); 40 }
1 void HardFault_Handler( void ) 2 { 3 __ASM("TST LR, #4"); 4 __ASM("ITE EQ"); 5 __ASM("MRSEQ R0, MSP"); 6 __ASM("MRSNE R0, PSP"); 7 __ASM("B hard_fault_handler_c"); 8 }
这里的HardFault_Handler里是内联汇编
MDK不能使用内联汇编
1 __ASM void HardFault_Handler(void) 2 { 3 TST lr, #4 // Test for MSP or PSP 4 ITE EQ 5 MRSEQ r0, MSP 6 MRSNE r0, PSP 7 IMPORT HardFault_Handler_C 8 B HardFault_Handler_C 9 }
1 void HardFault_Handler_C (unsigned int * hardfault_args) 2 { 3 unsigned int stacked_r0; 4 unsigned int stacked_r1; 5 unsigned int stacked_r2; 6 unsigned int stacked_r3; 7 unsigned int stacked_r12; 8 unsigned int stacked_lr; 9 unsigned int stacked_pc; 10 unsigned int stacked_psr; 11 12 stacked_r0 = ((unsigned long) hardfault_args[0]); 13 stacked_r1 = ((unsigned long) hardfault_args[1]); 14 stacked_r2 = ((unsigned long) hardfault_args[2]); 15 stacked_r3 = ((unsigned long) hardfault_args[3]); 16 17 stacked_r12 = ((unsigned long) hardfault_args[4]); 18 stacked_lr = ((unsigned long) hardfault_args[5]); 19 stacked_pc = ((unsigned long) hardfault_args[6]); 20 stacked_psr = ((unsigned long) hardfault_args[7]); 21 22 printf (" [Hard fault handler - all numbers in hex] "); 23 printf ("R0 = %x ", stacked_r0); 24 printf ("R1 = %x ", stacked_r1); 25 printf ("R2 = %x ", stacked_r2); 26 printf ("R3 = %x ", stacked_r3); 27 printf ("R12 = %x ", stacked_r12); 28 printf ("LR [R14] = %x subroutine call return address ", stacked_lr); 29 printf ("PC [R15] = %x program counter ", stacked_pc); 30 printf ("PSR = %x ", stacked_psr); 31 printf ("BFAR = %x ", (*((volatile unsigned long *)(0xE000ED38)))); 32 printf ("CFSR = %x ", (*((volatile unsigned long *)(0xE000ED28)))); 33 printf ("HFSR = %x ", (*((volatile unsigned long *)(0xE000ED2C)))); 34 printf ("DFSR = %x ", (*((volatile unsigned long *)(0xE000ED30)))); 35 printf ("AFSR = %x ", (*((volatile unsigned long *)(0xE000ED3C)))); 36 printf ("SCB_SHCSR = %x ", SCB->SHCSR); 37 38 while (1); 39 }
1 [Hard fault handler - all numbers in hex] 2 R0 = 11111000 3 R1 = 8000378 4 R2 = 8000379 5 R3 = c0 6 R12 = 400 7 LR [R14] = 8001759 subroutine call return address 8 PC [R15] = 8000340 program counter 9 PSR = 1000000 10 BFAR = 11111111 11 CFSR = 8200 12 HFSR = 40000000 13 DFSR = 1 14 AFSR = 0 15 SCB_SHCSR = 0
对于调试很有帮助的,注意PC[R15]的数值是我们需要的