關于為何中斷入棧時使用正在使用的指針,入棧后強制使用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,而是簡單的近中斷,然后中斷返回。此后循環上述過程。可用下圖抽象。