μC/OS-II的實(shí)時(shí)性能分析
——
1 嵌入式實(shí)時(shí)操作系統(tǒng)和μC/OS-II
嵌入式操作系統(tǒng)EOS(Embedded Operating System)主要負(fù)責(zé)嵌入式系統(tǒng)的全部軟、硬件資源的分配、調(diào)度、控制、協(xié)調(diào)并發(fā)活動(dòng);它必須體現(xiàn)其所在系統(tǒng)的特征,能夠通過(guò)裝卸某些模塊來(lái)達(dá)到系統(tǒng)所要求的功能[1]。
μC/OS-II是專門(mén)為計(jì)算機(jī)的嵌入式應(yīng)用而設(shè)計(jì)的實(shí)時(shí)操作系統(tǒng),是基于靜態(tài)優(yōu)先級(jí)的占先式(preemptive)多任務(wù)實(shí)時(shí)內(nèi)核。采用μC/OS -II作為測(cè)試的目標(biāo),一方面是因?yàn)樗呀?jīng)通過(guò)了很多嚴(yán)格的測(cè)試,被確認(rèn)是一個(gè)安全的、高效的實(shí)時(shí)操作系統(tǒng);另一個(gè)重要的原因,是因?yàn)樗赓M(fèi)提供了內(nèi)核的源代碼,通過(guò)修改相關(guān)的源代碼,就可以比較容易地構(gòu)造自己所需要的測(cè)試環(huán)境,實(shí)現(xiàn)自己需要的功能。
2 實(shí)時(shí)操作系統(tǒng)和系統(tǒng)實(shí)時(shí)性能指標(biāo)
實(shí)時(shí)系統(tǒng)對(duì)邏輯和時(shí)序的要求非常嚴(yán)格,如果邏輯和時(shí)序出現(xiàn)偏差將會(huì)引起嚴(yán)重后果。實(shí)時(shí)系統(tǒng)有兩種類型:軟實(shí)時(shí)系統(tǒng)和硬實(shí)時(shí)系統(tǒng)。軟實(shí)時(shí)系統(tǒng)僅要求事件響應(yīng)是實(shí)時(shí)的,并不要求限定某一任務(wù)必須在多長(zhǎng)時(shí)間內(nèi)完成;而在硬實(shí)時(shí)系統(tǒng)中,不僅要求任務(wù)響應(yīng)要實(shí)時(shí),而且要求在規(guī)定的時(shí)間內(nèi)完成事件的處理。通常,大多數(shù)實(shí)時(shí)系統(tǒng)是兩者的結(jié)合。
事實(shí)上,沒(méi)有一個(gè)絕對(duì)的數(shù)字可以說(shuō)明什么是硬實(shí)時(shí),什么是軟實(shí)時(shí)。它們之間的界限是十分模糊的。這與選擇什么樣的CPU,它的主頻、內(nèi)存等參數(shù)有一定的關(guān)系[1]。另外,因?yàn)閼?yīng)用的場(chǎng)合對(duì)系統(tǒng)實(shí)時(shí)性能要求的不同而有不同的定義。因此,在現(xiàn)有的固定的軟、硬件平臺(tái)上,如何測(cè)試并找出決定系統(tǒng)實(shí)時(shí)性能的關(guān)鍵參數(shù),并給出優(yōu)化的措施和試驗(yàn)數(shù)據(jù),就成為一個(gè)具有普遍意義并且值得深入探討的課題。本文就是基于此目的進(jìn)行討論的。
因?yàn)椴捎脤?shí)時(shí)操作系統(tǒng)的意義就在于能夠及時(shí)處理各種突發(fā)的事件,即處理各種中斷,因而衡量嵌入式實(shí)時(shí)操作系統(tǒng)的最主要、最具有代表性的性能指標(biāo)參數(shù)無(wú)疑應(yīng)該是中斷響應(yīng)時(shí)間了。中斷響應(yīng)時(shí)間通常被定義為:
中斷響應(yīng)時(shí)間=中斷延遲時(shí)間+保存CPU狀態(tài)的時(shí)間+該內(nèi)核的ISR進(jìn)入函數(shù)的執(zhí)行時(shí)間[2]。
中斷延遲時(shí)間=MAX(關(guān)中斷的最長(zhǎng)時(shí)間,最長(zhǎng)指令時(shí)間) + 開(kāi)始執(zhí)行ISR的第一條指令的時(shí)間[2]。
通俗點(diǎn)定義就是:從中斷發(fā)生起,到執(zhí)行中斷處理程序的第一條指令所用的時(shí)間。由于實(shí)時(shí)操作系統(tǒng)更多考慮的是最壞的情況,而不是平均的情況,因此指令執(zhí)行的時(shí)間就按照最長(zhǎng)的指令執(zhí)行時(shí)間來(lái)計(jì)算,所以中斷延遲時(shí)間,通常是由關(guān)中斷的最長(zhǎng)時(shí)間來(lái)決定的。當(dāng)FIQ(快速中斷)使能時(shí),最壞情況下FIQ的中斷延遲時(shí)間由以下幾個(gè)部分構(gòu)成:
t同步——請(qǐng)求通過(guò)同步器的最長(zhǎng)時(shí)間,約4個(gè)處理器周期。
t最長(zhǎng)指令時(shí)間——最長(zhǎng)指令完成的時(shí)間。最長(zhǎng)指令是加載包括PC的所有寄存器的LDM指令,在零等待狀態(tài)的系統(tǒng)中,約為20個(gè)周期。
t異常——數(shù)據(jù)異常進(jìn)入時(shí)間,為3個(gè)周期。
tFIQ——FIQ進(jìn)入時(shí)間, 2個(gè)周期。
最大的FIQ中斷延遲時(shí)間約為29個(gè)時(shí)鐘周期。在系統(tǒng)使用40 MHz處理器時(shí)鐘時(shí),約為0.7 μs。
對(duì)于最大的IRQ延遲,其計(jì)算與FIQ類似。若必須允許FIQ有更高的優(yōu)先級(jí),那么進(jìn)入IRQ處理程序的延遲時(shí)間是隨機(jī)的[3]。
3 試驗(yàn)原理和測(cè)試方法
首先需要啟動(dòng)并開(kāi)始運(yùn)行μC/OS-II,因?yàn)樵囼?yàn)需要使用的計(jì)時(shí)函數(shù)是系統(tǒng)函數(shù)。進(jìn)行堆棧和中斷向量等系統(tǒng)初始化后,首先要?jiǎng)?chuàng)建一個(gè)任務(wù),用以產(chǎn)生中斷。這樣OS啟動(dòng)后,中斷服務(wù)程序可以在任務(wù)中調(diào)用或者切換,中斷源可以設(shè)置為外部中斷或由任務(wù)產(chǎn)生。在主程序的臨界段循環(huán)查詢中斷狀態(tài)(VICRawIntr;中斷狀態(tài)寄存器),一旦發(fā)現(xiàn)有中斷標(biāo)識(shí),則立即啟動(dòng)計(jì)數(shù)器,并使能該中斷,跳出臨界段(在進(jìn)入臨界段之前要關(guān)中斷 (OS_ENTER_CRITICAL()),而跳出臨界段代碼進(jìn)入中斷服務(wù)子程序后,保存全部CPU寄存器后清除中斷源,并立即開(kāi)中斷 (OS_EXIT_CRITICAL()),然后停止計(jì)時(shí)并執(zhí)行中斷處理代碼)。由于是在檢測(cè)到中斷標(biāo)識(shí)后才跳出臨界段,所以一跳出臨界段就會(huì)立即發(fā)生中斷,進(jìn)行中斷處理。保存了CPU寄存器后進(jìn)入中斷服務(wù)的第一條指令就是保存計(jì)數(shù)器值。由于在跳出臨界段時(shí)才啟動(dòng)的計(jì)數(shù)器,而在進(jìn)入中斷服務(wù)時(shí)立即保存了計(jì)數(shù)值,所以這個(gè)計(jì)數(shù)值就是所需要的中斷響應(yīng)時(shí)間。
如果要試驗(yàn)不同優(yōu)先級(jí)的中斷響應(yīng)時(shí)間,可以設(shè)幾個(gè)不同優(yōu)先級(jí)的中斷服務(wù)程序,在高優(yōu)先級(jí)程序的出口計(jì)數(shù)器清零;而在下一個(gè)中斷開(kāi)始時(shí)保存計(jì)數(shù)值,從而測(cè)試中斷優(yōu)先級(jí)對(duì)中斷響應(yīng)時(shí)間的影響。
如果要測(cè)試不同類型的中斷響應(yīng)時(shí)間,可以在程序中,分別使用不同類型的中斷(向量中斷,非向量中斷,快速中斷)來(lái)測(cè)試中斷類型對(duì)中斷響應(yīng)時(shí)間的影響。原則上快速中斷(FIQ)要求具有最高的優(yōu)先級(jí),而且快速中斷的處理與操作系統(tǒng)基本無(wú)關(guān),中斷服務(wù)子程序可以自行編寫(xiě)(在不調(diào)用μC/OS-II的系統(tǒng)服務(wù)程序的情況下),沒(méi)有特別的要求。向量中斷則不能如此。因?yàn)殡m然ADS可以使用_irq關(guān)鍵字來(lái)聲明一個(gè)函數(shù)是用來(lái)處理中斷的,從而可以避免在程序中使用匯編代碼,但是在μC/OS-II中不能這樣處理。因?yàn)槭褂肅語(yǔ)言無(wú)法確保堆棧的結(jié)構(gòu),而RTOS必須使堆棧保持一定的結(jié)構(gòu)。這只有匯編語(yǔ)言可以做到。這部分的代碼在文件VECTORS.S中(為了簡(jiǎn)化用戶編寫(xiě)中斷服務(wù)子程序,這段匯編代碼已經(jīng)被編寫(xiě)成一個(gè)宏HANDLER)[4]。具體可見(jiàn)參考文獻(xiàn) [4]的P358~P359中所列的程序清單6.5中的匯編代碼,即中斷服務(wù)子程序必須按照 μC/OS-II的中斷服務(wù)程序的要求編寫(xiě),格式如下[4]:
保存全部CPU寄存器;(1)
調(diào)用OSIntEnter或OSIntNesting直接加1;(2)
清除中斷源(3)
重新開(kāi)中斷(4)
執(zhí)行用戶代碼做中斷服務(wù);(5)
調(diào)用OSIntExit();(6)
恢復(fù)所有CPU寄存器;(7)
執(zhí)行中斷返回指令;(8)
如果要測(cè)試存儲(chǔ)器加速模塊對(duì)中斷響應(yīng)時(shí)間的影響,可以在關(guān)閉、部分使能和完全使能3種設(shè)置下分別測(cè)試同一個(gè)中斷的響應(yīng)時(shí)間,從而得出中斷響應(yīng)時(shí)間與存儲(chǔ)器加速模塊設(shè)置之間的關(guān)系。
由于鎖相器的設(shè)置必然會(huì)影響中斷響應(yīng)時(shí)間,并且中斷響應(yīng)時(shí)間與鎖相器(PLL)的倍頻設(shè)置成反比,即倍頻設(shè)置越高,處理器工作速度越快,指令周期越短,而不同時(shí)鐘設(shè)置下同一中斷響應(yīng)所需要執(zhí)行的指令數(shù)是相同的,因而中斷響應(yīng)時(shí)間就會(huì)越短。所以本文不作此項(xiàng)測(cè)試。
下面用程序來(lái)測(cè)試運(yùn)行在LPC2104上的μC/OS-II的中斷響應(yīng)時(shí)間。系統(tǒng)初始環(huán)境(默認(rèn))設(shè)置如下:系統(tǒng)晶振頻率設(shè)為11 059.2 kHz,鎖相環(huán)(PLL)倍增器值設(shè)置為4,處理器工作在fCCLK=fOSC
評(píng)論