该段代码会判断当前堆栈使用的是MSP或PSP,然后将堆栈参数传递给hard_fault_handler_c函数,该函数定义如下:
void hard_fault_handler_c(unsigned int * hardfault_args, unsigned lr_value)
{
unsigned int stacked_r0; //压栈的 r0
unsigned int stacked_r1; //压栈的 r1
unsigned int stacked_r2; //压栈的 r2
unsigned int stacked_r3; //压栈的 r3
unsigned int stacked_r12; //压栈的 r12
unsigned int stacked_lr; //压栈的 lr
unsigned int stacked_pc; //压栈的 pc
unsigned int stacked_psr; //压栈的 psr
stacked_r0 = ((unsigned int) hardfault_args[0]);
stacked_r1 = ((unsigned int) hardfault_args[1]);
stacked_r2 = ((unsigned int) hardfault_args[2]);
stacked_r3 = ((unsigned int) hardfault_args[3]);
stacked_r12 = ((unsigned int)hardfault_args[4]);
stacked_lr = ((unsigned int) hardfault_args[5]);
stacked_pc = ((unsigned int) hardfault_args[6]);
stacked_psr = ((unsigned int) hardfault_args[7]);
while(1)
{
printf("[Hard fault handler]\r\n");
printf("R0 = %x\r\n", stacked_r0);
printf("R1 = %x\r\n", stacked_r1);
printf("R2 = %x\r\n", stacked_r2);
printf("R3 = %x\r\n", stacked_r3);
printf("R12 = %x\r\n", stacked_r12);
printf("Stacked LR = %x\r\n", stacked_lr);
printf("Stacked PC = %x\r\n", stacked_pc);
printf("Stacked PSR = %x\r\n", stacked_psr);
printf("SCB_SHCSR=%x\r\n",SCB->SHCSR);
printf("Current LR = %x\r\n", lr_value);
}
}
|