中断响应序列

Cortex-M3的中断响应序列包括:入栈,取向量,更新寄存器;

1. 入栈

Cortex-M3的中断响应会自动保存现场:依次将xPSR,PC,LR,R12,R0-R3压入堆栈;响应异常时正在使用哪个堆栈指针,则压入哪个堆栈,进入中断服务例程后,将一直使用MSP;

地址寄存器保存的顺序
旧SP(N-0)原内容-
(N-4)xPSR2
(N-8)PC1
(N-12)LR8
(N-16)R127
(N-20)R36
(N-24)R25
(N-28)R14
新SP(N-32)R03

先把PC和xPSR的值入栈,是为了尽早的启动服务例程指令的预取,以及更新xPSR的IPSR段的值;

2. 取向量

当数据总线执行入栈操作的时候,指令总线正在执行取向量操作;即从向量表中找出正确的中断向量,然后在服务例程入口处预取指令;取向量和入栈是同时进行的;

3. 更新寄存器

在中断开始响应之后,执行服务例程之前,更新了一系列寄存器:
SP:入栈会把SP更新到新的位置,中断服务例程由MSP负责堆栈的访问;
PSR:IPSR位段会更新为新响应的异常编号;
PC:PC将指向服务例程的入口地址;
LR:LR的用法将被重新解释,其值将更新为一种特殊的值,称为“EXC_RETURN”,并在异常返回时使用;
在中断响应时,NVIC也更新了一些寄存器,例如,新响应异常的悬起位被清除,其活动位被激活;

中断返回

Cortex-M3的中断返回序列需要一个特定的动作来触发,这个动作就是把EXC_RETURN送往PC,例如:BX LR;
在启动了中断返回序列后,将执行以下操作:
出栈:将先前压入堆栈的寄存器恢复,堆栈指针也更新;
更新NVIC寄存器:异常返回,其相应的活动位将被硬件清除;

EXC_RETURN

进入中断服务程序后,LR(R14)寄存器的值会被更新为特殊的值‘EXC_RETURN’(原来的值已压入堆栈);执行完中断服务程序后,只要把这个值送往PC,就会启动中断返回序列;

EXC_RETURN位段如下:

bits-
bit[31:4]EXC_RETURN的标识,全为1
bit[3]0表示返回后进入handler模式,1表示返回后进入线程模式
bit[2]0表示返回后使用MSP,1表示返回后使用PSP
bit[1]保留
bit[0]0表示返回ARM状态,1表示返回thumb状态,CM3中必须为1

合法的EXC_RETURN值

  • 0xffffffff1 : 返回handler模式
  • 0xffffffff9 : 返回线程模式,并使用MSP
  • 0xffffffffd : 返回线程模式,并使用PSP

如果在线程模式,且使用MSP时被中断,中断服务例程中EXC_RETURN=0xfffffff9;
如果在线程模式,且使用PSP时被中断,中断服务例程中EXC_RETURN=0xfffffffd;
如果在handler模式时被中断,中断服务例程中EXC_RETURN=0xfffffff1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值