一。時(shí)間管理機(jī)制
Ucos提供的延時(shí)基于系統(tǒng)時(shí)鐘。在系統(tǒng)初始化時(shí),會(huì)進(jìn)行系統(tǒng)時(shí)鐘的初始化。系統(tǒng)時(shí)鐘一般由硬件的某個(gè)時(shí)鐘提供,該時(shí)鐘會(huì)定時(shí)中斷,稱(chēng)為一個(gè)tick。在每個(gè)tick發(fā)生時(shí),系統(tǒng)進(jìn)入時(shí)鐘中斷ISR。ISR 調(diào)用OSTimeTick()。 OSTimeTick()對(duì)OSTCBList鏈表中的每個(gè)任務(wù)的進(jìn)行延時(shí)處理,即將任務(wù)的TCB中的.OSTimeDly--。若OSTimeDly=0, 如果任務(wù)不被掛起,則將任務(wù)就緒,等待調(diào)度。OSTCBList包含了系統(tǒng)中所有創(chuàng)建的任務(wù)。
任務(wù)延時(shí),即將任務(wù)從就緒表中刪除,將OSTimeDly置為合適的值。等待OSTimeDly=0時(shí),再置為就緒,等待調(diào)度。
因此任務(wù)的延時(shí),并不是要以延時(shí)任務(wù)時(shí)長(zhǎng),理想上總是tick中斷間隔的N倍。
Ucos還允許對(duì)系統(tǒng)時(shí)鐘tick進(jìn)行計(jì)數(shù),以計(jì)算自系統(tǒng)系統(tǒng)以來(lái)進(jìn)行了多少個(gè)tick.
二、ucos提供的接口函數(shù)
void OSTimeDly (INT16U ticks)。
功能:延時(shí)ticks個(gè)系統(tǒng)tick時(shí)長(zhǎng)。當(dāng)成功延時(shí)后,進(jìn)行任務(wù)調(diào)度。
INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
功能:提供基于毫秒,秒等容易的用戶接口。
INT8U OSTimeDlyResume (INT8U prio);
功能:恢復(fù)延時(shí)任務(wù)
INT32U OSTimeGet (void);
void OSTimeSet (INT32U ticks);
功能:返回,設(shè)置系統(tǒng)時(shí)鐘tick計(jì)數(shù)。
三、關(guān)于延時(shí)功能的使用
雖然ucos提供了延時(shí)函數(shù),但因?yàn)槭腔谙到y(tǒng)時(shí)鐘中斷的,所有對(duì)于小于時(shí)鐘中斷時(shí)間間隔的延時(shí),并不能提供;只能通過(guò)軟件延時(shí)。
在很多情況下,可以通過(guò)信號(hào)量、郵箱等方式取代延時(shí)功能。
特別要注意的是,在多任務(wù)的運(yùn)行環(huán)境中,即使任務(wù)延時(shí)已經(jīng)完畢,但由于此時(shí)有高優(yōu)先級(jí)的任務(wù)運(yùn)行,此時(shí)任務(wù)仍不能運(yùn)行。至任務(wù)可以運(yùn)行時(shí),實(shí)際的延時(shí)已經(jīng)超過(guò)了預(yù)期的延時(shí)。
附:給出了OSTimeTick () 函數(shù)的具體程序
void OSTimeTick (void) //這個(gè)節(jié)拍服務(wù)函數(shù)是在OSTickISR函數(shù)中調(diào)用的,目的是在時(shí)鐘節(jié)拍到來(lái)時(shí),檢查每個(gè)任務(wù)的任務(wù)控制塊中的.OSTCBDly-1后是否為0,如果是,那么表明這個(gè)任務(wù)剛才是掛起的狀態(tài),此時(shí)應(yīng)改變?yōu)榫途w態(tài)
{
OS_TCB *ptcb;
OSTimeTickHook(); //
ptcb = OSTCBList; //時(shí)鐘節(jié)拍到來(lái)時(shí),將控制塊雙向鏈表的第一個(gè)控制塊取出(并不是節(jié)拍之前運(yùn)行的任務(wù))
while (ptcb-》OSTCBPrio != OS_IDLE_PRIO) { //空閑任務(wù)處于控制塊雙向鏈表的最后一個(gè),如果取出的控制塊為空閑任務(wù)的控制塊,那么已經(jīng)取到最后一個(gè)了,就結(jié)束
// OS_ENTER_CRITICAL();
if (ptcb-》OSTCBDly != 0) { //
if (--ptcb-》OSTCBDly == 0) { //
if (!(ptcb-》OSTCBStat & OS_STAT_SUSPEND)) { //檢查任務(wù)是否處于強(qiáng)制掛起狀態(tài),如果是,那再掛起一個(gè)時(shí)鐘節(jié)拍,否則就將它就緒
OSRdyGrp |= ptcb-》OSTCBBitY;
OSRdyTbl[ptcb-》OSTCBY] |= ptcb-》OSTCBBitX;
} else { //
ptcb-》OSTCBDly = 1; //
} //
}
}
ptcb = ptcb-》OSTCBNext; //下一個(gè)任務(wù)控制塊
// OS_EXIT_CRITICAL();
}
// OS_ENTER_CRITICAL(); //
OSTime++; //節(jié)拍計(jì)數(shù)器+1
// OS_EXIT_CRITICAL();
}
(審核編輯: 智匯小新)
分享