因为在标准C语音中是不能获取SP指针的。因而,如果想通过C代码来获取入栈的寄存器值,需要配合一小段汇编代码来获取当前的SP值,然后再把这个SP值以参数形式传送给C代码,最后以指针的形式把栈中的各寄存器值输出,同时也可以输出一些想要的各种状态寄存器值。如下:

Keil环境汇编封皮:

 HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
IMPORT hard_fault_handler_c
TST LR, #
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
B hard_fault_handler_c
ENDP

C服务程序,输入为SP的值:

 void hard_fault_handler_c( unsigned int *reg )
{
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 int)reg[];
stacked_r1 = (unsigned int)reg[];
stacked_r2 = (unsigned int)reg[];
stacked_r3 = (unsigned int)reg[]; stacked_r12 = (unsigned int)reg[];
stacked_lr = (unsigned int)reg[];
stacked_pc = (unsigned int)reg[];
stacked_psr = (unsigned int)reg[]; while( )
{
printf("--> %s\r\n", __FUNCTION__);
//printf("EXC_RETURN: %08X\r\n", r1);
printf("R0: %08X\r\n", stacked_r0);
printf("R1: %08X\r\n", stacked_r1);
printf("R2: %08X\r\n", stacked_r2);
printf("R3: %08X\r\n", stacked_r3);
printf("R12: %08X\r\n", stacked_r12);
printf("LR: %08X\r\n", stacked_lr);
printf("PC: %08X\r\n", stacked_pc);
printf("PSR: %08X\r\n", stacked_psr); // 系统handler控制及状态寄存器
printf("SHCSR: %08X\r\n", (*(volatile unsigned int *)(0xE000ED24)));
//printf("MFSR: %02X\r\n", (*(volatile unsigned char *)(0xE000ED28)));
//printf("BFSR: %02X\r\n", (*(volatile unsigned char *)(0xE000ED29)));
//printf("UFSR: %04X\r\n", (*(volatile unsigned short *)(0xE000ED2A)));
// 存储器管理fault、总线fault、用法fault状态寄存器
printf("CFSR: %08X\r\n", (*(volatile unsigned int *)(0xE000ED28)));
// 硬fault状态寄存器
printf("HFSR: %08X\r\n", (*(volatile unsigned int *)(0xE000ED2C)));
// 调试fault状态寄存器
printf("DFSR: %08X\r\n", (*(volatile unsigned int *)(0xE000ED30))); // 存储器管理fault地址寄存器
printf("MMAR: %08X\r\n", (*(volatile unsigned int *)(0xE000ED34)));
// 总线fault地址寄存器
printf("BFAR: %08X\r\n", (*(volatile unsigned int *)(0xE000ED38)));
// 辅助fault地址寄存器
printf("AFAR: %08X\r\n", (*(volatile unsigned int *)(0xE000ED3C)));
} return ;
}

参考摘录:

《ARM Cortex-M3权威指南.pdf》

最新文章

  1. 如何设置redis中hash的field的expire ?
  2. U盘又中毒了,隐藏文件如何显示
  3. Javascript原型模式总结梳理
  4. 为Docker容器指定自定义网段的固定IP/静态IP地址
  5. 《C++必知必会》学习笔记
  6. <marquee>属性详解
  7. Android || IOS录制mp3语音文件方法
  8. 多进程和atexit清理函数
  9. C# 绘制窗体客户非客户区要用WM_PAINT和WM_NCPAINT
  10. HDOJ Sudoku Killer(dfs)
  11. python 全栈开发,Day2(正式)
  12. Scala 快速入门
  13. iOS10软件崩溃 Xcode8崩溃 打印/字体等问题汇总 韩俊强的博客
  14. SAS 读取指定目录下文件列表宏
  15. CentOS 7.5 安装KVM虚拟机(Windows)
  16. 扩容Linux文件系统
  17. W25Q128---读写
  18. linux 命令行对mysql数据进行备份和还原
  19. UTF8和UCS2
  20. windows下codeblocks报错undefined reference to `WSAStartup@8'|

热门文章

  1. 最贵的AMD 7nm显卡来了!这设计 够狂野
  2. three.js之让物体动起来方式(一)移动摄像机
  3. 关于shell中函数调用的理解
  4. 解决docker容器的窗口大小问题
  5. 【javascript】[].slice.call(arguments)的作用
  6. 小程序UI设计(7)-布局分解-左-上下结构
  7. 8.Dropout
  8. Maximum Xor Secondary CodeForces - 281D (单调栈)
  9. win10 sql server2012 连接navicat 无法使用
  10. Internet层协议下IP协议