STM32的中断处理1

来源:互联网 发布:pc6软件 编辑:程序博客网 时间:2024/06/05 16:27

1、MSP和PSP

1)control寄存器

CONTROL[1]  堆栈指针选择 
0=选择主堆栈指针MSP(复位后缺省值) 
1=选择进程堆栈指针PSP 
在线程或基础级(没有在响应异常——译注),可以使用PSP。在handler模式下,
只允许使用MSP,所以此时不得往该位写1。 
CONTROL[0]  0=特权级的线程模式 
1=用户级的线程模式 
Handler模式永远都是特权级的。 

2)复位后缺省使用MSP。

3)中断为处理模式(handle),永远是特权级;非中断即为线程模式,可在中断中指定(control[0])为特权级或用户级。

4)处理模式始终使用MSP;线程模式可选使用PSP或MSP(有OS时,一般使用PSP),由EXC_RETURN控制。


2、进入中断:


1)依次把xPSR, PC, LR, R12以及R3‐R0由硬件自动压入适当的堆栈中:

2)如果当响应异常时,当前的代码正在使用PSP,则压入PSP,即使用线程堆栈;否则压入MSP,使用主堆栈。一旦进入了服务例程,就将一直使用主堆栈。 

3)PC:在向量取出完毕后,PC将指向服务例程的入口地址, 

4)R:LR的用法将被重新解释,其值也被更新成一种特殊的值,称为“EXC_RETURN”,并且在异常返回时使用。EXC_RETURN的二进制值除了最低4位外全为1,而其最低4位则有另外的含义(见表9.3和表9.4)。 


合法的EXC_RETURN数值 功能 
0xFFFF_FFF1  返回handler模式 
0xFFFF_FFF9  返回线程模式,并使用主堆栈(SP=MSP) 
0xFFFF_FFFD  返回线程模式,并使用线程堆栈(SP=PSP) 

如果主程序在线程模式下运行,并且在使用MSP时被中断,则在服务例程中LR=0xFFFF_FFF9(主程序被打断前的LR已被自动入栈)。 
如果主程序在线程模式下运行,并且在使用PSP时被中断,则在服务例程中LR=0xFFFF_FFFD(主程序被打断前的LR已被自动入栈)。 

可以看到ucos第一次任务切换时,该值从0xFFFF_FFF9  被修改为0xFFFF_FFFD,即完成MSP到PSP的切换。
 

3、从中断中返回:

返回指令  工作原理 
BX <reg>  //当LR存储EXC_RETURN时,使用BX LR即可返回 
POP   {PC}和POP   {…,PC}  

//在服务例程中,LR的值常常会被压入栈。此时即可使用POP指令把LR存储的EXC_RETURN往PC里弹,从而激起处理器做中断返回 
LDR与LDM  //把PC作为目的寄存器,亦可启动中断返回序列

按照相反顺序弹出堆栈,如BX LR指令,PC检测到特殊的值EXC_RETURN,认为是从中断中返回。


4、咬尾中断:后到中断无法抢占时,减少压栈出栈处理。