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