Cortex-M3 在C中上报入栈的寄存器和各fault状态寄存器
因为在标准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》
Cortex-M3 在C中上报入栈的寄存器和各fault状态寄存器的更多相关文章
- python---函数补充(变量传递),语句执行顺序(入栈顺序)
一:函数补充 默认作为函数参数的数据,是浅拷贝传递.不是和C等语言一样,产生一个临时变量. class T: def __init__(self,num): print(id(num)) self.n ...
- C++中栈的出栈,入栈规则:A,B,C,D,E
考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前 栈中元素可以出栈,则出栈序列可能是_____a d___________. a. ABCED b. DBCEA c. CD ...
- c语言中函数参数入栈的顺序是什么?为什么
看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){ ...
- 在堆栈中,push为入栈操作,pop为出栈操作
LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中,push为入栈操作 ...
- C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)
/**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋 ...
- C语言中结构体定义实际上相当于变量入栈
struct context { int edi; int esi; int ebx; int ebp; int eip;}; 对应的入栈顺序是 pushl %esp pushl %eip pushl ...
- C中入栈顺序和运算顺序有关系吗?
如下代码会怎么执行? printf( "%c,%c,%c\n", getchar(), getchar(), getchar() ); 实际测试,是倒序执行,感觉上符合“C函数的形 ...
- 函数调用过程中,函数参数的入栈顺序,why?
C语言函数参数入栈顺序为从右至左.具体原因为:C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数.通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底.除非知道参数个数,否则是无法通 ...
- 【freertos】002-posix模拟器设计与cortex m3异常处理
目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...
随机推荐
- NORDIC 修改MTU
https://www.cnblogs.com/jiangjiu/p/10063556.html 注意要修改RAM起始地址,因为MTU增大了
- 2.Java NIO 简介
概述 Java NIO 是 JDK 1.4 发布的一套全新的IO API(New IO 简称 NIO),由于 JDK 1.7 对 NIO 的更新,目前 NIO 被广泛应用,以至于 将 JDK 1.7 ...
- C#在Oralce环境执行查询时报"Arithmetic operation resulted in an overflow"
问题描述:C#代码在Oralce环境执行分组求和的Sql时报错,提示“Arithmetic operation resulted in an overflow”,即算术运算导致溢出 (1).执行Sql ...
- Nginx负载均衡和HTTPS配置及集群搭建
Nginx的高可用(HA)配置 1.高可用配置结构(画图说明) 2.KeepAlived的安装和配置 1.安装 yum install keepalived 2.keepalived.conf配置文件 ...
- libusb_submit_transfer 异步通信libusb
https://bbs.csdn.net/topics/391012708?list=lz
- Decrator 装饰模式
注:装饰模式是结构型设计模式,动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活. 主要是利用组合代替继承来实现业务功能,对动态改变业务实现来说,相比更灵 ...
- BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)
转博客大法好 第4个子任务中,为什么只转移最近的一个位置,自己YY吧(多YY有益身体健康). #include <bits/stdc++.h> using namespace std; t ...
- Solr full improt时遇到的问题
安装和配置solr转载于:https://blog.csdn.net/u010510107/article/details/81051795jdk1.8 solr7.2 mysql8.0.17-bin ...
- 【Python之路】特别篇--Python反射
反射 说反射之前先介绍一下__import__方法,这个和import导入模块的另一种方式 1. import commons 2. __import__('commons') 如果是多层导入: 1. ...
- jquery file选择器 语法
jquery file选择器 语法 作用::image 选择器选取类型为 file 的 <input> 元素.大理石平台检定规程 语法:$(":file") jquer ...