Cortex M3使用PendSV异常
2017-02-04 19:14
218 查看
我个人理解PendSV就是一个软中断(由软件触发的中断),触发方法为
SCB->ICSR |= 1 << 28;
软中断有什么意义?我软中断何不直接调用PendSV_Handler()?效果不是都一样?
要讲清楚这两者之间的区别就必须了解Cortex M3的运行模式, Cortex M3有两种操作模式:Handler模式(可以简单的认为就是中断服务函数中的代码)和Thread模式(普通的代码), 两种特权级别:特权级和用户级.
在Thread模式下可以拥有特权级或者用户级,在Handler模式下肯定是特权级.
PendSV中断虽然是软中断,但也有特权级别啊.拥有某些特权就可以实现任务切换了(主要是某些寄存器必须是拥有特权级别后才能读写)
__asm __weak void PendSV_Handler(void){IMPORT CurrentTaskIMPORT NextTaskCPSID IMRS R0, PSPCBZ R0, nextSTMDB R0!, {R4-R11}LDR R1, =CurrentTask ; R1 = &CurrentTaskLDR R1, [R1] ; R1 = CurrentTaskSTR R0, [R1] ; CurrentTask = R0nextLDR R1, =NextTask ; R1 = &NextTaskLDR R1, [R1] ; R1 = NextTaskLDR R0, [R1] ; R0 = *NextTaskLDMIA R0!, {R4 - R11}MSR PSP, R0LDR R1, =CurrentTaskLDR R2, =NextTaskLDR R2, [R2]STR R2, [R1]ORR LR, #0x04CPSIE IBX LR}
相关文章推荐
- Cortex-M3的PendSV中断以及uCOS系统一点思考
- Cortex-M3和Cortex-M4 Fault异常应用之一 ----- 基础知识
- Cortex-M3工作模式与异常
- Cortex-M3异常中断及向量表定义
- STM32 独立看门狗使用经验(Cortex-M3)
- 替代IAR,使用免费的gcc编译开发cortex-m3产品
- Cortex M3异常
- CORTEX-M3 异常/中断控制(使能和除能)
- Jlink V7在MDK下使用Cortex-M3-Jlink模式开发STM32的说明
- [ M3 PN ] STM32F10XXX(Cortex-M3) MDK-RAM 使用固件库函数的配置
- cortex-M3 异常-- SVC、PendSV介绍
- cortex-M3 异常-- SVC、PendSV介绍
- 如何使用GNU编译器GCC来编译Cortex-M3?GCC + STM32
- Cortex-M3异常中断及向量表定义
- Cortex -M3 用户级与特权级切换 及 MPU的使用
- STM32F10XXX(Cortex-M3) MDK-RAM 使用固件库函数的配置
- cortex-M3 异常和中断
- 从Cortex-M3的MSP 和PSP谈Linux能否在中断中使用Sleep
- ARM Cortex-M3 异常优先级以及CMSIS RTOS RTX的中断优先级
- Cortex-M3 异常和中断---基于NXP LPC177x/8x