stm32 栈帧回溯

// hard fault handler in C,
    // with stack frame location as input parameter
    void hard_fault_handler_c (unsigned int * hardfault_args)
    {
      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]);

      printf ("\n\n[Hard faulthandler - all numbers in hex]\n");
      printf ("R0 = %x\n",stacked_r0);
      printf ("R1 = %x\n",stacked_r1);
      printf ("R2 = %x\n",stacked_r2);
      printf ("R3 = %x\n",stacked_r3);
      printf ("R12 = %x\n",stacked_r12);
      printf ("LR [R14] = %x  subroutine call return address\n",stacked_lr);
      printf ("PC [R15] = %x  program counter\n", stacked_pc);
      printf ("PSR = %x\n",stacked_psr);

      /******************* Add yourdebug trace here ***********************/
      _int_kernel_isr();
    }

    /* hard fault interrupt handler */
    void _int_hardfault_isr( )
    {
      __asm("TST LR, #4");
      __asm("ITE EQ");
      __asm("MRSEQ R0,MSP");
      __asm("MRSNE R0,PSP");
      __asm("Bhard_fault_handler_c");
    }