修改uCOS II以實現「優先順序 時間片」聯合排程

2021-06-18 00:25:45 字數 3139 閱讀 9834

對設定為同優先順序的任務使用時間片排程,不同優先順序任務仍然使用ucos ii的優先順序排程策略。在同優先順序任務的時間片排程中,所有任務暫時時間片長度固定,時間片的排程使用fifo(先進先出)佇列。

整體的描述參看下圖。

上圖中假設有3個優先順序為5的任務,3個優先順序為8的任務。縱向,第一列的os_tcb形成ostcblist雙向鍊錶(通過ostcbnext和ostcbprev指標,這是原ucos ii系統已經有的部分)。橫向,通過ospsprev和ospsnext指標形成時間片鍊錶(實際上是fifo),這部分是我們在ucos ii上要增加的內容。第一列的任務每當有任務時間片用完後將挪到佇列尾,從fifo中選擇下乙個任務,這就是本文的時間片排程的過程。總體上看來,不同優先順序使用了ucos ii原有的優先順序排程策略,相同優先順序之間增加了時間片排程策略,因此本文稱為「優先順序+時間片」聯合排程。

下面我們列出實現時間片排程要修改的一些結構和函式,我們可以通過除錯跟蹤了解ucos ii的機理,從而理解為什麼要這麼做。

1 修改結構體os_tcb(ucos_ii.h檔案中)

增加4個成員變數用於時間片排程。

struct os_tcb  os_tcb;
2 修改os_tcbinit任務結構體初始化函式(os_core.c檔案)在os_tcbinit中增加時間片長度的初始化,我們可以先在os_cfg_r.h中巨集定義乙個時間片長度用於不同情況下的配置,

#define time_slice_len            10
os_tcbinit函式中增加結構體成員初始化

ptcb->ospslen = time_slice_len;

ptcb->ospscurlen = time_slice_len;

ptcb->ospsnext = (os_tcb*)0;

ptcb->ospsprev = (os_tcb*)0;

當出現同優先順序的情況時,任務控制塊插入到時間片煉表中而不是優先順序鍊錶中,os_tcbinit

函式中要增加將任務插入到時間片鍊錶的過程,我寫的乙個示例如下:

if (ptcb != (os_tcb *)0) 

ostcblist = ptcb;

osrdygrp |= ptcb->ostcbbity; /* make task ready to run */

osrdytbl[ptcb->ostcby] |= ptcb->ostcbbitx;

} else

ptcb1->ospsnext = ptcb;

ptcb->ospsprev = ptcb1;

ptcb->ospsnext=(os_tcb*) 0;

ptcb->ostcbnext = (os_tcb *)0;

ptcb->ostcbprev = (os_tcb *)0;

} ostaskctr++; /* increment the #tasks counter */

os_exit_critical();

return (os_err_none);

}

3 修改時鐘中斷函式ostimetick(os_core.c檔案)增加時間片排程的內容,這是時間片排程的主要部分。給出乙個示例:

ostimetick (void)

else

if (ptcb->ostcbprev != (os_tcb *)0)

ptcb->ostcbprev = (os_tcb *)0;

ptcb->ostcbnext = (os_tcb *)0;

/* (2) update ostcblist if tcbcur is ostcblist*/

if (ptcb == ostcblist)

/* (3) compute x, y, bitx and bity */

ptcb1->ostcby = ptcb1->ostcbprio >> 3;

ptcb1->ostcbbity = osmaptbl[ptcb1->ostcby];

ptcb1->ostcbx = ptcb1->ostcbprio & 0x07;

ptcb1->ostcbbitx = osmaptbl[ptcb1->ostcbx];

/* (4) set task to be ready */

if (ptcb1->ostcbdly == 0)

/* (5) move ptcb to the rear of queue */

while(ptcb1->ospsnext!=(os_tcb*) 0)

ptcb1->ospsnext = ptcb;

ptcb->ospsprev = ptcb1;

ptcb->ospsnext=(os_tcb*) 0;

/* (6) set ostcbpriotbl for context switch */

ostcbpriotbl[ptcb1->ostcbprio]=ptcb1;

} else

}/*

* (7) don't forgot that after time slice

* schedule, ptcb->ostcbnext==null

*/if (ptcb->ostcbnext != (os_tcb*)0) else if (ptcb1->ostcbnext != (os_tcb*)0) else

os_exit_critical ();

} }}

ok,修改好上面的內容就大致實現了在ucos ii上增加時間片排程的過程,通過修改時間片長度time_slice_len可以驗證時間片長度對任務排程的影響。本文

最後在硬體平台stm32f103rb上測試通過,但因為時間片的引入而且未對程式做相關優化,因此時間片排程的實時性提高上還有待完善。

UCOSii如何解決優先順序反轉

優先順序反轉時如何產生的 當出現低優先順序的任務與高優先順序的任務使用同一訊號量,而系統中還存在其他中等優先順序別的任務時,如果低優先順序的任務先獲得了訊號量,就會使高優先順序的任務處於等待狀態,而那些不使用該訊號量的中等任務卻可剝奪低優先順序的任務的cpu使用權而先於高優先順序的任務而執行了。解決...

uC OS II任務排程中判斷最高優先順序

uc os ii中,規定最多可以有64 個任務。每個任務的優先順序不能相同,因此,優先順序為 0 63.數字越小,優先順序越高,那麼 0就是最高優先順序,63就是最低優先順序。系統保留了優先順序最高及最低的各 4個,因此使用者不能使用這 8個優先順序作為自己的任務的優先順序。巨集 os lowest...

linux修改執行緒優先順序

linux核心的三種排程策略 1,sched other 分時排程策略,2,sched fifo實時排程策略,先到先服務。一旦占用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄 3,sched rr實時排程策略,時間片輪轉。當程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。...