1. 程式人生 > >OSTimeDlyResume()--恢復一個延遲任務(取消任務延時)

OSTimeDlyResume()--恢復一個延遲任務(取消任務延時)

                   恢復一個延遲任務
描述:這個函式通過呼叫OSTimeDly() 或者 OSTimeDlyHMSM()去恢復一個延時的任務,它不能喚醒
               等待超時的任務。這個情況任務將把它看成等待超時,除非你指定這種效果,
               同時,不能恢復呼叫OSTimeDlyHMSM() 延時超過65535個時鐘節拍的任務,就是說,如果
               時鐘節拍是100Hz,你將不能夠任務OSTimeDlyHMSM(0, 10, 55, 350) 或者更大延遲數
 引數:prio:要恢復任務的優先順序
返回   : OS_NO_ERR      成功恢復
 *    OS_PRIO_INVALID     優先順序值大於最大值
 *            (i.e. >= OS_LOWEST_PRIO)
 *    OS_TIME_NOT_DLY     任務沒有等待時間期滿
 *    OS_TASK_NOT_EXIST    要恢復的任務沒有建立

μC/OS-Ⅱ允許使用者結束正處於延時期的任務,延時的任務可以不等待延時期滿,而是通過取消其它任務的延時來使自己處於就緒態,可以通過呼叫OSTimeDlyResume()和指定要恢復的任務的優先順序來完成。

OSTimeDlyResume()的具體資訊見下表:

為了說明OSTimeDlyResume()函式的使用方法,我們設計一個系統,假設TaskLED的任務優先順序為2。讓一個LED以0.5Hz的頻率閃耀,但每按鍵一次,LED狀態翻轉一次。下面是兩個任務的處理流程。

TaskLED任務程式碼如下。

void TaskLED (void *pdata)

{

……//初始化程式碼

while (1) //循壞控制LED以固定頻率閃爍

{

IO0CLR = LED1;//點亮LED

OSTimeDly(OS_TICKS_PER_SEC);//1s延時

IO0SET = LED1;//熄滅LED

OSTimeDly (OS_TICKS_PER_SEC);//1s延時

}

}

TaskKEY任務的程式碼如下。

void TaskKEY (void *pdata)

……初始化程式碼

while (1)

{

while ((IO0PIN & KEY1) != 0)//等待按健按下

{

OSTimeDly(1);//延時1個節拍用於任務切換

}

OSTimeDlyResume(2);//TaskLED優先順序為2,恢復TaskLED

while ((IO0PIN & KEY1) == 0)

{

OSTimeDly(1);//延時1個節拍,用於任務切換

}

}

}