Cortex-M3 / M4硬故障处理程序
https://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/
第5章 任务切换设计
http://blog.sina.com.cn/s/blog_98ee3a930102v7zv.html
STM32常见Hard+Fault的诊断
https://wenku.baidu.com/view/3c1146ddd5bbfd0a795673f3.html
__ASM void HardFault_Handler(void)
{
TST lr, #4 // Test for MSP or PSP 测试EXC_RETURN的比特2
ITE EQ //如果为0,
MRSEQ r0, MSP //则使用的是主堆栈,故把MSP的值取出
MRSNE r0, PSP //否则, 使用的是进程堆栈,故把MSP的值取出
IMPORT HardFault_Handler_C //从栈中读取PC的值
B HardFault_Handler_C //从SVC指令中读取立即数放到R0
}
//HardFault_Handler
void HardFault_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 fault handler - all numbers in hex]\r\n");
printf ("R0 = 0x%08X\r\n", stacked_r0);
printf ("R1 = 0x%08X\r\n", stacked_r1);
printf ("R2 = 0x%08X\r\n", stacked_r2);
printf ("R3 = 0x%08X\r\n", stacked_r3);
printf ("R12 = 0x%08X\r\n", stacked_r12);
printf ("LR [R14] = 0x%08X subroutine call return address\r\n", stacked_lr);
printf ("PC [R15] = 0x%08X program counter\r\n", stacked_pc);
printf ("PSR = 0x%08X\r\n", stacked_psr);
printf ("BFAR = 0x%X\r\n", (*((volatile unsigned long *)(0xE000ED38))));
printf ("CFSR = 0x%X\r\n", (*((volatile unsigned long *)(0xE000ED28))));
printf ("HFSR = 0x%X\r\n", (*((volatile unsigned long *)(0xE000ED2C))));
printf ("DFSR = 0x%X\r\n", (*((volatile unsigned long *)(0xE000ED30))));
printf ("AFSR = 0x%X\r\n"