<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 測試測量 > 設計應用 > μC/OS-II定時(shí)器算法分析與測試

μC/OS-II定時(shí)器算法分析與測試

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

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

本文引用地址:http://dyxdggzs.com/article/194685.htm


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


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


OSTmrTbl[OS_TMR_CFG_MAX]:以數組的形式靜態(tài)分配定時(shí)器控制塊所需的RAM空間,并存儲所有已建立的定時(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]:該數組的每個(gè)元素都是已開(kāi)啟定時(shí)器的一個(gè)分組,元素中記錄了指向該分組中第一個(gè)定時(shí)器控制塊的指針,以及定時(shí)器控制塊的個(gè)數。運行態(tài)的定時(shí)器控制塊(OS_TMR)中,OSTmrnext和OSTmrPrev兩個(gè)指針同樣也組織了所在分組中定時(shí)器控制塊的雙向鏈表。定時(shí)器管理所需的數據結構示意圖如圖1所示。

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

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


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

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


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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>