您的位置:首页 > 其它

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}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: