我个人理解PendSV就是一个软中断(由软件触发的中断),触发方法为
SCB->ICSR |= 1 << 28;
软中断有什么意义?我软中断何不直接调用PendSV_Handler()?效果不是都一样?
要讲清楚这两者之间的区别就必须了解Cortex M3的运行模式, Cortex M3有两种操作模式:Handler模式(可以简单的认为就是中断服务函数中的代码)和Thread模式(普通的代码), 两种特权级别:特权级和用户级.
在Thread模式下可以拥有特权级或者用户级,在Handler模式下肯定是特权级.
PendSV中断虽然是软中断,但也有特权级别啊.拥有某些特权就可以实现任务切换了(主要是某些寄存器必须是拥有特权级别后才能读写)
__asm __weak void PendSV_Handler(void) { IMPORT CurrentTask IMPORT NextTask CPSID I MRS R0, PSP CBZ R0, next STMDB R0!, {R4-R11} LDR R1, =CurrentTask ; R1 = &CurrentTask LDR R1, [R1] ; R1 = CurrentTask STR R0, [R1] ; CurrentTask = R0 next LDR R1, =NextTask ; R1 = &NextTask LDR R1, [R1] ; R1 = NextTask LDR R0, [R1] ; R0 = *NextTask LDMIA R0!, {R4 - R11} MSR PSP, R0 LDR R1, =CurrentTask LDR R2, =NextTask LDR R2, [R2] STR R2, [R1] ORR LR, #0x04 CPSIE I BX LR }