對設定為同優先順序的任務使用時間片排程,不同優先順序任務仍然使用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實時排程策略,時間片輪轉。當程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。...