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 前言 如 ...
随机推荐
- vue2-editor使用
<template> <div class="wrapper wrapper-content" id="notes" v-cloak> ...
- centos7 搭建pxe 安装centos windows(非全自动)(这个教程测试centos6和7.2可以用,Windows各版本也可以)
yum install dhcp xinetd syslinux tftp-server httpd 编辑dhcpdb配置(192.168.0.1为本机IP) ; max-lease-time ; l ...
- Educational Codeforces Round 71 (Rated for Div. 2) E XOR Guessing (二进制分组,交互)
E. XOR Guessing time limit per test1 second memory limit per test256 megabytes inputstandard input o ...
- python操作mysql代码讲解(及其实用,未来测试工作主要操作数据库的方法)
pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 1 pip3 install pymysql 使用操作 1.执行SQL 1 2 3 4 ...
- hdf5文件、tqdm模块、nunique、read_csv、sort_values、astype、fillna
pandas.DataFrame.to_hdf(self, path_or_buf, key, **kwargs): Hierarchical Data Format (HDF) ,to add an ...
- Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader
Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader ...
- springboot2.1.7整合Druid
一.maven的依赖:文中就贴重点的, 其他依赖就不贴了 <dependency> <groupId>com.alibaba</groupId> <artif ...
- DNS原理及实战配置指南
目录 DNS简介 DNS域名结构介绍 顶级域名 DNS工作原理 工作模式和端口 资源记录 安装bind(详细) 实战:配置一个正反向解析 实战:配置DNS转发 实战:配置DNS主从 实战:子域授权 实 ...
- IIFE 立即执行函数表达式-模块化
1)立即执行 2)表达式 3)括号,分号结束 | 前缀运算符 | 表达式上下文 4)只需要执行一次,内部变量无需维护,可用于初始化 (function( ) { })( ); 或 (function( ...
- BZOJ 3173: [Tjoi2013]最长上升子序列 (线段树+BIT)
先用线段树预处理出每个数最终的位置.然后用BIT维护最长上升子序列就行了. 用线段树O(nlogn)O(nlogn)O(nlogn)预处理就直接倒着做,每次删去对应位置的数.具体看代码 CODE #i ...