新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > μC/OS-II軟件定時(shí)器的分析與測(cè)試

μC/OS-II軟件定時(shí)器的分析與測(cè)試

作者: 時(shí)間:2009-12-28 來(lái)源:網(wǎng)絡(luò) 收藏

引 言
μC/操作系統(tǒng)是建立在微內(nèi)核基礎(chǔ)上的實(shí)時(shí)操作系統(tǒng),搶占式多任務(wù)、微內(nèi)核、移植性好等特點(diǎn),使其在諸多領(lǐng)域都有較好的應(yīng)用。
在μC/ 2.83及其以后的版本中,一個(gè)較大的變化就是增加了對(duì)的支持。這使得μC/OS實(shí)時(shí)操作系統(tǒng)的功能更加完善,在其上的應(yīng)用程序開發(fā)與移植也更加方便。在實(shí)時(shí)操作系統(tǒng)中一個(gè)好的實(shí)現(xiàn)要求有較高的精度、較小的處理器開銷,且占用較少的存儲(chǔ)器資源。本文在對(duì)μC/算法的基礎(chǔ)上,對(duì)定時(shí)精度和處理器占用情況進(jìn)行了,其結(jié)果在實(shí)時(shí)系統(tǒng)的設(shè)計(jì)與應(yīng)用中具有借鑒意義。

本文引用地址:http://2s4d.com/article/152179.htm


1 定時(shí)器實(shí)現(xiàn)架構(gòu)
在μC/OS-II操作系統(tǒng)內(nèi)部,任務(wù)的延時(shí)功能及定時(shí)器功能,都需要底層有一個(gè)硬件的計(jì)數(shù)器支持。硬件計(jì)數(shù)器以固定的頻率遞減,計(jì)數(shù)到0時(shí),觸發(fā)時(shí)鐘中斷。這個(gè)特定的周期性的中斷稱為“時(shí)鐘節(jié)拍”。每當(dāng)有時(shí)鐘節(jié)拍到來(lái)時(shí),系統(tǒng)在保存現(xiàn)場(chǎng)和中斷嵌套計(jì)數(shù)加1后都會(huì)跳到時(shí)鐘節(jié)拍函數(shù)OSTimTick()中,進(jìn)行軟件計(jì)數(shù)器加1和遍歷任務(wù)控制塊,以判斷任務(wù)延時(shí)是否到時(shí)。
μC/OS-II中并未在 OSTim Tick()中進(jìn)行定時(shí)器到時(shí)判斷與處理,而是創(chuàng)建了一個(gè)高于應(yīng)用程序中所有其他任務(wù)優(yōu)先級(jí)的定時(shí)器管理任務(wù)OSTmr_Task(),在這個(gè)任務(wù)中進(jìn)行定時(shí)器的到時(shí)判斷和處理。時(shí)鐘節(jié)拍函數(shù)通過(guò)信號(hào)量給這個(gè)高優(yōu)先級(jí)任務(wù)發(fā)信號(hào)。這種方法縮短了中斷服務(wù)程序的執(zhí)行時(shí)間,但也使得定時(shí)器到時(shí)處理函數(shù)的響應(yīng)受到中斷退出時(shí)恢復(fù)現(xiàn)場(chǎng)和任務(wù)切換的影響。軟件定時(shí)器功能實(shí)現(xiàn)代碼存放在tmr.c文件中,移植時(shí)需只需在os_cfg.h文件中使能定時(shí)器和設(shè)定定時(shí)器的相關(guān)參數(shù)。


2 μC/OS-II的軟件定時(shí)器算法
μC/OS-II中軟件定時(shí)器的實(shí)現(xiàn)方法是,將定時(shí)器按定時(shí)時(shí)間分組,使得每次時(shí)鐘節(jié)拍到來(lái)時(shí)只對(duì)部分定時(shí)器進(jìn)行比較操作,縮短了每次處理的時(shí)間。但這就需要?jiǎng)討B(tài)地維護(hù)一個(gè)定時(shí)器組。定時(shí)器組的維護(hù)只是在每次定時(shí)器到時(shí)時(shí)才發(fā)生,而且定時(shí)器從組中移除和再插入操作不需要排序。這是一種比較高效的算法,減少了維護(hù)所需的操作時(shí)間。
2.1 定時(shí)器管理所需的數(shù)據(jù)結(jié)構(gòu)
一旦定時(shí)器被建立,一個(gè)定時(shí)器控制塊(OS_TMR)就被賦值了。定時(shí)器控制塊是定時(shí)器管理的基本單元,包含定時(shí)器的名稱、定時(shí)時(shí)間、在鏈表中的位置、使用狀態(tài)、使用方式,以及到時(shí)回調(diào)函數(shù)及其參數(shù)等基本信息。
在μC/OS-II軟件定時(shí)器中實(shí)現(xiàn)了3類鏈表的維護(hù):


OSTmrTbl[OS_TMR_CFG_MAX]:以數(shù)組的形式靜態(tài)分配定時(shí)器控制塊所需的RAM空間,并存儲(chǔ)所有已建立的定時(shí)器控制塊。
OSTmrFreeLiSt:為空閑定時(shí)器控制塊鏈表頭指針??臻e態(tài)的定時(shí)器控制塊(OS_TMR)中,OSTmrnext和OSTmrPrev兩個(gè)指針?lè)謩e指向空閑控制塊的前一個(gè)和后一個(gè),組織了空閑控制塊雙向鏈表。建立定時(shí)器時(shí),從這個(gè)鏈表中搜索空閑定時(shí)器控制塊。
OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE]:該數(shù)組的每個(gè)元素都是已開啟定時(shí)器的一個(gè)分組,元素中記錄了指向該分組中第一個(gè)定時(shí)器控制塊的指針,以及定時(shí)器控制塊的個(gè)數(shù)。運(yùn)行態(tài)的定時(shí)器控制塊(OS_TMR)中,OSTmrnext和OSTmrPrev兩個(gè)指針同樣也組織了所在分組中定時(shí)器控制塊的雙向鏈表。定時(shí)器管理所需的數(shù)據(jù)結(jié)構(gòu)示意圖如圖1所示。

2.2 軟件定時(shí)器實(shí)現(xiàn)原理
宏OS_TMR_CFG_WHEEL_SIZE定義了OSTmr-WheelTbl[]數(shù)組的大小,同時(shí)這個(gè)值也是定時(shí)器分組的依據(jù)。按照定時(shí)器到時(shí)值與OS_TMR_CFG_WHEEL_SIZE相除的余數(shù)進(jìn)行分組:不同余數(shù)的定時(shí)器放在不同分組中;相同余數(shù)的定時(shí)器處在同一組中,由雙向鏈表連接。這樣,余數(shù)值為0~OS_TMR_CFG_WHEEL_SIZE-1的不同定時(shí)器控制塊,正好分別對(duì)應(yīng)了數(shù)組元素OSTmr-WheelTbl[0]~OSTmrWheelTbl[OS_TMR_CFGWHEEL_SIZE-1]的不同分組。每次時(shí)鐘節(jié)拍到來(lái)時(shí),時(shí)鐘數(shù)OSTmrTime值加1,然后也進(jìn)行求余操作,只有余數(shù)相同的那組定時(shí)器才有可能到時(shí),所以只對(duì)該組定時(shí)器進(jìn)行判斷。這種方法比循環(huán)判斷所有定時(shí)器更高效。隨著時(shí)鐘數(shù)的累加,處理的分組也由0~OS_TMR_CFG_WHE EL_SIZE-1循環(huán)。
信號(hào)量喚醒定時(shí)器管理任務(wù),計(jì)算出當(dāng)前所要處理的分組后,程序遍歷該分組中的所有控制塊,將當(dāng)前OSTmr-Time值與定時(shí)器控制塊中的到時(shí)值相比較。若相等(即到時(shí)),則調(diào)用該定時(shí)器到時(shí)回調(diào)函數(shù);若不相等,則判斷該組中下一個(gè)定時(shí)器控制塊。如此操作,直到該分組鏈表的結(jié)尾。定時(shí)器管理任務(wù)的流程如圖2所示。OS_TMR_CFG_WHEEL_SIZE的取值推薦為2的N次方,以便采用移位操作計(jì)算余數(shù),縮短處理時(shí)間。

2.3 定時(shí)器移除和插入操作
定時(shí)器的到時(shí)處理函數(shù)返回后,都要進(jìn)行該定時(shí)器控制塊在鏈表中的移除和再插入操作。插入前需要重新計(jì)算定時(shí)器下次到時(shí)時(shí)所處的分組。計(jì)算公式如下:
定時(shí)器下次到時(shí)的OSTmrTime值=定時(shí)器定時(shí)值+當(dāng)前OSTmrTime值
新的分組=定時(shí)器下次到時(shí)的OSTmrTime值%OS_TMR_CFG_WHEEL_SIZE


3 定時(shí)器精度與抖動(dòng)
在μC/OS-II操作系統(tǒng)中,與定時(shí)相關(guān)的功能均基于系統(tǒng)的時(shí)鐘節(jié)拍。系統(tǒng)每秒的時(shí)鐘節(jié)拍數(shù)決定了這個(gè)系統(tǒng)能分辨的最小時(shí)間,定時(shí)值只能為最小時(shí)間的倍數(shù)。每秒的時(shí)鐘節(jié)拍數(shù)由os_cfg.h.文件中的宏OS_TICKS_PER_SEC定義。對(duì)于不同的應(yīng)用,該時(shí)鐘節(jié)拍一般在10~100次/s的范圍內(nèi)選取。其對(duì)應(yīng)的時(shí)鐘中斷的時(shí)間間隔為100~10 ms,即時(shí)間的最小分辨單位為10 ms。處理器處理能力越高,每秒的時(shí)鐘節(jié)拍數(shù)也相應(yīng)地越大。下面的數(shù)據(jù)中使用了ARM9處理器。最低運(yùn)行頻率為250 Hz時(shí),時(shí)鐘節(jié)拍設(shè)為200次/s,可進(jìn)行正常的多任務(wù)調(diào)度。該環(huán)境下,最小分辨時(shí)間為5 ms。
抖動(dòng)是指定時(shí)器回調(diào)函數(shù)開始執(zhí)行的時(shí)間與規(guī)定的時(shí)間相比,或提前或推后的現(xiàn)象。在定時(shí)器中抖動(dòng)總是存在的。下面主要分析2種抖動(dòng)情況及其對(duì)定時(shí)精度的影響。第1種抖動(dòng)情況如圖3所示。

T1:CPU響應(yīng)時(shí)鐘中斷,搜索中斷號(hào),保存中斷現(xiàn)場(chǎng)并跳到時(shí)鐘中斷處理程序OSTimTick的時(shí)間。
T2:OSTimTick()函數(shù)的執(zhí)行時(shí)間。該函數(shù)中對(duì)任務(wù)延時(shí)是否到期進(jìn)行了判斷。
T3:恢復(fù)現(xiàn)場(chǎng),退出中斷并進(jìn)行任務(wù)上下文切換的時(shí)間。
T4:定時(shí)器管理任務(wù)OSTmr_Task()判斷定時(shí)器是否到時(shí)的時(shí)間。
T4之后:定時(shí)器到時(shí)回調(diào)函數(shù)開始執(zhí)行。


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉