專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

OS001_基本構(gòu)想與Cortex-M所提供的方便

作者:佚名   來(lái)源:互聯(lián)網(wǎng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月10日   【字體:

關(guān)于為何中斷入棧時(shí)使用正在使用的指針,入棧后強(qiáng)制使用MSP:這是一個(gè)很方便的設(shè)計(jì),由于TaskSwitch在中斷中進(jìn)行,中斷時(shí)使用原指針入棧,即使用某個(gè)進(jìn)程的堆棧,在TaskSwitch中,將會(huì)把堆棧指針換成另一個(gè)進(jìn)程的堆棧,下一次切換回當(dāng)前進(jìn)程時(shí),就似乎只是從前一次的ISR中返回一樣,在進(jìn)程眼中并沒(méi)有什么區(qū)別。

  • 線程中應(yīng)使用PSP:由于ISR中可能會(huì)有堆棧操作以保存R4--R11的值,如果進(jìn)程與ISR使用同一個(gè)指針,那么意味著必須在進(jìn)入ISR以后馬上切換SP到應(yīng)有的位置,而不是使用原來(lái)的進(jìn)程SP,這樣使得C語(yǔ)言寫(xiě)的終端服務(wù)可能出現(xiàn)問(wèn)題。為了使得TaskSwitch與中斷相對(duì)獨(dú)立,即只要在中斷中調(diào)用就行,與調(diào)用的位置以及在那個(gè)ISR調(diào)用中無(wú)關(guān),那么就應(yīng)該使用兩個(gè)SP,這樣使得ISR仍然可以使用C來(lái)寫(xiě),只把TaskSwitch部分用匯編寫(xiě),TaskSwitch部分負(fù)責(zé)修改PSP 的值,其實(shí)只有一句話需要使用匯編寫(xiě),只需提供一個(gè)C的接口即可。
  • TaskSwitch在cortex中的實(shí)現(xiàn):
    1. 其基本思想在于利用中斷的自動(dòng)入棧與出棧,由于出棧入棧時(shí)存入了PC,使得切換任務(wù)是可以簡(jiǎn)單的切換堆棧指針,使其自動(dòng)出棧,回復(fù)PC的值,跳轉(zhuǎn)到響應(yīng)的task。
    2. 堆棧內(nèi)容:{R0,R1,R2,R3,R12,LR,PC,PSR}
    3. 假設(shè)兩個(gè)task: task1,task2,初始時(shí):task1Stack:{0,0,0,0,0,0,task1,0},task1Stack:{0,0,0,0,0,0,task2,0}
    4. 系統(tǒng)初始化,模擬一次中斷返回自動(dòng)出棧,假設(shè)在task1上執(zhí)行:task1Stack:{},task1Stack:{0,0,0,0,0,0,task2,0}
    5. 此后PSP為task1;,使用PSP,直接修改PC到task1,此后開(kāi)始運(yùn)行task1
    6. 中斷發(fā)生,自動(dòng)入棧到task1堆棧中,此時(shí)為handler,修改psp到task2棧,中斷返回,返回時(shí)自動(dòng)出棧,將使用task2的棧,恢復(fù)了task2在前一次中斷的狀態(tài),在task2看來(lái)并沒(méi)有進(jìn)入task1,而是簡(jiǎn)單的近中斷,然后中斷返回。此后循環(huán)上述過(guò)程?捎孟聢D抽象。
  • 關(guān)閉窗口

    相關(guān)文章