2009年6月18日 星期四

Semaphore Management: OSSemDel()

OSSemDel()

這函式可以用來刪除號誌,在刪除號誌之前,必須先刪除操作號誌的所有task。一開始,我們要先確定是否為ISR所呼叫,因為ISR不能使用這個函數。接著再驗證pevent是否為空的指標,過後,判斷是否有task在等待號誌,再根據判斷結果記錄在tasks_waiting。OSSemDel()在刪除一個Semaphore時會有兩個選項,OS_DEL_NO_PEND和OS_DEL_ALWAYS。

先拿OS_DEL_NO_PEND來說,如果沒有task在等待號誌,才刪除號誌,否則就不能刪除號誌,回傳一個error的訊息。OS_DEL_ALWAYS表示無論怎樣都會去刪除號誌,接下來判斷如果有task在等待,就把task搬到ready queue,直到沒有task在等待,所有的task都會在ready queue。這時把ECB標示為未使用,再丟回free list。如果task在waiting queue裡面,就執行OS_Sched(),去找目前優先權最高的task。最後利用return ((OS_EVENT *)0),把號誌刪除。

沒有留言:

張貼留言