1前言
1.1 PendSV
在ARM V7上,PendSV用来作为RTOS调度器的御用通道,上下文切换,任务调度都是在其ISR中实现的。所谓pend,字面意思即有悬起等待的意思,ARM官方也明确说明,PendSV应该在其他异常处理完毕后执行。
具体来说,ICSR(Interrupt Control and State Register)专为为PendSV设置了相关控制位段:
① 悬起设置位(PENDSVSET,PendSV set-pending bit),该位写0无效,置1则将PendSV设置为pending状态(这也是悬起PendSV的唯一方式);
② 悬起清除位(PENDSVCLR,PendSV clear-pending bit,该位写0无效,置1则解除PendSV的悬起状态;
注意,如果同时向这两个控制位写1,将导致无法预测的行为。在Cortex-M7中,ICSR的物理地址为0xE000ED04,复位后默认值为0x00000000,在特权级下支持读写。
1.2 SVC
复位后,处理器默认进入线程模式(Thread mode),特权极访问。 在特权级下的程序可以为所欲为,程序可以访问所有范围的存储器(如果有 MPU,还要在 MPU 规定的禁地之外),并且可以执行所有指令。
一旦进入用户级,再想回来就得走“法律程序”了——用户级的程序不能简简单单地试图改写 CONTROL 寄存器就回到<