关于为何中断入栈时使用正在使用的指针,入栈后强制使用MSP:这是一个很方便的设计,由于TaskSwitch在中断中进行,中断时使用原指针入栈,即使用某个进程的堆栈,在TaskSwitch中,将会把堆栈指针换成另一个进程的堆栈,下一次切换回当前进程时,就似乎只是从前一次的ISR中返回一样,在进程眼中并没有什么区别。
- 其基本思想在于利用中断的自动入栈与出栈,由于出栈入栈时存入了PC,使得切换任务是可以简单的切换堆栈指针,使其自动出栈,回复PC的值,跳转到响应的task。
- 堆栈内容:{R0,R1,R2,R3,R12,LR,PC,PSR}
- 假设两个task: task1,task2,初始时:task1Stack:{0,0,0,0,0,0,task1,0},task1Stack:{0,0,0,0,0,0,task2,0}
- 系统初始化,模拟一次中断返回自动出栈,假设在task1上执行:task1Stack:{},task1Stack:{0,0,0,0,0,0,task2,0}
- 此后PSP为task1栈基址,使用PSP,直接修改PC到task1,此后开始运行task1
- 中断发生,自动入栈到task1堆栈中,此时为handler,修改psp到task2栈,中断返回,返回时自动出栈,将使用task2的栈,恢复了task2在前一次中断的状态,在task2看来并没有进入task1,而是简单的近中断,然后中断返回。此后循环上述过程。可用下图抽象。