ucos 任務的掛起與恢復

2021-06-19 04:36:43 字數 2527 閱讀 9131

看看任務掛起的函式

#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...