許廣柱,吳錦鳳
(西安航天動力試驗技術研究所,陜西西安710100)
工業控制在很多方面都有實時性的要求,如今,絕大部分工業控制軟件都是基于Windows操作系統設計編制的,如何在多任務的Windows系統上實現實時控制是很多工業程序員頭疼的問題。多年來,有的控制系統以編程極不便利的DOS操作系統為平臺開發設計控制方案,有的購買價格昂貴的實時操作系統設計開發,不但需要人員再培訓,且設計開發周期長。新建的XXX試車臺控制系統,使用了成本相對低廉、實時性較好的嵌入式WinCE5操作系統進行設計。由于WinCE系統仍然是以Windows為核心,即多任務操作系統,實時性方面同樣存在問題。因此,本文就此操作系統下的實時控制提供一套系統解決方案并論述軟件框架的擴展和應用。
WinCE操作系統是多任務系統,就是在“同一時間段內可以同時執行”多個應用軟件,完成多個任務。其實,所謂“同一時間段內同時執行”是相對于使用者感覺而言的。事實上,在同一個時刻WinCE只能夠完成一個指令,使用者感覺是“同時”,是因為WinCE給每個線程分配毫秒級的時間片,并按每線程優先級來依次執行操作,由于時間片很短,人眼睛是不能分辨執行順序的,所以造成了“同時執行”的錯覺,正因為這種時間片分配來執行不同任務的特性,導致了WinCE操作系統不能完成完全性質的實時性控制。
進程:一個進程通常定義為程序的一個實例。在32位Windows中,進程占據4 GB的虛擬地址空間。進程是沒有活力的,就是說,一個32位Windows進程并不執行什么指令,它只占據著4 GB的地址空間,此空間中有應用程序EXE等PE文件的代碼和數據。
線程:如上所述,進程只是一個靜態的概念;為了讓進程完成一些工作,進程必須至少占有一個線程,所以線程是描述進程內的執行。正是線程負責執行包含在進程的地址空間中的代碼,如果沒有線程執行進程地址空間中的代碼,進程也就沒有繼續存在的理由,系統將自動清除進程及其地址空間。為了運行所有這些線程,操作系統為每個獨立線程安排一些CPU時間,以輪轉方式向線程提供時間片,所以Windows系統時間片的分配是以線程為基本單位的。創建一個32位Windows進程時,它的第一個線程稱為主線程,由系統自動生成,然后可由這個主線程生成額外的線程,這些線程又可生成更多的線程。
如前所述,Windows操作系統時間片分配是針對線程來說的,而線程執行的順序是按照其優先級來編排的。對于Windows CE等嵌入式操作系統,優先級是以線程為單位,整個系統運行中的應用級線程缺省都是同等優先級。改變線程的優先級,或者說進行線程調度就可以改變WinCE系統時間片的分配方向以及線程自身執行的順序。
改變優先級可以通過使用SetThreadPriority()函數來實現。Windows CE系統是搶占式多任務系統,進程之間無優先級之分,只將線程分為256個優先級。0優先級最高,255最低,0到247優先級對應于核心態線程。248到255優先級對應于用戶態線程,一般分配給普通應用程序線程使用。251優先級 (THREAD_PRIORITY_NORMAL)是正常優先級。255優先級(THREAD_PRIORITY_IDLE)為空閑優先級。249優先級 (THREAD_PRIORITY_HIGHEST)是高優先級。
綜上所述,如果可以在線程上爭取到一定程度的優先級,也就是爭取到了時間片分配和執行權的優先級,自然就可以達到相對實時性的控制效果。
32位Windows CE系統下有以下3種定時系統。
1)基于消息機制的定時器,通過SetTimer()函數設置,使用消息處理機制。由于其原理為消息,所以定時精度較低,一般為55 ms左右。
2)多媒體定時器,通過timeSetEvent()函數設置,是內核級定時器,定時精度很高,可以達到1 ms,使用回調函數形式執行任務代碼。
3)CPU計數器,通過 QueryPerformance-Counter()和QueryPerformanceFrequecy()來獲取計算機主頻計數器值(從開機開始到調用時的時間間隔計數值)和CPU頻率,可以做到微秒級的時間控制精度,但是沒有相應的執行任務機制,只能作為高精度時間參考。
基于以上3個定時系統,在獲取時間數值的同時又要完成控制任務,1)和2)是基本選擇,至于時間精度方面就需要根據需求來選擇使用。
一般情況下,應用系統無須參與系統線程調度工作,但對于比較復雜的高精度實時應用來說,有時需要應用自身參與本進程的內部線程的協調與調度 (或準調度)工作,或直接使用高優先級線程執行控制任務以達到一定的實時性要求。
做到這一點,就需要依靠前文中提到的多媒體定時器,相應的接口函數以Windows API形式由動態鏈接庫coredll.dll提供,C++頭文件為mmsystem.h。操作由4個接口函數和1個回調函數完成。4個接口函數為:timeBeginPeriod(),timeEndPeriod(),timeSetEvent()及timeKillEvent()。回調函數是完成任務的主體,timeSetEvent第3個參數為此回調函數的地址。
通過函數timeBeginPeriod()設置最小的定時精度,可達到1 ms的精度,定時器回調函數執行時間間隔最小為1 ms。該定時器不依賴于消息機制進行觸發,當用戶在程序中調用函數time-SetEvent()時,系統產生一個獨立的Win32內核級線程,并將用戶提供的用戶級的時鐘定時處理程序(回調函數)以回調的方式綁定在該線程中,而該線程又由硬件時鐘中斷 (很高的中斷優先級)的ISR來觸發,因此利用timeSetEvent()編寫的定時器程序,具有很強的中斷優先權,遠遠高于其它的用戶態線程,軟件進程、線程不能打斷其執行。綜上所述,多媒體定時器表現出良好的實時性能。多媒體時鐘的定時線程完全可以勝任直接執行主控制任務代碼或者通過執行主控制邏輯操作內部線程的協調與調度工作。
綜上幾點,Windows CE雖在實時性方面較其他Windows系統優秀,但仍屬于多任務操作系統。相比實時操作系統,WinCE下直接通過軟件實現高精度時間控制是比較困難的。為了實現10ms級別的時間控制精度,可采用多媒體定時器結合外圍硬件定時板的方式實現。利用ISR級中斷的多媒體時鐘輪詢硬件定時器,并適時利用微秒級精度的CPU計數器進行時間補償,以硬件定時時基為基準,完全可以達到10 ms級別的實時控制精度需求。
XXX試車臺增壓/閉環控制系統硬件采用研華定時器板3780和IO開關量板3753。開關量板3753用于輸入開關量的檢測及輸出開關量控制閥門動作;定時器板是實時性控制的硬件核心,其定時器的定時精度和穩定性影響整個控制系統的時間控制精度。
控制軟件核心采用前文中所述的多媒體定時器,但因為多媒體定時器定時間隔精度較硬件定時器低,因而采用在多媒體定時器回調函數中獲取3780硬件定時器數值,以獲得滿足系統時間精度要求的時間控制精度。
多媒體定時器的回調函數相當于一個優先級很高的定時線程,其自身的實時性保證了所有控制邏輯實現的實時性,配合高精度硬件定時器,可以做到高實時和高定時精度控制,對于試車控制系統來說完全滿足要求。控制軟件框架見圖1。

定時線程中取得硬件定時器計數值,計算并比較時間,如果到達指定的控制時間,則根據控制邏輯執行相應的操作。控制時間精度取決于硬件定時器和多媒體定時器的定時間隔精度,以及這兩者的協調配合程度。增壓/閉環控制系統多媒體時鐘定時間隔設定為2 ms,實際測試整個控制系統千秒累計時間誤差小于20 ms,完全滿足設計要求。
該軟件框架設計過程中需要注意的是,回調函數中的所有工作必須在多媒體定時器的定時間隔內完成,否則會失去實時性并可能導致定時混亂。為保證多媒體定時器回調代碼的實時性,有關界面顯示工作的代碼不能在回調函數中直接執行,需要設定一個專門用于顯示的線程來完成此任務。
圖1所示的軟件框架不僅僅應用在XXX試車臺增壓/閉環控制系統上,對其做相應的擴展就可以應用在眾多的實時控制系統中,參見圖2。

其中實時性要求很高的操作在回調函數本體中執行,其他輔助控制工作在工作線程中完成,并在多媒體定時器回調函數中通過分析任務需求,編制控制邏輯來完成對每個工作線程的調度,包括:線程優先級控制、工作線程邏輯順序控制、工作線程之間的協調等任務。
線程的調度在前文中已有闡述。各個線程中途“掛起”SuspendThread()或“終止”ExitThread()或TerminateThread()的操作,正常情況下都是由自身完成的,并通過設置有關的“標志變量”值來“通知”定時線程,這樣處理的特點是安全、簡單、高效,而且也容易擴展新的線程。各個線程中途“恢復”ResumeThread()或“啟動”操作都是由定時線程完成的。線程間的同步可以通過設定臨界區Critical Section、互斥對象Mutex、事件Event等來實現。
工業控制有些環節也要求很高時間精度的定時控制,關于這點可以使用2種方案來輔助完成: (1)在回調函數中通過API,Query Performance Counter()和Query Performance Frequecy()來獲取計算機主頻計數器值和CPU頻率,或者獲取系統CPU時間戳,計算并比較時間,適時對多媒體定時做補償修正,此方法可以很大程度上提高時間控制精度; (2)制定外圍高精度定時器板卡軟件驅動,為控制軟件提供Windows系統硬件中斷級回調過程。軟件編制控制邏輯在此回調中執行,并利用CPU時間戳進行進一步的時間控制。由于回調過程在硬件中斷下驅動,時間控制精度很高,理論可達到微秒級,而且控制時間間隔非常穩定。需要注意,這種方式系統資源占用較大,在實際控制設計中必須考慮。
本文提供的設計框架,在多數工業控制應用場合都可以合理、有效的實現實時控制,雖然具體到每個應用環境還需要對架構進行適當調整,對工作邏輯控制進行合理配置,但基本思路都是適用的。理解并合理運用此架構,會為設計者帶來很大的便利,其應用前景廣大。該架構為今后試驗控制系統的設計同樣具有參考價值。
[1]BEVERIDGE Jim,WIEN Robert.Win32多線程程序設計[M].武漢:華中科技大學出版社,2002.
[2]傅曦,齊宇.嵌入式系統Windows CE開發技巧與實例[M].北京:化學工業出版社,2004.
[3]孫鑫,余安萍.VC++深入詳解[M].北京:電子工業出版社,2006.
[4]RICHTER Jetfrey.Windows核心編程[M].5 版.北京:清華大學出版社,2008.