因为在标准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状态寄存器的更多相关文章

  1. python---函数补充(变量传递),语句执行顺序(入栈顺序)

    一:函数补充 默认作为函数参数的数据,是浅拷贝传递.不是和C等语言一样,产生一个临时变量. class T: def __init__(self,num): print(id(num)) self.n ...

  2. C++中栈的出栈,入栈规则:A,B,C,D,E

    考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前  栈中元素可以出栈,则出栈序列可能是_____a d___________. a.  ABCED b.  DBCEA   c.  CD ...

  3. c语言中函数参数入栈的顺序是什么?为什么

    看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){   ...

  4. 在堆栈中,push为入栈操作,pop为出栈操作

    LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中,push为入栈操作 ...

  5. C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

    /**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋 ...

  6. C语言中结构体定义实际上相当于变量入栈

    struct context { int edi; int esi; int ebx; int ebp; int eip;}; 对应的入栈顺序是 pushl %esp pushl %eip pushl ...

  7. C中入栈顺序和运算顺序有关系吗?

    如下代码会怎么执行? printf( "%c,%c,%c\n", getchar(), getchar(), getchar() ); 实际测试,是倒序执行,感觉上符合“C函数的形 ...

  8. 函数调用过程中,函数参数的入栈顺序,why?

    C语言函数参数入栈顺序为从右至左.具体原因为:C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数.通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底.除非知道参数个数,否则是无法通 ...

  9. 【freertos】002-posix模拟器设计与cortex m3异常处理

    目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...

随机推荐

  1. Delphi DLL文件的动态调用

    樊伟胜

  2. 3、Rsync备份服务实战

    1.Rsync基本概述 rsync是一款开源的备份工具,可以在不同主机之间进行同步,可实现全量备份与增量备份,因此非常适合用于架构集中式备份或异地备份等应用. rsync官方地址:传送门http:// ...

  3. 网络初级篇之RSTP(原理与配置)

    一.RSTP的产生 前面的文章写到了当网络拓扑发生变化时,STP的收敛速度大约需要花费30秒-50秒的时间才会继续转发数据.这样在实际生产环境中花费的时间是非常长的,这样RSTP(快速生成树协议)便应 ...

  4. 使用比特币轻量钱包Electrum

    一.选择对应的钱包安装程序 浏览器打开 https://electrum.org/#download 选择windwos版本的安装程序 点击下载,并安装 二.运行Electrum的 testnet版本 ...

  5. mysql-mmm实现高可用和部署时须要考虑的问题

    mysql-mmm简介 Multi-Master Replication Manager for MySQL,简称mmm,官方的介绍可以参考mmm官网.好处自然不用说,读写分离,官方称读能做到负载均衡 ...

  6. python的索引与切片和元祖

    '''索引: 1.索引从0开始 2.末尾元素为 -1 3.能被for循环,有序的数据集合 切片: 1.顾头不顾尾 2.a = "123abcdfg" print(a[0::2]) ...

  7. E - We Need More Bosses CodeForces - 1000E (tarjan缩点,树的直径)

    E - We Need More Bosses CodeForces - 1000E Your friend is developing a computer game. He has already ...

  8. Python——列表赋值的若干用例

    原创声明:本文系博主原创文章,转载或引用请注明出处. 1. 直接赋值 >>> a = [1,2,3,4,5] >>> b = a >>> id(a ...

  9. 生成静态libevent

    INCLUDE C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include D:\vs2013\VC\include LIB C:\Prog ...

  10. string::compare

    1. compare string (1) 4int compare (const string& str) const noexcept; substrings (2) int compar ...