1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      μC/OS-II的實時性能分析

      更新時間: 2006-02-14 15:06:01來源: 粵嵌教育瀏覽量:2555

        引 言

        1 嵌入式實時操作系統和μC/OS-II

        嵌入式操作系統EOS(Embedded Operating System)主要負責嵌入式系統的全部軟、硬件資源的分配、調度、控制、協調并發活動;它必須體現其所在系統的特征,能夠通過裝卸某些模塊來達到系統所要求的功能[1]。

        μC/OS-II是專門為計算機的嵌入式應用而設計的實時操作系統,是基于靜態優先級的占先式(preemptive)多任務實時內核。采用μC/OS -II作為測試的目標,一方面是因為它已經通過了很多嚴格的測試,被確認是一個安全的、高效的實時操作系統;另一個重要的原因,是因為它免費提供了內核的源代碼,通過修改相關的源代碼,就可以比較容易地構造自己所需要的測試環境,實現自己需要的功能。

        2 實時操作系統和系統實時性能指標

        實時系統對邏輯和時序的要求非常嚴格,如果邏輯和時序出現偏差將會引起嚴重后果。實時系統有兩種類型:軟實時系統和硬實時系統。軟實時系統僅要求事件響應是實時的,并不要求限定某一任務必須在多長時間內完成;而在硬實時系統中,不僅要求任務響應要實時,而且要求在規定的時間內完成事件的處理。通常,大多數實時系統是兩者的結合。

        事實上,沒有一個的數字可以說明什么是硬實時,什么是軟實時。它們之間的界限是十分模糊的。這與選擇什么樣的CPU,它的主頻、內存等參數有一定的關系[1]。另外,因為應用的場合對系統實時性能要求的不同而有不同的定義。因此,在現有的固定的軟、硬件平臺上,如何測試并找出決定系統實時性能的關鍵參數,并給出優化的措施和試驗數據,就成為一個具有普遍意義并且值得深入探討的課題。本文就是基于此目的進行討論的。

        因為采用實時操作系統的意義就在于能夠及時處理各種突發的事件,即處理各種中斷,因而衡量嵌入式實時操作系統的主要、有代表性的性能指標參數無疑應該是中斷響應時間了。中斷響應時間通常被定義為:

        中斷響應時間=中斷延遲時間+保存CPU狀態的時間+該內核的ISR進入函數的執行時間[2]。

        中斷延遲時間=MAX(關中斷的長時間,長指令時間) + 開始執行ISR的條指令的時間[2]。

        通俗點定義就是:從中斷發生起,到執行中斷處理程序的條指令所用的時間。由于實時操作系統更多考慮的是壞的情況,而不是平均的情況,因此指令執行的時間就按照長的指令執行時間來計算,所以中斷延遲時間,通常是由關中斷的長時間來決定的。當FIQ(快速中斷)使能時,壞情況下FIQ的中斷延遲時間由以下幾個部分構成:

        t同步——請求通過同步器的長時間,約4個處理器周期。

        t長指令時間——長指令完成的時間。長指令是加載包括PC的所有寄存器的LDM指令,在零等待狀態的系統中,約為20個周期。

        t異常——數據異常進入時間,為3個周期。

        tFIQ——FIQ進入時間, 2個周期。

        的FIQ中斷延遲時間約為29個時鐘周期。在系統使用40 MHz處理器時鐘時,約為0.7 μs。

        對于的IRQ延遲,其計算與FIQ類似。若必須允許FIQ有更高的優先級,那么進入IRQ處理程序的延遲時間是隨機的[3]。

        3 試驗原理和測試方法

        首先需要啟動并開始運行μC/OS-II,因為試驗需要使用的計時函數是系統函數。進行堆棧和中斷向量等系統初始化后,首先要創建一個任務,用以產生中斷。這樣OS啟動后,中斷服務程序可以在任務中調用或者切換,中斷源可以設置為外部中斷或由任務產生。在主程序的臨界段循環查詢中斷狀態(VICRawIntr;中斷狀態寄存器),一旦發現有中斷標識,則立即啟動計數器,并使能該中斷,跳出臨界段(在進入臨界段之前要關中斷 (OS_ENTER_CRITICAL()),而跳出臨界段代碼進入中斷服務子程序后,保存全部CPU寄存器后清除中斷源,并立即開中斷 (OS_EXIT_CRITICAL()),然后停止計時并執行中斷處理代碼)。由于是在檢測到中斷標識后才跳出臨界段,所以一跳出臨界段就會立即發生中斷,進行中斷處理。保存了CPU寄存器后進入中斷服務的條指令就是保存計數器值。由于在跳出臨界段時才啟動的計數器,而在進入中斷服務時立即保存了計數值,所以這個計數值就是所需要的中斷響應時間。

        如果要試驗不同優先級的中斷響應時間,可以設幾個不同優先級的中斷服務程序,在高優先級程序的出口計數器清零;而在下一個中斷開始時保存計數值,從而測試中斷優先級對中斷響應時間的影響。

        如果要測試不同類型的中斷響應時間,可以在程序中,分別使用不同類型的中斷(向量中斷,非向量中斷,快速中斷)來測試中斷類型對中斷響應時間的影響。原則上快速中斷(FIQ)要求具有的優先級,而且快速中斷的處理與操作系統基本無關,中斷服務子程序可以自行編寫(在不調用μC/OS-II的系統服務程序的情況下),沒有特別的要求。向量中斷則不能如此。因為雖然ADS可以使用_irq關鍵字來聲明一個函數是用來處理中斷的,從而可以避免在程序中使用匯編代碼,但是在μC/OS-II中不能這樣處理。因為使用C語言無法確保堆棧的結構,而RTOS必須使堆棧保持一定的結構。這只有匯編語言可以做到。這部分的代碼在文件VECTORS.S中(為了簡化用戶編寫中斷服務子程序,這段匯編代碼已經被編寫成一個宏HANDLER)[4]。具體可見參考文獻 [4]的P358~P359中所列的程序清單6.5中的匯編代碼,即中斷服務子程序必須按照 μC/OS-II的中斷服務程序的要求編寫,格式如下[4]:

      保存全部CPU寄存器;(1)
      調用OSIntEnter或OSIntNesting直接加1;(2)
      清除中斷源(3)
      重新開中斷(4)
      執行用戶代碼做中斷服務;(5)
      調用OSIntExit();(6)
      恢復所有CPU寄存器;(7)
      執行中斷返回指令;(8)

        如果要測試存儲器加速模塊對中斷響應時間的影響,可以在關閉、部分使能和完全使能3種設置下分別測試同一個中斷的響應時間,從而得出中斷響應時間與存儲器加速模塊設置之間的關系。

        由于鎖相器的設置必然會影響中斷響應時間,并且中斷響應時間與鎖相器(PLL)的倍頻設置成反比,即倍頻設置越高,處理器工作速度越快,指令周期越短,而不同時鐘設置下同一中斷響應所需要執行的指令數是相同的,因而中斷響應時間就會越短。所以本文不作此項測試。

        下面用程序來測試運行在LPC2104上的μC/OS-II的中斷響應時間。系統初始環境(默認)設置如下:系統晶振頻率設為11 059.2 kHz,鎖相環(PLL)倍增器值設置為4,處理器工作在fCCLK=fOSC×4=11059 MHz×4=44.236 MHz。存儲器加速開啟。中斷類型為IRQ中斷,優先級為0,即優先級。

        μC/OS-II提供了標準的計時程序初始化以及計時開始和計時結束的函數,分別如下所示。這些函數將在所有的試驗中使用。

      void PC_ElapsedInit(void)//初始化計時程序設置
      void PC_ElapsedStart(void)//開始計時
      INT16U PC_ElapsedStop(void)//統計時間返回值

        進行實驗時,首先在進入main()函數前對系統進行一些基本的初始化工作,包括初始化引腳、系統時鐘、存儲器加速模塊、系統時鐘等參數,以保證系統能夠基本運行。初始化完成后,系統進入main()函數,并創建新的任務。以外部中斷為例,由按鍵產生一個外部中斷,在當前運行的任務中循環檢測中斷標志寄存器,檢測到后就跳出循環進入中斷服務子程序。統計這段時間,就可以得出中斷響應時間了。

        中斷服務程序的匯編部分按照參考文獻《ARM微控制器基礎與實踐》P384~P385的程序清單6.5異常處理代碼的匯編部分來編寫,也就是編寫宏HANDLER,并在Vectors.s文件中引用這個匯編接口:IRQ_Handler HANDLER IRQ_Exception,至此就完成了μC/OS-II中斷服務子程序的匯編部分。C語言部分主要用于具體的中斷處理,在完成必要的初始化后,只要在中斷處理程序的句將計時停止并返回計數值,具體的中斷處理代碼則并不重要,或者說停止計時就是中斷處理代碼了。由于IRQ中斷與系統相關,這部分代碼一般在文件TARGET.C中編寫實現。C語言部分示意性代碼如下所示:
      void __IRQ_Ecpe(void) {
      INT16UElapTime;
      OS_ENTER_CRITICAL();//關中斷
      OSIntEnter();//中斷服務子程序ISR開始
      EXTINT = 0x02;//清除中斷源
      OS_EXIT_CRITICAL();//開中斷
      ElapTime=PC_ElapsedStop();//停止計時并返回計數值
      OSIntExit();//退出中斷服務
      VICVectAddr0=0;//清零中斷向量
      }
      void Task (void) {
      PINSEL0 = 0x20000000;//設置I/O口工作模式,P0.14
      //設置為EINT1
      IODIR = 0x00000400;//設置LED1控制口為輸出,其
      //他I/O為輸入
      VICIntSelect = 0x00000000;//設置所有通道為IRQ中斷
      VICVectCntl0 = 0x2E;//EI NT1通道分配到IRQ slot 0,
      //即優先級
      VICVectAddr0 = (int)IRQ_Ecpe;//設置EINT0向量地址
      VICIntEnable = 0x00008000;//使能EINT0
      EXTINT = 0x02;//清除外部中斷標志
      OS_ENTER_CRITICAL();//進入臨界區,關中斷
      While(1)//循環檢測
      {if ((EXTINT & 0x01!)=0)
      PC_ElapsedStart(); //如果有中斷發生,計時開始
      break ;}}// 跳出循環;
      OS_EXIT_CRITICAL(); //退出臨界區,開中斷
      return(0);
      }
      int main (void) {
      PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
      OSInit();
      PC_DOSSaveReturn();
      PC_ElapsedInit()
      RandomSem=OSSemCreate(1);
      OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
      OSStart();
      }

        測試不同優先級的中斷響應時間的情況稍有些不同。因為要在低優先級任務的中斷出口激活高優先級的中斷任務,對計數器清零并開始計數,在高優先級的中斷處理代碼的條語句結束計時。其余的部分基本一樣。限于篇幅,具體的源代碼就不一一列舉了。

      4 結論

              
        經過試驗,得到表1所列測試數據。所有數據按照默認的條件,每次只更改其中一個條件測試得出。

      注:中斷優先級測試時,中斷響應時間大于正常值,是因為發生高優先級中斷時,需要等待低優先級中斷任務開中斷才能進行響應。

        由以上數據可知,μC/OS-II的中斷響應時間受內存加速模塊和系統頻率設置的影響較大,而與中斷的類型和任務(中斷)優先級關系不大。以上僅僅是個簡單的測試,更深入的測試可以基于這個方法繼續探討。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 制服肉丝亚洲中文字幕 | 中文字幕在线精品乱码高清视频 | 日本精品中文字幕二区a | 亚洲午夜看片福利717 | 亚洲青青草原男人的天堂 | 午夜A级理论片在线播放一级 |