OSStartHighRdy()

µC/OS-II 的移植需要用戶改寫OS_CPU_A.ASM中的四個函數:
OSStartHighRdy()
OSCtxSw()
OSIntCtxSw()
OSTickISR()
該函數由SStart()函數調用,功能是運行優先級最高的就緒任務,在調用OSStart()之前,用戶必須先調用OSInit(),並且已經至少創建了一個任務(請參考OSTaskCreate()和OSTaskCreateExt()函數)。OSStartHighRdy()默認指針OSTCBHighRdy指向優先級最高就緒任務的任務控制塊(OS_TCB)(在這之前OSTCBHighRdy已由OSStart()設置好了)。圖F9.3給出了由函數OSTaskCreate()或 OSTaskCreateExt()創建的任務的堆棧結構。很明顯,OSTCBHighRdy->OSTCBStkPtr指向的是任務堆棧的頂端。
函數OSStartHighRdy()的代碼見程序清單L9.3。

爲了啓動任務,OSStartHighRdy()從任務控制塊(OS_TCB)[程序清單L9.3(1)]中找到指向堆棧的指針,然後運行POP DS [程序清單L9.3(2)], POP ES [程序清單L9.3(3)], POPA [程序清單L9.3(4)], 和 IRET [程序清單L9.3(5)]指令。此處筆者將任務堆棧指針保存在任務控制塊的開頭,這樣使得堆棧指針的存取在彙編語言中更容易操作。
當執行了IRET指令後,CPU會從(SS:SP)指向的堆棧中恢復各個寄存器的值並執行中斷前的指令。SS:SP+4指向傳遞給任務的參數pdata。

程序清單L 9.3	OSStartHighRdy().
_OSStartHighRdy  PROC FAR

   MOV    AX, SEG _OSTCBHighRdy          ; 載入 DS
   MOV    DS, AX                         ; 

   LES    BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr	(1)
   MOV    SS, ES:[BX+2]                  ; 
   MOV    SP, ES:[BX+0]                  ; 
;
   POP    DS                             ; 恢復任務環境	(2)
   POP    ES                             ;	(3)
   POPA                                  ;	(4)
;
   IRET                                  ; 運行任務	(5)

_OSStartHighRdy  ENDP


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章