μC/OS-III中的高效時(shí)鐘節拍管理機制
在μC/OS—II中,由于每次時(shí)鐘節拍服務(wù)都要遍歷所有任務(wù),因此,在任務(wù)數目較多時(shí),其執行時(shí)間可能很長(cháng)。另外,由于時(shí)鐘節拍服務(wù)函數OSTimeTick()由時(shí)鐘節拍中斷服務(wù)程序OSTicidSR()調用執行,因此當OSTimeTick()執行時(shí)間很長(cháng)時(shí),時(shí)鐘節拍中斷服務(wù)程序的執行時(shí)間也很長(cháng)。在中斷服務(wù)程序執行時(shí),所有任務(wù)都無(wú)法執行,在這種情況下,系統的實(shí)時(shí)性會(huì )很差。
2 μC/OS-III中的時(shí)鐘節拍管理機制
針對μC/OS—II時(shí)鐘節拍服務(wù)的問(wèn)題,μC/OS—III主要做了兩點(diǎn)改進(jìn):①用時(shí)鐘節拍任務(wù)來(lái)做時(shí)鐘節拍處理;②用時(shí)鐘節拍輪盤(pán)來(lái)分類(lèi)管理延時(shí)任務(wù)以及指定超時(shí)時(shí)限的等待任務(wù)。
2.1 時(shí)鐘節拍任務(wù)
在μC/OS—III中,增加了一個(gè)系統任務(wù),即時(shí)鐘節拍任務(wù)OS_TickTask()。該任務(wù)是μC/OS-III中兩個(gè)總是會(huì )創(chuàng )建的系統任務(wù)之一。時(shí)鐘節拍任務(wù)負責處理延時(shí)任務(wù)和指定超時(shí)時(shí)限的等待任務(wù),這樣,μC/OS—III就把時(shí)鐘節拍的處理工作放到任務(wù)級代碼中完成了。時(shí)鐘節拍中斷服務(wù)程序和時(shí)鐘節拍任務(wù)之間的關(guān)系如圖1所示。本文引用地址:http://dyxdggzs.com/article/148142.htm
不論在μC/OS—II還是在μC/OS—III中,都需要一個(gè)硬件定時(shí)器(或其他能產(chǎn)生周期性中斷的外設)來(lái)產(chǎn)生幾十到上千赫茲的時(shí)鐘節拍中斷。時(shí)鐘節拍中斷的具體頻率取決于所用的處理器的性能以及應用需求。時(shí)鐘節拍中斷頻率越高,系統的延時(shí)精度越高,對處理器的處理能力要求也越高。
每次產(chǎn)生時(shí)鐘節拍中斷,CPU都會(huì )跳轉到時(shí)鐘節拍中斷服務(wù)程序(ISR)中執行。時(shí)鐘節拍ISR會(huì )調用OSTimeTick()函數。前面提到過(guò),μC /OS—II的時(shí)鐘節拍ISR也會(huì )調用OSTimeTick()函數,在這一點(diǎn)上μC/OS—II和μC/OS—III看起來(lái)沒(méi)有區別,但實(shí)際上μC/OS—III中的OS TimeTick()函數與μC/OS—II中的OSTimeTick()函數有很大區別。μC/OS—III中的OSTimeTick()函數主要完成如下操作:向時(shí)鐘節拍任務(wù)發(fā)信號、調用OS_SchedRoundRobin()函數,以及向定時(shí)器任務(wù)發(fā)信號等。其中,后兩點(diǎn)與時(shí)鐘節拍的管理無(wú)關(guān),這里不詳細介紹。精簡(jiǎn)的OSTimeTick()函數如下面這段代碼所示,其中只保留與時(shí)鐘節拍管理相關(guān)的代碼。
在μC/OS—III中,OSTimeTick()函數不需要遍歷任務(wù)鏈表,只是通過(guò)OSTaskSemPost()函數向時(shí)鐘節拍任務(wù)發(fā)信號。而時(shí)鐘節拍任務(wù)絕大部分時(shí)間內都處于等待該信號的狀態(tài),每次收到該信號時(shí),時(shí)鐘節拍任務(wù)會(huì )恢復運行,調用OS_TiekListUpdate()函數處理延時(shí)的任務(wù),然后再次進(jìn)入等待該信號的狀態(tài),其代碼如下:
相比μC/OS—II的時(shí)鐘節拍管理方式,μC/OS—III使用了專(zhuān)門(mén)的時(shí)鐘節拍任務(wù)來(lái)處理時(shí)鐘節拍,可大大減少時(shí)鐘節拍中斷服務(wù)程序的執行時(shí)間。
評論