μC/OS-III中的高效時(shí)鐘節拍管理機制
2.2 延時(shí)任務(wù)管理
μC/OS—III為了提高時(shí)鐘節拍的處理速度,采用了哈希散列表機制來(lái)管理所有正在延時(shí)的任務(wù)和指定了超時(shí)時(shí)限的等待任務(wù)。這些任務(wù)都記錄在時(shí)鐘節拍列表(Tick List)中。時(shí)鐘節拍列表包含兩部分:一個(gè)稱(chēng)為時(shí)鐘節拍輪盤(pán)的數組(OSCfg_TickWheel[])和一個(gè)時(shí)鐘節拍計數器(OSTickCtr),如圖2所示。本文引用地址:http://dyxdggzs.com/article/148142.htm
時(shí)鐘節拍列表中的每個(gè)任務(wù)都有一個(gè)延時(shí)結束時(shí)刻或等待超時(shí)時(shí)限,假設為T(mén)M。比如,一個(gè)任務(wù)在時(shí)鐘節拍計數器數值為OSTickCtr時(shí)調用OSTimeDly()延時(shí)dly個(gè)時(shí)鐘節拍,那么該任務(wù)的延時(shí)結束時(shí)刻TM就等于OSTickCtr+dly。然后,用TM和時(shí)鐘節拍輪盤(pán)的表項個(gè)數(OS_CFG_TI CK_WHEEL_SIZE)做取模運算,就可以得到一個(gè)余數I(I=TM%OS_CFG_TICK_WHEEL_SIZE)。那么,該延時(shí)任務(wù)就會(huì )放到時(shí)鐘節拍輪盤(pán)第1個(gè)表項指向的任務(wù)鏈表中。
時(shí)鐘節拍輪盤(pán)的每個(gè)表項都有3個(gè)成員:“.NbrEntriesMax”、“.NbrEntries”和“.FirstPtr”。其中,“.FirstPtr”指向該表項對應的任務(wù)鏈表,所有分配到該表項的延時(shí)任務(wù)或指定超時(shí)時(shí)限的等待任務(wù)都會(huì )放到該任務(wù)鏈表中。“.NbrEntries”和“.NbrEntries Max”分別記錄任務(wù)鏈表中的當前任務(wù)數目和歷史最大任務(wù)數目。在任務(wù)鏈表中,任務(wù)按照延時(shí)結束時(shí)刻或超時(shí)時(shí)限排序,結束時(shí)刻早的任務(wù)排在鏈表的前面。
通過(guò)采用哈希散列表機制,在每次時(shí)鐘節拍服務(wù)時(shí),只需要處理時(shí)鐘節拍輪盤(pán)的某個(gè)特定表項所指向的任務(wù)鏈表,因為恰好在該時(shí)鐘節拍服務(wù)時(shí)延時(shí)結束或等待超時(shí)的任務(wù)都一定處于該表項所指向的任務(wù)鏈表中,而該表項的索引號就等于OSTickCtr%OS_CFG_TICK_WHEEL_SIZ E。另外,由于各個(gè)表項指向的任務(wù)鏈表中的任務(wù)是按照延時(shí)結束時(shí)刻和等待超時(shí)時(shí)限的順序進(jìn)行排序的,這樣,在處理當前任務(wù)鏈表時(shí),就可以從位于鏈表頭部的任務(wù)開(kāi)始判斷任務(wù)延時(shí)結束時(shí)刻或等待超時(shí)時(shí)限是否等于OSTickCtr的當前值。如果等于,說(shuō)明該任務(wù)延時(shí)結束或等待超時(shí)了,然后,再判斷下一個(gè)任務(wù);如果不等于,說(shuō)明該任務(wù)延時(shí)沒(méi)有結束或等待沒(méi)有超時(shí),同時(shí)也說(shuō)明,排在鏈表后面的任務(wù)都不可能延時(shí)結束或等待超時(shí),因此,可以立即結束對任務(wù)鏈表的處理。
由于采用了哈希散列表機制,μC/OS—III中的時(shí)鐘節拍服務(wù)在大部分情況下只需要判斷極少數任務(wù)的延時(shí)結束時(shí)刻或超時(shí)時(shí)限,看其是否等于時(shí)鐘節拍計數器的當前值,這相比μC/OS—II中需要遍歷整個(gè)任務(wù)鏈表的時(shí)鐘節拍服務(wù),顯然效率要高很多。
結語(yǔ)
μC/OS—II中的時(shí)鐘節拍服務(wù)有兩個(gè)不足之處:一是需要遍歷整個(gè)任務(wù)鏈表,二是需要在時(shí)鐘節拍中斷服務(wù)程序中進(jìn)行時(shí)鐘節拍的處理工作。當系統中任務(wù)數目較多時(shí),會(huì )影響系統的實(shí)時(shí)性,這對于一個(gè)實(shí)時(shí)嵌入式操作系統來(lái)說(shuō)是不完善的地方。在μC/OS—III中,通過(guò)增加一個(gè)時(shí)鐘節拍系統任務(wù)并采用哈希散列表機制,很好地解決了這兩點(diǎn)問(wèn)題,即使在系統任務(wù)數目很多的時(shí)候,也可以確保系統的實(shí)時(shí)性。
評論