許廣柱,吳錦鳳
(西安航天動力試驗技術(shù)研究所,陜西西安710100)
工業(yè)控制在很多方面都有實時性的要求,如今,絕大部分工業(yè)控制軟件都是基于Windows操作系統(tǒng)設(shè)計編制的,如何在多任務(wù)的Windows系統(tǒng)上實現(xiàn)實時控制是很多工業(yè)程序員頭疼的問題。多年來,有的控制系統(tǒng)以編程極不便利的DOS操作系統(tǒng)為平臺開發(fā)設(shè)計控制方案,有的購買價格昂貴的實時操作系統(tǒng)設(shè)計開發(fā),不但需要人員再培訓(xùn),且設(shè)計開發(fā)周期長。新建的XXX試車臺控制系統(tǒng),使用了成本相對低廉、實時性較好的嵌入式WinCE5操作系統(tǒng)進行設(shè)計。由于WinCE系統(tǒng)仍然是以Windows為核心,即多任務(wù)操作系統(tǒng),實時性方面同樣存在問題。因此,本文就此操作系統(tǒng)下的實時控制提供一套系統(tǒng)解決方案并論述軟件框架的擴展和應(yīng)用。
WinCE操作系統(tǒng)是多任務(wù)系統(tǒng),就是在“同一時間段內(nèi)可以同時執(zhí)行”多個應(yīng)用軟件,完成多個任務(wù)。其實,所謂“同一時間段內(nèi)同時執(zhí)行”是相對于使用者感覺而言的。事實上,在同一個時刻WinCE只能夠完成一個指令,使用者感覺是“同時”,是因為WinCE給每個線程分配毫秒級的時間片,并按每線程優(yōu)先級來依次執(zhí)行操作,由于時間片很短,人眼睛是不能分辨執(zhí)行順序的,所以造成了“同時執(zhí)行”的錯覺,正因為這種時間片分配來執(zhí)行不同任務(wù)的特性,導(dǎo)致了WinCE操作系統(tǒng)不能完成完全性質(zhì)的實時性控制。
進程:一個進程通常定義為程序的一個實例。在32位Windows中,進程占據(jù)4 GB的虛擬地址空間。進程是沒有活力的,就是說,一個32位Windows進程并不執(zhí)行什么指令,它只占據(jù)著4 GB的地址空間,此空間中有應(yīng)用程序EXE等PE文件的代碼和數(shù)據(jù)。
線程:如上所述,進程只是一個靜態(tài)的概念;為了讓進程完成一些工作,進程必須至少占有一個線程,所以線程是描述進程內(nèi)的執(zhí)行。正是線程負責(zé)執(zhí)行包含在進程的地址空間中的代碼,如果沒有線程執(zhí)行進程地址空間中的代碼,進程也就沒有繼續(xù)存在的理由,系統(tǒng)將自動清除進程及其地址空間。為了運行所有這些線程,操作系統(tǒng)為每個獨立線程安排一些CPU時間,以輪轉(zhuǎn)方式向線程提供時間片,所以Windows系統(tǒng)時間片的分配是以線程為基本單位的。創(chuàng)建一個32位Windows進程時,它的第一個線程稱為主線程,由系統(tǒng)自動生成,然后可由這個主線程生成額外的線程,這些線程又可生成更多的線程。
如前所述,Windows操作系統(tǒng)時間片分配是針對線程來說的,而線程執(zhí)行的順序是按照其優(yōu)先級來編排的。對于Windows CE等嵌入式操作系統(tǒng),優(yōu)先級是以線程為單位,整個系統(tǒng)運行中的應(yīng)用級線程缺省都是同等優(yōu)先級。改變線程的優(yōu)先級,或者說進行線程調(diào)度就可以改變WinCE系統(tǒng)時間片的分配方向以及線程自身執(zhí)行的順序。
改變優(yōu)先級可以通過使用SetThreadPriority()函數(shù)來實現(xiàn)。Windows CE系統(tǒng)是搶占式多任務(wù)系統(tǒng),進程之間無優(yōu)先級之分,只將線程分為256個優(yōu)先級。0優(yōu)先級最高,255最低,0到247優(yōu)先級對應(yīng)于核心態(tài)線程。248到255優(yōu)先級對應(yīng)于用戶態(tài)線程,一般分配給普通應(yīng)用程序線程使用。251優(yōu)先級 (THREAD_PRIORITY_NORMAL)是正常優(yōu)先級。255優(yōu)先級(THREAD_PRIORITY_IDLE)為空閑優(yōu)先級。249優(yōu)先級 (THREAD_PRIORITY_HIGHEST)是高優(yōu)先級。
綜上所述,如果可以在線程上爭取到一定程度的優(yōu)先級,也就是爭取到了時間片分配和執(zhí)行權(quán)的優(yōu)先級,自然就可以達到相對實時性的控制效果。
32位Windows CE系統(tǒng)下有以下3種定時系統(tǒng)。
1)基于消息機制的定時器,通過SetTimer()函數(shù)設(shè)置,使用消息處理機制。由于其原理為消息,所以定時精度較低,一般為55 ms左右。
2)多媒體定時器,通過timeSetEvent()函數(shù)設(shè)置,是內(nèi)核級定時器,定時精度很高,可以達到1 ms,使用回調(diào)函數(shù)形式執(zhí)行任務(wù)代碼。
3)CPU計數(shù)器,通過 QueryPerformance-Counter()和QueryPerformanceFrequecy()來獲取計算機主頻計數(shù)器值(從開機開始到調(diào)用時的時間間隔計數(shù)值)和CPU頻率,可以做到微秒級的時間控制精度,但是沒有相應(yīng)的執(zhí)行任務(wù)機制,只能作為高精度時間參考。
基于以上3個定時系統(tǒng),在獲取時間數(shù)值的同時又要完成控制任務(wù),1)和2)是基本選擇,至于時間精度方面就需要根據(jù)需求來選擇使用。
一般情況下,應(yīng)用系統(tǒng)無須參與系統(tǒng)線程調(diào)度工作,但對于比較復(fù)雜的高精度實時應(yīng)用來說,有時需要應(yīng)用自身參與本進程的內(nèi)部線程的協(xié)調(diào)與調(diào)度 (或準調(diào)度)工作,或直接使用高優(yōu)先級線程執(zhí)行控制任務(wù)以達到一定的實時性要求。
做到這一點,就需要依靠前文中提到的多媒體定時器,相應(yīng)的接口函數(shù)以Windows API形式由動態(tài)鏈接庫coredll.dll提供,C++頭文件為mmsystem.h。操作由4個接口函數(shù)和1個回調(diào)函數(shù)完成。4個接口函數(shù)為:timeBeginPeriod(),timeEndPeriod(),timeSetEvent()及timeKillEvent()?;卣{(diào)函數(shù)是完成任務(wù)的主體,timeSetEvent第3個參數(shù)為此回調(diào)函數(shù)的地址。
通過函數(shù)timeBeginPeriod()設(shè)置最小的定時精度,可達到1 ms的精度,定時器回調(diào)函數(shù)執(zhí)行時間間隔最小為1 ms。該定時器不依賴于消息機制進行觸發(fā),當(dāng)用戶在程序中調(diào)用函數(shù)time-SetEvent()時,系統(tǒng)產(chǎn)生一個獨立的Win32內(nèi)核級線程,并將用戶提供的用戶級的時鐘定時處理程序(回調(diào)函數(shù))以回調(diào)的方式綁定在該線程中,而該線程又由硬件時鐘中斷 (很高的中斷優(yōu)先級)的ISR來觸發(fā),因此利用timeSetEvent()編寫的定時器程序,具有很強的中斷優(yōu)先權(quán),遠遠高于其它的用戶態(tài)線程,軟件進程、線程不能打斷其執(zhí)行。綜上所述,多媒體定時器表現(xiàn)出良好的實時性能。多媒體時鐘的定時線程完全可以勝任直接執(zhí)行主控制任務(wù)代碼或者通過執(zhí)行主控制邏輯操作內(nèi)部線程的協(xié)調(diào)與調(diào)度工作。
綜上幾點,Windows CE雖在實時性方面較其他Windows系統(tǒng)優(yōu)秀,但仍屬于多任務(wù)操作系統(tǒng)。相比實時操作系統(tǒng),WinCE下直接通過軟件實現(xiàn)高精度時間控制是比較困難的。為了實現(xiàn)10ms級別的時間控制精度,可采用多媒體定時器結(jié)合外圍硬件定時板的方式實現(xiàn)。利用ISR級中斷的多媒體時鐘輪詢硬件定時器,并適時利用微秒級精度的CPU計數(shù)器進行時間補償,以硬件定時時基為基準,完全可以達到10 ms級別的實時控制精度需求。
XXX試車臺增壓/閉環(huán)控制系統(tǒng)硬件采用研華定時器板3780和IO開關(guān)量板3753。開關(guān)量板3753用于輸入開關(guān)量的檢測及輸出開關(guān)量控制閥門動作;定時器板是實時性控制的硬件核心,其定時器的定時精度和穩(wěn)定性影響整個控制系統(tǒng)的時間控制精度。
控制軟件核心采用前文中所述的多媒體定時器,但因為多媒體定時器定時間隔精度較硬件定時器低,因而采用在多媒體定時器回調(diào)函數(shù)中獲取3780硬件定時器數(shù)值,以獲得滿足系統(tǒng)時間精度要求的時間控制精度。
多媒體定時器的回調(diào)函數(shù)相當(dāng)于一個優(yōu)先級很高的定時線程,其自身的實時性保證了所有控制邏輯實現(xiàn)的實時性,配合高精度硬件定時器,可以做到高實時和高定時精度控制,對于試車控制系統(tǒng)來說完全滿足要求。控制軟件框架見圖1。
定時線程中取得硬件定時器計數(shù)值,計算并比較時間,如果到達指定的控制時間,則根據(jù)控制邏輯執(zhí)行相應(yīng)的操作??刂茣r間精度取決于硬件定時器和多媒體定時器的定時間隔精度,以及這兩者的協(xié)調(diào)配合程度。增壓/閉環(huán)控制系統(tǒng)多媒體時鐘定時間隔設(shè)定為2 ms,實際測試整個控制系統(tǒng)千秒累計時間誤差小于20 ms,完全滿足設(shè)計要求。
該軟件框架設(shè)計過程中需要注意的是,回調(diào)函數(shù)中的所有工作必須在多媒體定時器的定時間隔內(nèi)完成,否則會失去實時性并可能導(dǎo)致定時混亂。為保證多媒體定時器回調(diào)代碼的實時性,有關(guān)界面顯示工作的代碼不能在回調(diào)函數(shù)中直接執(zhí)行,需要設(shè)定一個專門用于顯示的線程來完成此任務(wù)。
圖1所示的軟件框架不僅僅應(yīng)用在XXX試車臺增壓/閉環(huán)控制系統(tǒng)上,對其做相應(yīng)的擴展就可以應(yīng)用在眾多的實時控制系統(tǒng)中,參見圖2。
其中實時性要求很高的操作在回調(diào)函數(shù)本體中執(zhí)行,其他輔助控制工作在工作線程中完成,并在多媒體定時器回調(diào)函數(shù)中通過分析任務(wù)需求,編制控制邏輯來完成對每個工作線程的調(diào)度,包括:線程優(yōu)先級控制、工作線程邏輯順序控制、工作線程之間的協(xié)調(diào)等任務(wù)。
線程的調(diào)度在前文中已有闡述。各個線程中途“掛起”SuspendThread()或“終止”ExitThread()或TerminateThread()的操作,正常情況下都是由自身完成的,并通過設(shè)置有關(guān)的“標志變量”值來“通知”定時線程,這樣處理的特點是安全、簡單、高效,而且也容易擴展新的線程。各個線程中途“恢復(fù)”ResumeThread()或“啟動”操作都是由定時線程完成的。線程間的同步可以通過設(shè)定臨界區(qū)Critical Section、互斥對象Mutex、事件Event等來實現(xiàn)。
工業(yè)控制有些環(huán)節(jié)也要求很高時間精度的定時控制,關(guān)于這點可以使用2種方案來輔助完成: (1)在回調(diào)函數(shù)中通過API,Query Performance Counter()和Query Performance Frequecy()來獲取計算機主頻計數(shù)器值和CPU頻率,或者獲取系統(tǒng)CPU時間戳,計算并比較時間,適時對多媒體定時做補償修正,此方法可以很大程度上提高時間控制精度; (2)制定外圍高精度定時器板卡軟件驅(qū)動,為控制軟件提供Windows系統(tǒng)硬件中斷級回調(diào)過程。軟件編制控制邏輯在此回調(diào)中執(zhí)行,并利用CPU時間戳進行進一步的時間控制。由于回調(diào)過程在硬件中斷下驅(qū)動,時間控制精度很高,理論可達到微秒級,而且控制時間間隔非常穩(wěn)定。需要注意,這種方式系統(tǒng)資源占用較大,在實際控制設(shè)計中必須考慮。
本文提供的設(shè)計框架,在多數(shù)工業(yè)控制應(yīng)用場合都可以合理、有效的實現(xiàn)實時控制,雖然具體到每個應(yīng)用環(huán)境還需要對架構(gòu)進行適當(dāng)調(diào)整,對工作邏輯控制進行合理配置,但基本思路都是適用的。理解并合理運用此架構(gòu),會為設(shè)計者帶來很大的便利,其應(yīng)用前景廣大。該架構(gòu)為今后試驗控制系統(tǒng)的設(shè)計同樣具有參考價值。
[1]BEVERIDGE Jim,WIEN Robert.Win32多線程程序設(shè)計[M].武漢:華中科技大學(xué)出版社,2002.
[2]傅曦,齊宇.嵌入式系統(tǒng)Windows CE開發(fā)技巧與實例[M].北京:化學(xué)工業(yè)出版社,2004.
[3]孫鑫,余安萍.VC++深入詳解[M].北京:電子工業(yè)出版社,2006.
[4]RICHTER Jetfrey.Windows核心編程[M].5 版.北京:清華大學(xué)出版社,2008.