看看任務掛起的函式
#if os_task_suspend_en > 0
int8u ostasksuspend (int8u prio)
if (prio >= os_lowest_prio)
}#endif
os_enter_critical();
if (prio == os_prio_self) else if (prio == ostcbcur->ostcbprio) else
ptcb = ostcbpriotbl[prio];
if (ptcb == (os_tcb *)0)
if (ptcb == os_tcb_reserved)
y = ptcb->ostcby;
osrdytbl[y] &= ~ptcb->ostcbbitx; /* make task not ready */
if (osrdytbl[y] == 0)
ptcb->ostcbstat |= os_stat_suspend; /* status of task is 'suspended' */
os_exit_critical();
if (self == os_true)
return (os_err_none);
}#endif
首先是判斷傳入的優先順序是否為:os_prio_self即是否需要掛起任務本身,或者掛起當前正在執行的任務(prio == ostcbcur->ostcbprio)。
之後根據任務優先順序prio得到任務tcb指標判斷是否合法的tcb,有了tcb就可以會的當前任務有關就緒表及osrdygrp資訊。使
此任務在任務就緒表及osrdygrp中掛起,並將任務的餓狀態設定為:os_stat_suspend。並且當掛起的任務為本身時,進行一次任務切換。
總之主要工作就是:在任務就緒表中更改prio優先順序對應的任務狀態。
#if os_task_suspend_en > 0
int8u ostaskresume (int8u prio)
#endif
os_enter_critical();
ptcb = ostcbpriotbl[prio];
if (ptcb == (os_tcb *)0)
if (ptcb == os_tcb_reserved)
if ((ptcb->ostcbstat & os_stat_suspend) != os_stat_rdy)
} else
} else
return (os_err_none);
}os_exit_critical();
return (os_err_task_not_suspended);
}#endif
其中主要的**如下:
if ((ptcb->ostcbstat & os_stat_suspend) != os_stat_rdy)
} else
} else
return (os_err_none);
}看之前複習一下幾個變數的值:
#if os_lowest_prio <= 63
ptcb->ostcby = (int8u)(prio >> 3); /* pre-compute x, y, bitx and bity */
ptcb->ostcbx = (int8u)(prio & 0x07);
ptcb->ostcbbity = (int8u)(1 << ptcb->ostcby);
ptcb->ostcbbitx = (int8u)(1 << ptcb->ostcbx);
#else
ptcb->ostcby = (int8u)((prio >> 4) & 0xff); /* pre-compute x, y, bitx and bity */
ptcb->ostcbx = (int8u) (prio & 0x0f);
ptcb->ostcbbity = (int16u)(1 << ptcb->ostcby);
ptcb->ostcbbitx = (int16u)(1 << ptcb->ostcbx);
#endif
在os_lowest_prio <= 63時,ptcb->ostcy和ptcb->ostcbx的最大值為:8。
ptcb->ostcy表示的是就緒表中的下標,ptcb->ostcbx表示的是:osrdytbl[ptcb->ostcby]中的第ptcb->ostcbxbit位的值。
在明確一下就用:ptcb->ostcbbity和ptcb->ostcbbitx。這倆個分別表示的是某一bit位。
有了上面的值,函式ostaskresume()很好理解,設定就緒表,是任務處於就緒狀態,並進行一次任務排程。
ucos任務掛起
建立好了任務之後,就已經初步跨進了ucosii的程式設計了,隨著進一步的程式設計,發現學會建立了任務還是不夠的,建立任務1用於串列埠1傳送資料,任務2用於串列埠1接收資料,程式本身的意圖是傳送完資料後,接著就串列埠1接收反饋回來的資訊,但是不能正常通訊,原因就是當任務1在傳送資料過程 cpu時不是會...
C OS II 示例 ucos任務的掛起與刪除
1 設計乙個只有乙個任務mytask的應用程式。2 在 1 的任務mytask中再建立乙個任務yourtask。要求當任務yourtask執行20次後,掛起任務mytask 當任務yourtask執行40次後,恢復任務mytask。要求任務mytask和任務yourtask執行一段時間後,使任務my...
UC OS基礎知識之任務的掛起和恢復
所謂掛起就是停止這個任務的執行。使用者可以通過呼叫系統提供的ostasksuspend 函式來掛起除空閒任務之外的其他任務,只能在其他任務中呼叫恢復函式ostaskresume 使其恢復為就緒狀態。任務在執行,就緒狀態和等待狀態之間的轉移關係如下圖 1.任務的掛起 掛起任務函式ostasksuspe...