uC/OS-II 學習筆記之:任務刪除
一、概念:任務的刪除就是把任務由運行態或就緒態置于睡眠態,是任務創建的逆過程。
本文引用地址:http://www.j9360.com/article/201609/303413.htm二、操作:具體操作就是把將待刪除的任務的任務控制塊從任務控制鏈表中刪除,并歸還給空任務控制鏈表,
然后在任務就緒表中把該任務的就緒狀態位置為0,這樣任務就不會再被調度器調用了。
一般情況,為了安全起見,我們先在某個任務中提出刪除任務的請求,然后再在將待刪除任務中執行刪除操作,
即由待刪除任務自己刪除自己,而提出刪除任務請求的任務只負責提出請求。這樣的好處是可以讓待刪除任務
在合適的時候刪除自己,以利于在刪除自身之前釋放掉其占用的資源。
三、函數
(1)請求刪除任務函數:OSTaskDelReq(prio)//prio為待刪除任務的優先級別
(2)提出刪除請求的任務在調用該函數時,具體使用如下:
//只有當待刪除任務不存在了,就跳出循環
while (OSTaskDelReq(1) != OS_TASK_NOT_EXIST)
{
OSTimeDly(1);//延時一個時鐘節拍
}
(3)待刪除任務在調用該函數時,具體使用如下:
if (OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ)
{
OSTaskDel(OS_PRIO_SELF);//刪除任務自身
}
四、典型應用
//調用刪除任務函數的任務
//任務1,設優先級別為1
void TaskLed0(void *pdata)
{
while (1)
{
LED0 = !LED0;
OSTimeDlyHMSM(0, 0, 0, 400);
while (OSTaskDelReq(2) != OS_TASK_NOT_EXIST)
{
OSTimeDly(1);//延時一個時鐘節拍
}
}
}
//被刪除任務
//任務2,設優先級別為2
void TaskLed1(void *pdata)
{
while (1)
{
LED1 = !LED1;
OSTimeDlyHMSM(0, 0, 0, 400);
//判斷是否有其它任務發出了刪除自身的請求
if (OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ)
{
OSTaskDel(OS_PRIO_SELF);//刪除任務自身
}
}
}
解析:這就是一個在任務1里提出刪除任務2的請求,然后任務2刪除自身的例子。
參: 任哲 《嵌入式實時操作系統uC/OS-II原理及應用》
參: 盧有亮 《嵌入式實時操作系統uC/OS原理與實踐》
評論