OSQPend
OSQPend
OSQPend()函數用於任務等待消息。
void *OSQPend(OS_EVENT *pevent, INT16U timeout, INT8U *err)
消息通過中斷或者另外的任務發送給需要的任務。消息是一個以指針定義的變數,在不同的程序中消息的使用也可能不同。如果調用OSQPend()函數時,隊列中已經存在需要的消息,那麼該消息被返回給OSQPend()函數的調用者,隊列中清除該消息;若調用OSQPend()函數時,隊列中沒有需要的消息,那麼OSQPend()函數掛起當前任務,直到得到需要的消息或者超出定義的操時時限。如果同時有多個任務等待同一個消息,那麼μC/OS-Ⅱ系統默認最高優先順序的任務取得消息,並且任務恢復執行。一個OSTaskSuspend()函數掛起的任務也可以接收消息,但這個任務一直保持掛起狀態,直到通過調用OSTaskResume()函數恢復任務的運行。
pevent 指向即將接收消息的隊列的指針。該指針的值在建立該隊列時可以得到。
timeout 允許一個任務在經過了指定數目的時鐘節拍后還沒有得到需要的消息時,恢復運行狀態。如果該值 為0,則表示任務將持續的等待消息。最長的等待時間為65535個時鐘節拍。這個時間長度並不是非 常嚴格的,可能存在一個時鐘誤差,因為只有在一個時鐘節拍結束后,才會減少定義的等待超時鐘節 拍。
err 指向包含錯誤碼的變數的指針。OSQPend()函數返回的錯誤碼可能為下述幾種之一:
OS_NO_ERR 消息被正確的接收。
OS_ERR_TIMEOUT 消息沒有在指定的等待時限內送到。
OS_ERR_EVENT_TYPE pevent不是指向消息隊列的指針。
OS_ERR_PEVENT_NULL pevent是空指針。
OS_ERR_PEND_ISR 在中斷中調用該函數。雖然規定了不允許從中斷調用該函數,但μC/OS-Ⅱ仍然包含了檢測這種情況的功能。
OSQPend()返回接收的消息,並將*err置為OS_NO_ERR。若沒有在指定數目的時鐘節拍內接收到需要的消息,OSQPend()則返回空指針,且將*err設置為OS_TIMEOUT。
1、必須先建立消息郵箱,然後才能使用。
2、不允許在中斷中調用該函數。
OS_EVENT *CommQ;
void CommTask ( void *data)
{
INT8U err;
void *msg;
pdata=pdata;
for ( ; ;)
{
. .
msg=OSQPend(CommQ,100.&err);
if (err==OS_NO_ERR)
{
.
. .
}
else
{
.
. .
} . .
}
}