ARM cortex-M3 异常处理分析

2024-06-06 23:48
文章标签 分析 异常 处理 arm cortex m3

本文主要是介绍ARM cortex-M3 异常处理分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、进入异常之前处理器可能的状态有:

1.     handler

2.     线程,MSP

3.     线程,PSP

 

二、产生异常时:

 

1、 有一个压栈的过程,产生异常时使用PSP,就压入到PSP中,产生异常时使用MSP,就压入到MSP中

2、 会根据处理器的模式和使用的堆栈,设置LR的值(当然设置完的LR的值再压栈)

 

三、异常返回时:

根据LR的值,判读使用那个堆栈,然后再从相应的堆栈中POP数据到寄存器。

 

举例说明:

在利用OSStartHighRdy->OSPendSV->OSPendSV_nosave启动第一个线程时,在异常进入的时候,压栈到MSP(不会影响PSP的内容),在通过BX      LR指令从异常返回之前,有一句ORR     LR, LR, #0x04来设置LR的值,保证我们从异常返回时是从PSP中POP数据到寄存器里,而此时PSP的值是OSTCBHighRdy->OSTCBStkPtr,即任务创建时定义的堆栈数组,同时在OSTaskStkInit函数中对该任务数组初始化时,要保证其组织结构和异常产生时处理器自动压栈产生的栈的结构相同。

 

四、栈中的内容分析:

1、 变量

2、 调用函数时,如果子函数比较复杂,会由编译器自动的压入r4-r11, lr(压入多少寄存器,由子函数的复杂程度决定的)

3、 异常保存,压入栈的是r0-r3,r12,LR,PC,xSPR(硬件直接完成的)

4、 进程切换,所有寄存器全部压栈

 

 

由于异常死机了之后的具体操作:

 

产生异常时,两个值我们需要,一个是pc,一个是LR,通过LR找到栈, 再通过栈找到pc

1、 如果LR=0xFFFFFFF9说明产生异常的时候使用的是MSP,我们只需要读出当前sp的值,

sp  += 0x1c; 读出的内容就是产生异常时压入栈的PC的值,这个值跟反汇编代码对比,就能得到具体哪句话产生的异常。

2、 如果LR=0xFFFFFFFD明产生异常的时候使用的是PSP,我们需要读出PSP的值,不要直接来读sp的值,在keil集成开发环境中,调试时寄存器窗口有个Banked选项,会给出当前PSP的值,当然也可以在异常处理中加入两句话:

MRS        R0,PSP

PUSH             {R0}

我们就能在当前MSP中得到,我们PSP的值了,之后操作和上面一样,psp+=0x1c; 读出的内容就是产生异常时压入栈的PC的值,这个值跟反汇编代码对比,就能得到具体哪句话产生的异常。

这篇关于ARM cortex-M3 异常处理分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037584

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda