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、咬尾中断:后到中断无法抢占时,减少压栈出栈处理。
- STM32的中断处理1
- STM32的中断处理2
- STM32中断流程处理
- STM32中断流程处理
- STM32之系统中断处理
- STM32的DMA中断
- 浅谈STM32的中断
- STM32的外部中断
- STM32的定时器中断
- STM32的中断
- STM32中断的配置
- stm32中断的使用
- 1、STM32进入硬件错误中断(HardFault_Handle)处理方法
- stm32(二) stm32中断优先级的设置
- stm32(二) stm32中断优先级的设置
- stm32(二) stm32中断优先级的设置
- STM32外部中断处理流程及注意事项
- STM32事件 中断事件 中断的详解
- 搭建一个后台服务器--服务端代码(异步,大并发)
- 基础知识之IO流(装饰设计模式)
- C语言求素数的不同解法
- CListBox类常见函数用法
- UCOS_STM32的任务切换
- STM32的中断处理1
- Source Insight : 程序员最得心应手的代码阅读和编辑工具(高效)
- OCP-1Z0-051-V9.02-122题
- teraSort相关
- VDC 的SDL OSD
- 黑马程序员_<<基础加强--1.5新特性(泛型)(下)>>
- 字符串专项:LA 3490
- 移动技术
- vc6.0画走势图、折线图、饼状图的准备工作