2009年6月16日 星期二

suspend task

※ OSTaskSuspend()
1. 把某個task從rdyQ移走,將狀態改成OS_STAT_SUSPEND
2. 若是自己把自己停掉,就要call OS_Sched()


一個task可能會在 OS_STAT_SUSPEND,OS_STAT_SEM,OS_STAT_FLAG
都代表task在某各waitingQ裡

※ OSTaskResume()
1. ptcb->OSTCBStat &= ~OS_STAT_SUSPEND==OS_STAT_RDY
成立的話,表示這各task可以繼續往下執行,
所有等的事件都已經滿足。
2. ptcb->OSTCBDly==0
可能再等時間的發生(timer interrupt),ptcb->OSTCBDly代表要等的tick數,
不等於0的話代表不能繼續往下執行。
3.
(ptcb->OSTCBDly==0){
OSRdyGrp = ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] = ptcb->OSTCBBitX;
可能會造成OS_TimeDly(2)睡不到1個tick
ex.
第一個動作B睡一個tick
第二個動作A去suspend(B)
第三個動作C去resume(B)
(程式碼有少,跟課本不一樣????)

※ 把TCB抄出來,幫助除錯。
memcpy到一半時,中斷進來,可能會造成資料結構,
有部份是新的,有部份是舊的。
用critical section包住,可以保證資料是完整的。

沒有留言:

張貼留言