2009年5月29日 星期五

Task Management: OSTaskSuspend(), OSTaskResume()

OSTaskSuspend()

首先檢查task的優先權,一開始先檢查要暫停的task是否合理,優先權必須大於0,接下來再檢查要暫停的是否為idle task,如果是就不合理,因為idle task永遠在ready的狀態,暫停了就會違返其特性。過後再檢查要暫停的task優先權數是否正確,必須介於0和idle task之間。接下來判斷是要暫停自己或是其他的task。暫停自己的task有兩種方法,一個是透過OS_PRIO_SELF,另一個是指定優先權,如果不是這兩種方法,就可以肯定要暫停的是其他的task。task將會被暫停,所以就要把task從ready queue移走,然後在task的TCB裡面設定stat為suspend的形式。最後,如果是task要將自己停掉,就呼叫OS_Sched()。

OSTaskResume()

首先檢查task的優先權的值,必須小於OS_LOWEST_PRIO。過後檢查要resume之task的狀態是否為suspend,因為resume就只能用來喚醒被suspend的task。要resume的task,狀態有可能是OS_STAT_SUSPEND,OS_STAT_SEM,OS_STAT_FLAG,代表著task存在於一個waiting queue裡面。與OS_STAT_SUSPEND做運算之後,如果等於OS_STAT_RDY,就可以繼續執行,要使task處於ready的狀態,OSTCBDly必須為0,表示task沒有在等待延遲的期滿。當以上兩個條件都滿足後,task才會處於ready的狀態。resume的task有可能是最高優先權的task,所以要執行OS_Sched()。

沒有留言:

張貼留言