掛起:
所謂掛起一個任務(wù),就是暫停這個任務(wù)運行,它仍然占用一定的內(nèi)存空間,有可能對CPU也在占用著.
示意如圖
任務(wù)切換宏OS_TASK_SW() 任務(wù)切換的工作主要是靠OSCtxSw()來完成的。它需要做7項工作:
(1) 把被終止任務(wù)的斷點指針保存到任務(wù)堆棧中;
(2) 把CPU通用寄存器的內(nèi)容保存到任務(wù)堆棧中;
(3) 把被終止任務(wù)的任務(wù)堆棧指針當(dāng)前值保存到該任務(wù)的任務(wù)控制塊的OSTCBStkPt中
(4) 獲得待運行任務(wù)的任務(wù)控制塊;
(5) 使CPU通過任務(wù)控制獲得待運行任務(wù)的堆棧指針;
(6) 把待運行任務(wù)堆棧中通用寄存器的內(nèi)容恢復(fù)到CPU的通用寄存器中;
(7) 使CPU獲得待運行任務(wù)的斷點指針。
示意代碼:
viod OSCtxSw(void)
{
用壓棧指令把CPU通用寄存器R1,R2..壓入堆棧;
OSTCBCur->OSTCBStkPtr = SP; //在中止任務(wù)控制塊中保存SP
OSTCBCur = OSTCBHighRdy; //任務(wù)控制塊的切換
OSPrioCur = OSPrioHighRdy;
SP = OSTCBCur->OSTCBStkPtr;
用出棧指令把R1,R2..彈入CPU的通用寄存器;
IRET; //中斷返回,使PC指向待運行的任務(wù)
}
當(dāng)然OSSemPend()等待信號量等一系列函數(shù)也使任務(wù)進入等待狀態(tài),但是任務(wù)掛起函數(shù)OSTaskSuspend()可以掛起當(dāng)前任務(wù),也可以掛起其他任務(wù);而等待信號量OSSemPend()只能掛起當(dāng)前任務(wù),而且可以多個任務(wù)等待同一個信號量,實現(xiàn)任務(wù)的同步;
OSSemPend()主要是判斷待要掛起的任務(wù)是否調(diào)用這個函數(shù)任務(wù)本身。
(1) 如果是任務(wù)本身是,則必須刪除就緒表中的就緒標(biāo)志,并在任務(wù)控制成員OSTCBStat中做掛起記錄,然后引發(fā)一次任務(wù)調(diào)度,以使CPU去運行就緒的其他任務(wù);
(2) 如果不是本身,那么只要刪除任務(wù)就緒表中被掛起任務(wù)的就緒標(biāo)志,并在任務(wù)控制塊成員OSTCBStat中做掛起標(biāo)志。
任務(wù)中斷 :
系統(tǒng)接收到中斷請求后,如果這是CPU處于中斷允許狀態(tài)(即中斷是開放的),系統(tǒng)就會終止正在運行的當(dāng)前任務(wù),而按照中斷向量(中斷服務(wù)子程序的入口地址)的指向轉(zhuǎn)而去運行中斷服務(wù)子程序(ISR);當(dāng)子程序運行完畢后,系統(tǒng)會根據(jù)情況返回到被中止的任務(wù)繼續(xù)運行,或者轉(zhuǎn)而運行一個更高優(yōu)先級的就緒任務(wù)。
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/chengocean/archive/2010/12/28/6103421.aspx
|
|