之前文章说了原理,这里把最终实现的代码总结:

IAR

 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[]);
stacked_r1 = ((unsigned long) hardfault_args[]);
stacked_r2 = ((unsigned long) hardfault_args[]);
stacked_r3 = ((unsigned long) hardfault_args[]); stacked_r12 = ((unsigned long) hardfault_args[]);
stacked_lr = ((unsigned long) hardfault_args[]);
stacked_pc = ((unsigned long) hardfault_args[]);
stacked_psr = ((unsigned long) hardfault_args[]); printf ("\r\n[Hard fault handler - all numbers in hex]\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 ("LR[R14]=%x subroutine call return address\r\n",stacked_lr);
printf ("PC[R15]=%x program counter\r\n",stacked_pc);
printf ("PSR=%x\r\n",stacked_psr);
printf ("BFAR=%x\r\n",(*((volatile unsigned long *)(0xE000ED38))));
printf ("CFSR=%x\r\n",(*((volatile unsigned long *)(0xE000ED28))));
printf ("HFSR=%x\r\n",(*((volatile unsigned long *)(0xE000ED2C))));
printf ("DFSR=%x\r\n",(*((volatile unsigned long *)(0xE000ED30))));
printf ("AFSR=%x\r\n",(*((volatile unsigned long *)(0xE000ED3C))));
printf ("SCB_SHCSR=%x\r\n", SCB->SHCSR); while ();
}

hard_fault_handler_c

 void HardFault_Handler( void )
{
__ASM("TST LR, #4");
__ASM("ITE EQ");
__ASM("MRSEQ R0, MSP");
__ASM("MRSNE R0, PSP");
__ASM("B hard_fault_handler_c");
}

HardFault_Handler

这里的HardFault_Handler里是内联汇编

MDK不能使用内联汇编

 __ASM void HardFault_Handler(void)
{
TST lr, # // Test for MSP or PSP
ITE EQ
MRSEQ r0, MSP
MRSNE r0, PSP
IMPORT HardFault_Handler_C
B HardFault_Handler_C
}

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[]);
stacked_r1 = ((unsigned long) hardfault_args[]);
stacked_r2 = ((unsigned long) hardfault_args[]);
stacked_r3 = ((unsigned long) hardfault_args[]); stacked_r12 = ((unsigned long) hardfault_args[]);
stacked_lr = ((unsigned long) hardfault_args[]);
stacked_pc = ((unsigned long) hardfault_args[]);
stacked_psr = ((unsigned long) hardfault_args[]); printf ("\n\n[Hard fault handler - all numbers in hex]\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 ("LR [R14] = %x subroutine call return address\r\n", stacked_lr);
printf ("PC [R15] = %x program counter\r\n", stacked_pc);
printf ("PSR = %x\r\n", stacked_psr);
printf ("BFAR = %x\r\n", (*((volatile unsigned long *)(0xE000ED38))));
printf ("CFSR = %x\r\n", (*((volatile unsigned long *)(0xE000ED28))));
printf ("HFSR = %x\r\n", (*((volatile unsigned long *)(0xE000ED2C))));
printf ("DFSR = %x\r\n", (*((volatile unsigned long *)(0xE000ED30))));
printf ("AFSR = %x\r\n", (*((volatile unsigned long *)(0xE000ED3C))));
printf ("SCB_SHCSR = %x\r\n", SCB->SHCSR); while ();
}

HardFault_Handler_C

 [Hard fault handler - all numbers in hex]
R0 =
R1 =
R2 =
R3 = c0
R12 =
LR [R14] = subroutine call return address
PC [R15] = program counter
PSR =
BFAR =
CFSR =
HFSR =
DFSR =
AFSR =
SCB_SHCSR =

对于调试很有帮助的,注意PC[R15]的数值是我们需要的

最新文章

  1. 1Z0-053 争议题目解析606
  2. PHP文件可限速下载代码
  3. ERROR Cannot determine the location of the VS Common Tools Folder
  4. JS ——window.onload与$(document).ready()
  5. arulesSequences包做序列模式的关联分析
  6. 自定义ISPF面板
  7. Android开发UI之个性化控件之Menu
  8. Android R.layout. 找不到已存在的布局文件
  9. c++2(循环和递归)
  10. Win10修改编辑文件无法保存怎么办(没有权限)
  11. 'pip' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  12. 转://通过udev创建ASM共享磁盘(RAC)
  13. 了解fastadmin标准的控制器模块js的表格事件
  14. 第三个Sprint冲刺第二天(燃尽图)
  15. ref实现输入框聚焦
  16. MySQL最优配置模板( 5.6&5.7转)
  17. Linux Compile Multiple C++ Files
  18. DNS分离解析IPV6与IPV4用户
  19. DHT(Distributed Hash Table,分布式哈希表)
  20. Python3.x:open()文件操作

热门文章

  1. LibreOJ2302 - 「NOI2017」整数
  2. bzoj 1701 [Usaco2007 Jan]Cow School牛学校
  3. 微软2016校园招聘在线笔试 B Professor Q's Software [ 拓扑图dp ]
  4. 介绍 JSON的
  5. 洛谷——P1596 [USACO10OCT]湖计数Lake Counting
  6. POJ 2240 【这题貌似可以直接FLOYD 屌丝用SPFA通过枚举找正权值环 顺便学了下map】
  7. java IO与NIO
  8. 第三方APP集成微信登陆功能详解
  9. 异步SOCKET分包和组包的一种通用算法
  10. 【转】海量数据处理算法-Bloom Filter