Cortex-M3 异常中断响应与返回
【异常/中断响应】
Cortex-M3的异常/中断响应序列包括:
- 入栈:把8个寄存器的值压入栈。
- 取向量:从向量表中找出对应的服务程序入口地址。
- 更新寄存器:更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC
【入栈】
响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR、PC、LR、R12以及R3~R0由硬件自动压入适当的堆栈中:如果当响应异常时,当前的代码正在使用PSP,则压入PSP,也就是使用进程堆栈;否则就压入MSP,使用主堆栈。
一旦进入了异常中断服务例程,就将一直使用主堆栈。
假设入栈开始时,SP的值位N,则在入栈后,入栈顺序以及入栈后堆栈中的内容变化如图所示:
因为AHB接口上的流水线操作本性,地址和数据都是经过一个流水周期之后才进入。
在自动入栈的过程中,把寄存器写入堆栈内存的时间顺序,并不是与写入的空间顺序相对应的。但是,Cortex-M3内核会保证:正确的寄存器将被保存到正确的位置。
【取向量】
在数据总线执行入栈操作的时候,指令总线正在执行取向量操作:即从向量表中找出正确的中断向量,然后在服务例程入口处预取指令。
取向量和入栈是同时进行的;
【更新寄存器】
在入栈和取向量操作完成之后,执行异常中断服务程序之前,还要更新一系列的寄存器:
- 堆栈指针SP:在入栈后,会把堆栈指针(PSP或MSP)更新到新的位置。在执行异常中断服务程序时,将由MSP负责对堆栈的访问。
- 程序状态寄存器PSR:更新IPSR位段的值为新响应的异常编号。
- 程序计数寄存器PC:在取向量完成后,PC将指向异常中断服务程序的入口地址。
- 连接寄存器LR:在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”。在异常进入时由系统计算并赋给LR,并在异常返回时使用它。
另外,在NVIC中,也会更新若干个相关寄存器。例如,新响应异常的悬起位将被清除,同时其活动位将被置位。
【异常/中断返回】
当异常中断服务程序执行完毕之后,需要一个“异常返回”动作序列,从而恢复先前的系统状态,使被中断的程序继续执行。
从形式上看,有3种途径可以触发异常返回序列,如:
不管使用哪一种返回指令,都需要用到先前存储到LR中的EXX_RETURN,把EXC_RETURN送往PC。
在启动了中断返回序列后,将执行以下操作:
- 出栈:恢复先前压入堆栈的寄存器的值。内部的出栈顺序与入栈时的向对应。堆栈指针的值也恢复更新。
- 更新NVIC寄存器:异常返回,其将于的活动位将被硬件清除。对于外部中断,如果中断输入再次被置为有效,悬起位也将再次置位,新的中断响应序列也随之再次执行。
参考摘录:
《Cortex-M内核系列和STM32-讲座2教程.pdf》
《ARM Cortex-M3权威指南.pdf》
Cortex-M3 异常中断响应与返回的更多相关文章
- 【freertos】002-posix模拟器设计与cortex m3异常处理
目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...
- ARM Cortex M3系列GPIO口介绍(工作方式探讨)
一.Cortex M3的GPIO口特性 在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图 从图中可以看出 ...
- STM32学习之路入门篇之指令集及cortex——m3的存储系统
STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ...
- Spring 通过XML配置文件以及通过注解形式来AOP 来实现前置,环绕,异常通知,返回后通知,后通知
本节主要内容: 一.Spring 通过XML配置文件形式来AOP 来实现前置,环绕,异常通知 1. Spring AOP 前置通知 XML配置使用案例 2. Spring AOP ...
- ARM Cortex M3(V7-M架构)硬件启动程序 一
Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)
ARM架构: 由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7: 一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...
- Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors
Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...
- 第三节:使用Log4net和过滤器记录异常信息,返回异常给前端
上次面试,遇到,在项目中如何处理业务异常和代码异常,使用txt记录异常信息后,如何直接区分出异常的类型,异常怎么分类处理,希望大家能帮我提出宝贵的意见,完善处理异常, 统一返回参数 public cl ...
- 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别
ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...
随机推荐
- linux tty终端个 pts伪终端 telnetd伪终端
转:http://blog.sina.com.cn/s/blog_735da7ae0102v2p7.html 终端tty.虚拟控制台.FrameBuffer的切换过程详解 Framebuffer Dr ...
- bom and dom
bom:Broswer Object Model: 浏览器对象模型- navigator: 获取客户机的信息(浏览器的信息)document.write(navigator.appName);- sc ...
- Docker容器内服务自启
创建容器时需要配置--privileged和容器启动后执行的命令为/sbin/init/. docker run -d -it --name example -p 3308:3306 -p 2080: ...
- 性能篇——函数调用结果的 LRU 缓存
1. 应用场景: 多次调用同一函数 2. 普通写法: def say(name): print("hellow:%s"%name) now = datetime.datetime. ...
- ubuntu学习笔记-sudo/gedit
1.sudo命令 sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户的登录 和管理时间 ...
- Java应用的理解
一.程序 对每个程序来说,不管用什么语言开发出来的,他的功用分为三种: 1.接收输入流 2.处理数据 3.传出输出流 接收输入流,包括从网络.文件.用户输入等:传出输出流,包括网络.文件.显示设备等: ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)]
[易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)] 项目实战 实战2:命令行工具minigrep 我们继续开发我们的minigrep. 我们现 ...
- CSS基础学习-5.CSS属性_字体文本文本装饰
- pycharm运行程序,总是出现IPthony界面(IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help. PyDev console: using IPython 6.2.1)
解决方式如下: 取消即可.
- charindex函数--->检索字符在字符串中的起始位置
语法:CHARINDEX(检索字符,被检索字符串) 返回值:检索字符在被检索字符串中的起始位置.