Cortex-M3 在C中上报入栈的寄存器和各fault状态寄存器
2024-09-28 07:33:08
因为在标准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》
最新文章
- 如何设置redis中hash的field的expire ?
- U盘又中毒了,隐藏文件如何显示
- Javascript原型模式总结梳理
- 为Docker容器指定自定义网段的固定IP/静态IP地址
- 《C++必知必会》学习笔记
- <;marquee>;属性详解
- Android || IOS录制mp3语音文件方法
- 多进程和atexit清理函数
- C# 绘制窗体客户非客户区要用WM_PAINT和WM_NCPAINT
- HDOJ Sudoku Killer(dfs)
- python 全栈开发,Day2(正式)
- Scala 快速入门
- iOS10软件崩溃 Xcode8崩溃 打印/字体等问题汇总 韩俊强的博客
- SAS 读取指定目录下文件列表宏
- CentOS 7.5 安装KVM虚拟机(Windows)
- 扩容Linux文件系统
- W25Q128---读写
- linux 命令行对mysql数据进行备份和还原
- UTF8和UCS2
- windows下codeblocks报错undefined reference to `WSAStartup@8&#39;|
热门文章
- 最贵的AMD 7nm显卡来了!这设计 够狂野
- three.js之让物体动起来方式(一)移动摄像机
- 关于shell中函数调用的理解
- 解决docker容器的窗口大小问题
- 【javascript】[].slice.call(arguments)的作用
- 小程序UI设计(7)-布局分解-左-上下结构
- 8.Dropout
- Maximum Xor Secondary CodeForces - 281D (单调栈)
- win10 sql server2012 连接navicat 无法使用
- Internet层协议下IP协议