Windows Embedded CE 6.0实时性分析(转载自sunrain_hjb)
Windows Embedded CE 6.0實時性分析
???? Windows Embedded CE 6.0是微軟公司目前最新的嵌入式操作系統之一,支持四種體系結構的MCU(ARM、MIPS、SH4和x86)。在眾多的嵌入式操作系統中,它以自己獨特的優勢脫穎而出,在整個嵌入式操作系統的市場份額中占有很大比重。相比其他嵌入式操作系統,Windows Embedded CE 6.0主要有以下特點:
- 圖形用戶界面,與桌面操作系統的圖形用戶界面基本一致,便于用戶接受;
- 網絡連接的支持,包括PAN、LAN、WAN、BlueTooth和WIFI;
- 多媒體的支持,如DirectDraw、DirectShow、Directory3D及多種音頻視頻的編解碼
- 多語言的支持,可以在定制系統時選擇一種或多種語言;
- 多進程的支持,理論上支持32K個進程,滿足各種應用需求;
- 組件化的開發方式有效縮短了產品的研發周期;
- 基于VS2005的集成開發環境,讓開發更方便。
????? 以上這些都是我們選擇Windows Embedded CE 6.0的原因,但在很多嵌入式系統的應用場合,系統的實時性至關重要。而整個系統的實時性在很大程度上取決于它所采用的操作系統。那么Windows Embedded CE 6.0的實時性到底如何,能否滿足我們的應用需求,或者說Windows Embedded CE 6.0是否是一個實時操作系統?本文將根據實際應用,介紹一種在目標硬件平臺上測試Windows Embedded CE 6.0實時性的方法。
????? 在討論Windows Embedded CE 6.0的實時性之前,先簡單介紹一下實時操作系統的概念。實時操作系統除了具有一般操作系統的基本要素外,還必須能及時準確地響應所有不可預知的外部觸發,即使在系統處于尖峰負荷狀態時。這是一個非常苛刻的要求。根據實際應用的場景不同,實時操作系統一般分為以下兩種。
- 硬實時操作系統:準時準確地響應所有的外部觸發,一次失敗將導致災難性的后果。這類操作系統在航空航天和工業控制領域應用廣泛。
- 軟實時操作系統:在不滿足響應時限時,系統性能退化,但不會導致災難性后果。這類操作系統在交換系統中經常有應用。
???? 這里需要注意,實時操作系統并不是一個“快速”系統,實時系統有限定的響應時間,而并非響應越快越好。事實上,響應時間可以是皮秒級的也可以是秒級的,甚至是分鐘級的。只要在系統規定的時限內正確響應所有的外部觸發,我們就可以認為它是一個實時操作系統,哪怕這個時限是一小時。舉個例子,顧客打電話給肯德基叫外賣,肯德基在規定的30分鐘內將顧客點的漢堡送達,那這個過程就可以認為是實時性的,時限為30分鐘。
?????從2000年發布的WinCE3.0開始,Windows Embedded CE就是一個實時操作系統。隨著新版本的不斷推出,Windows Embedded CE的實時性也不斷提高。毋庸置疑,Windows Embedded CE 6.0也是一個實時操作系統。
通常,對于實時操作系統來說,外部觸發一般是指外部中斷觸發。所以,外部中斷的響應時間(中斷延遲)是衡量其實時性的一個重要標準。下面將從這一角度分析Windows Embedded CE 6.0的實時性。
Windows Embedded CE 6.0的中斷處理過程主要分為兩部分:
- 中斷服務例程(ISR):處于內核中的低級處理程序,中斷發生時首先被調用。
- 中斷服務線程(IST):處于驅動或者應用中的中斷處理線程,由系統調度,完成大部分的中斷處理工作。
???? ISR的實現在OAL(OEM適配層)中,它只處理最低級的中斷響應,通常是設置MCU內部的中斷控制寄存器。中斷處理的主要部分在驅動或者應用的中斷處理線程中。中斷處理線程與其他線程一樣,使用同一個線程優先級管理系統。ISR和IST之間通過事件對象進行同步。IST中創建一個事件對象,并使用函數WaitForSingleObject()等待該事件被觸發。ISR中通知內核觸發相應的事件對象。Windows Embedded CE 6.0的中斷處理的過程如下圖所示。
????????????????? 圖-1 Windows Embedded CE 6.0的中斷處理過程
???? 可以看到,從外部中斷產生到IST運行,中間經歷了幾個環節,每一個環節都有時間開銷,有些時間是基本確定的,有些時間隨系統的狀態不同而不同。但整個中斷延遲主要可分成ISR延遲和IST延遲兩部分,如圖-2所示,t1為ISR延遲,t2為IST延遲。中斷延遲的時間是衡量Windows mbedded CE 6.0實時性的一個重要指標。那么如何在我們系統的硬件平臺上測得這個中斷延遲的具體值,從而進一步分析Windows Embedded CE 6.0的實時性能否滿足項目的實際應用需求。
??????? 圖-2 Windows Embedded CE 6.0的中斷延遲模型
????? 這是中斷延遲的一個簡要模型,t1是ISR延遲,t2是IST延遲,t1+t2即為中斷延遲,我們需要測量和計算的就是這兩個值。
Windows Embedded CE 6.0提供了一些工具軟件,用來測量中斷延遲,如ILTiming.exe。它需要OAL的代碼支持,并且在定制系統時設置相應的編譯屬性,具體用法可參考Platform Builder 6.0的幫助。這里介紹一種借助硬件的測量方法,能在示波器上直觀的看出中斷延遲。
根據前文所述的中斷處理過程以及圖-2所示的中斷延遲模型,可通過控制MCU的一個GPIO輸出引腳來幫助測量t1和t2。具體方法如下:
1. 在OAL的OALIntrInit()函數中,設置某一GPIO為輸出口,并使其輸出高電平;
2. 在ISR的OEMInterruptHandler()函數中,將該GPIO設置為低電平;
3. 在IST的WaitForSingleObject()函數之后,將該GPIO設置為高電平;
4. 當外部中斷觸發時,GPIO會先被ISR拉低,再被IST拉高;
5. t1是外部中斷下降沿觸發以后,GPIO保持高電平的時間;
6. t2是GPIO保持低電平的時間;
7. t1+t2≈中斷延遲時間
????? 實際應用的目標平臺采用的MCU是S3C2410,其設置GPIO的主要代碼如下。
//初始化GPIO,并設置為高
//設置GPE11為輸出口
value = INREG32(&pOalPortRegs->GPECON);
OUTREG32(&pOalPortRegs->GPECON, (value & ~(3 << 22))|(1 << 22));
//設置GPE11的IO狀態為高
value = INREG32(&pOalPortRegs->GPEDAT);
OUTREG32(&pOalPortRegs->GPEDAT, (value |(1 << 11)));
在ISR中設置GPIO為低的代碼如下。
//將GPE11置低
mask = INREG32(&g_pPortRegs->GPEDAT);
OUTREG32(&g_pPortRegs->GPEDAT, (mask & ~(1<<11)));
驅動中的IST代碼如下。
DWORD WINAPI IntrThreadProc(LPVOID ptr)
{
???? while(bRun)
???? {
?????????? WaitForSingleObject(gIntrEvent, INFINITE);
?????????? //將GPE11置高
????????? g_pIOPregs->GPEDAT |= (0x1 << 11);
????????? //RETAILMSG(1,(TEXT(“/r/nThread Run.”)));
????????? //Sleep(1000);
????????? InterruptDone(gSysIntr);
?????? }
?????? return 0;
}
????? 實現以上代碼后,重新編譯,并將操作系統下載到目標平臺上。使用雙通道的示波器測量中斷觸發引腳和GPIO的輸出引腳,其中CH1測量GPIO的輸出引腳,CH2測量外部中斷引腳。
????? 在使用下降沿觸發中斷時,中斷信號和GPIO的輸出信號如圖-3所示。
????????????????????????????? 圖-3 下降沿觸發時的實際波形
????? 從上圖可以看出,t1基本可以忽略不計,t2約為1.8ms,t1+t2不到2ms,說明此時的中斷延遲小于2ms。
在使用高電平中斷,且IST中有輸出調試信息時的波形如圖-4所示。
??????????????????? 圖-4 高電平觸發,IST中有延時的實際波形
????? 從上圖可以看出,t2的時間約為1.8ms,兩次中斷的時間間隔約為3.8ms。中斷延遲小于2ms。
在使用高電平中斷,且IST中沒有輸出調試信息時的波形如圖-5所示。
?????????????????? 圖-5 高電平觸發,IST中無延時的實際波形
?????從上圖可以看出,t2的時間大約為18μ秒,t1可以認為小于4μ秒,兩次中斷之間的時間間隔為22μ秒,且能夠連續穩定的正確響應。這說明Windows Embedded CE 6.0內核的中斷延遲可達18μ秒。當然,我們很難根據一次測量的值來判定它的最低響應時限為多少,但微秒的數量級足以說明Windows Embedded CE 6.0的實時性基本可以滿足常見的各種應用。
?????需要注意的是,應用系統的實時性并不完全由操作系統的實時性決定,系統的硬件結構、軟件驅動和應用程序等都會影響到整個系統的實時性。另外,Windows Embedded CE 6.0雖然是實時操作系統,但它也提供了非實時的工作環境,如果定制系統時添加了非實時的相關組件,也會影響系統的實時性。
Platform Builder 6.0提供的Remote Kernel Tracker工具,可以幫助我們觀察系統線程的執行情況。圖-6和圖-7所示是采用高電平觸發,有1秒Sleep的狀態截圖,第一個框表示線程執行到Sleep(1000),第二個框表示等待事件被觸發,紅色的虛線表示線程處于阻塞的狀態。
????????????? 圖-6 高電平觸發,IST中有延時的狀態,Sleep(1000)
?????????????????? 圖-7 高電平觸發,IST中有延時的狀態,等待事件的觸發
????? 以上通過測量中斷延遲時間,驗證了Windows Embedded CE 6.0的實時性。當然,實時操作系統的定義嚴格,判斷一個操作系統是否為實時操作系統,還有其他一些因素,如系統的中斷管理機制、線程管理機制、同步對象的支持、內存的管理等等。
????? 實際開發過程中,如何提高系統的實時性呢?在硬件平臺、操作系統確定的前提下,我們還可以做哪些工作?通過前面的分析和實際測量,可以知道ISR的中斷延遲時間很短,也很難再控制。IST的延遲受系統線程調度的影響,有進一步控制的可能。
????? Windows Embedded CE 6.0使用基于優先級的時間片輪轉算法對線程進行調度。對處于就緒態隊列的線程,先分給優先級最高的線程以時間片,當時間片用完后,無論線程是否執行完畢,都退回就緒態隊列中,等待下一次的時間片分配。
????? 所以,一方面,我們可以通過提高中斷線程的優先級以獲得更多的執行機會。Windows Embedded CE 6.0的線程有256個優先級(0~255),0的優先級最高,255的優先級最低。線程默認的優先級為251。WinCE中用來設置線程優先級的函數有兩個。
CeSetThreadPriority(HANDLE hThread,int nPriority):可以設置0~255的所有優先級
SetThreadPriority(HANDLE hThread,int nPriority):只能設置8個最低的優先級(248~255)
????? 為了減小中斷處理延遲,應使用CeSetThreadPriority()設置更高的線程優先級。函數SetThreadPriority()通常在應用程序中用來設置工作線程的優先級。
????? 另一方面,我們可以修改線程的時間片大小(線程額度),線程額度只會影響同一優先級的線程調度。系統默認的線程額度是100ms。線程額度被設為0意味著線程將一直執行,直到被阻塞或者被更高優先級的打斷。修改線程額度有兩種方法,可以在OAL的OEMInit()函數中設置dwDefaultThreadQuantum,這將修改系統默認的線程額度。也可以使用設置線程額度的函數CeSetThreadQuantum(HANDLE hThread,DWORD dwTime)來修改某一特定線程的線程額度。為了保證系統的實時性,dwDefaultThreadQuantum應該設定為一個合適的值。對實時性要求較高的中斷處理線程,可以單獨將它的線程額度設為0。
????? 以上兩種方法是比較方便的處理方法,如果采用了這兩種方法后,系統的實時性仍然不能滿足需求,那么需要考慮其他的解決辦法,主要有以下幾個:
- 將中斷處理的主要部分放到ISR中,這是一種困難而又危險的做法,困難是因為ISR中能調用的系統函數有限,危險意味著處理不當會導致系統性能急劇下降。
- 改善外部中斷的觸發機制,從硬件著手,如增加硬件緩沖區,減少單位時間內的中斷響應次數,在IST中處理硬件緩沖區的數據,這種方法能極大提高系統的實時性。
- 采用更高主頻的MCU,提高總線訪問速度。
????? 總之,實現一個實時系統,需要從硬件、操作系統、驅動和應用程序等各方面考慮,根據應用的需求選擇合適的硬件、操作系統,在軟件設計時也需要時刻考慮到實時性的要求。
總結
以上是生活随笔為你收集整理的Windows Embedded CE 6.0实时性分析(转载自sunrain_hjb)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【牛客刷题HJ8】合并表记录
- 下一篇: 神经网络算法中求解的方式,神经网络的求解