蔡文齋
(中國電子科技集團(tuán)公司第三十九研究所陜西西安 710065)
硬件中斷引入方法及中斷深度性能測(cè)試
蔡文齋
(中國電子科技集團(tuán)公司第三十九研究所陜西西安 710065)
討論了Windows操作系統(tǒng)下硬件中斷產(chǎn)生的方法,使用硬件DIO輸出卡對(duì)設(shè)計(jì)的中斷服務(wù)程序作了多種時(shí)序下試驗(yàn),做了Windows系統(tǒng)下中斷服務(wù)工作時(shí)的干擾試驗(yàn),在中斷線程和工作線程內(nèi)部提出了多種試驗(yàn)方法,深入研究了Windows系統(tǒng)下的內(nèi)核級(jí)調(diào)度執(zhí)行相關(guān)代碼段所需的時(shí)間,測(cè)試了多種時(shí)鐘的精確度,設(shè)計(jì)了工程實(shí)用的中斷服務(wù)程序。
中斷 定時(shí)器 性能測(cè)試 線程 事件
某項(xiàng)目要求開發(fā)一套高分辨率天線監(jiān)控系統(tǒng),工作時(shí)序?yàn)?0 ms級(jí)。設(shè)計(jì)一套硬件中斷策略,使控制系統(tǒng)嚴(yán)格按時(shí)序執(zhí)行任務(wù),在設(shè)計(jì)及開發(fā)這一系統(tǒng)時(shí),進(jìn)一步測(cè)試是否可以設(shè)計(jì)出更快的硬件中斷,做為未來更快時(shí)序下實(shí)時(shí)控制系統(tǒng)監(jiān)控軟件使用。
Windows系統(tǒng)下硬件中斷一般使用2種方式引入,一種方式為RS-232電平形式,另一種使用TTL電平形式。串口形式下實(shí)際是采用Modem狀態(tài)變化來檢查中斷信號(hào),TTL電平形式使用I/O卡檢查中斷信號(hào)。串口形式下的硬件中斷在軟件系統(tǒng)中使用串口的Modem狀態(tài)檢測(cè)編程,檢測(cè)狀態(tài)變化,注意從低電平變到高電平或者從高電平變到低電平全要計(jì)算在內(nèi)[1],所以軟件檢測(cè)是需要小技巧的,作者使用異或XOR技術(shù)解決了該問題。串口編程有多種方法:①Windows API函數(shù);②OCX控件形式編程;③串行卡設(shè)備廠家提供的動(dòng)態(tài)鏈接庫,比如MOXA庫函數(shù);④Delphi或者C++builder下的vcl組件形式,比如comport、nrcomm和TMS串行口控件等等[2]。
無論采用什么形式,作為中斷檢測(cè)時(shí)全是檢查Modem狀態(tài)變化。首先將硬件時(shí)碼器的RS-232C形式的硬件信號(hào)接入某COM口,例如COM1,下面給出使用MOXA庫函數(shù)形式的檢查CTS和DSR狀態(tài)變化的關(guān)鍵代碼段:
第二種引入中斷的形式是TTL電平形式,由某一硬件設(shè)備(一般為B碼時(shí)統(tǒng)設(shè)備)輸出TTL電平信號(hào),在計(jì)算機(jī)一端使用帶有中斷控制功能的I/O卡檢測(cè)中斷。該類檢測(cè)方法與商用板卡有關(guān),比如研華的PCI1751卡等I/O卡就具備該功能。
研華公司的PCI-1751卡為48路I/O卡,支持兩路中斷接入功能,不提供中斷硬件辨識(shí)功能,需要軟件開發(fā)者想辦法判斷到底是哪路中斷。例如時(shí)碼器提供了50PPS和1PPS兩種形式的中斷,軟件檢測(cè)時(shí)應(yīng)提供辨識(shí)代碼,50PPS信號(hào)作為監(jiān)控軟件同步中斷使用,1PPS信號(hào)提供每秒的校時(shí)中斷使用,作者使用在中斷線程中檢查不同端口狀態(tài)變化的方法給出了辨識(shí)方法。
下為Delphi檢測(cè)中斷的關(guān)鍵代碼段,中斷線程省略[3]。
以下加判斷語句。
中斷服務(wù)程序要求編寫的盡量簡(jiǎn)捷,主要功能就是檢查中斷到來否,中斷服務(wù)程序一旦檢測(cè)到中斷,需要有一種通知機(jī)制去告知其他工作線程去工作。采用事件通知機(jī)制是最快捷的方式[4]。作者測(cè)試了事件通知到另一個(gè)線程的時(shí)刻,是微秒級(jí)別的,幾乎不影響毫秒級(jí)的調(diào)度,Windows下中斷線程流程圖如圖1所示。
圖1 中斷線程流程圖
中斷服務(wù)程序一旦檢查到中斷,即通知工作線程去工作,通知為內(nèi)核對(duì)象Event,工作線程開始工作后,一直在等待該通知事件對(duì)象,一旦等到,立即復(fù)位該事件對(duì)象到無信號(hào)狀態(tài),再等待下一次事件到有信號(hào)狀態(tài),注意這個(gè)事件的有信號(hào)狀態(tài)為中斷線程中設(shè)置的,這樣,中斷線程只負(fù)責(zé)檢查中斷到來否則,一旦到來,置通知事件有信號(hào),中斷線程又轉(zhuǎn)到下一次的中斷檢查開始處;工作線程就是你的監(jiān)控程序的控制流線程,一直等中斷線程的通知事件,如果等到該事件有信號(hào),表示通知已經(jīng)到達(dá),則轉(zhuǎn)入自己的正式工作,正式工作在監(jiān)控程序中表現(xiàn)的就是你的各種數(shù)據(jù)處理函數(shù),控制函數(shù)等等,各種業(yè)務(wù)邏輯的該類函數(shù)是各異的,但核心的工作線程機(jī)制是相同的[5],為作者團(tuán)隊(duì)將工作線程改為中斷測(cè)試線程的流程圖,將中斷測(cè)試的代碼段放置該線程的不同的地方就可以做不同的測(cè)試了,如圖2所示。
圖2 工作線程流程圖
編寫好中斷服務(wù)線程和主工作線程后,下面就要求做嚴(yán)格的中斷服務(wù)程序的測(cè)試,這不同與Windows下一般的程序,時(shí)間要求不太嚴(yán)格差一點(diǎn)無所謂,軍用系統(tǒng)要求非常嚴(yán)格。
試驗(yàn)環(huán)境:一臺(tái)雙核工控機(jī),帶4個(gè)PCI插槽,軟件環(huán)境為Windows xp sp3,準(zhǔn)備已經(jīng)計(jì)量過的三用表,示波器,一臺(tái)有硬件組專門設(shè)計(jì)的可通過跳線設(shè)置的各種時(shí)序的時(shí)碼器,該試驗(yàn)中斷程序使用delphi和C++Builder編程,在中斷線程和工作線程內(nèi)輸出DO信號(hào),使用硬件方法(示波器)檢查中斷線程或者工作線程是否正常。
通過在中斷線程和工作線程中不同地方輸出DIO信號(hào),在示波器一端觀察并記錄這些輸出,即可測(cè)出你欲測(cè)試的時(shí)序是否正常。當(dāng)中斷程序執(zhí)行時(shí),在Windows環(huán)境下此時(shí)加載大內(nèi)存程序,例如Word、Excel、開發(fā)工具C++Builder或者其他程序。極小化窗口,拖動(dòng)窗口等動(dòng)作,觀察示波器一端波形是否變化,即可判斷出你的中斷服務(wù)是否正常(干擾信號(hào))。如果示波器輸出不受上述操作影響。說明你接入的中斷信號(hào)在你設(shè)計(jì)的服務(wù)程序中可使用。如果受影響,說明該中斷服務(wù)軟件不可用。然后不斷變換輸入時(shí)序信號(hào),從50 ms開始,每隔10 ms接入中斷信號(hào),直到1 ms級(jí)的試驗(yàn)。從10 ms級(jí)以下每隔1 ms做一次試驗(yàn),重復(fù)以上試驗(yàn)步驟,觀察你的輸出受影響否。作者帶領(lǐng)的團(tuán)隊(duì)成員編制了這一試驗(yàn)專用程序,使用DelphiC++Builder兩種語言比較得到了多組結(jié)果,這2種語言開發(fā)的程序?qū)χ袛嗟臏y(cè)試結(jié)果差別很小。
下面介紹幾組試驗(yàn)方法:
①中斷線程中交替輸出DIO為1或者0,可以在示波器一端測(cè)試出中斷是否嚴(yán)格按時(shí)序出現(xiàn);
②中斷線程中輸出DIO為1,工作線程中輸出DIO為0,可以測(cè)出工作線程中等待事件的調(diào)度時(shí)間。(Windows API的WaitForSingleObject函數(shù)[6]);
③中斷線程中不輸出DIO,只在工作線程中交替輸出1或者0,可以測(cè)試出你設(shè)計(jì)的中斷服務(wù)工作后,主工作線程是否按嚴(yán)格時(shí)序執(zhí)行任務(wù);
④中斷線程中插幾句Windows API函數(shù),在插入前后分別輸出1或者0,可以測(cè)出Windows API化費(fèi)的時(shí)間;
⑤在中斷線程中上下兩句程序中交替輸出1或者0,可以測(cè)出DIO輸出的快慢;
⑥在工作線程的你的控制函數(shù)前后分別輸出DIO的1或者0,可以測(cè)出你的執(zhí)行主工作函數(shù)所花費(fèi)的時(shí)間,等等。
有些讀者可能質(zhì)疑為什么不使用高性能計(jì)數(shù)器呢[7],因?yàn)樵跍y(cè)試時(shí)要加入干擾,比如拖動(dòng)窗口等等,只有硬件級(jí)的測(cè)試才是最令人信服的,示波器可以捕獲到如何微小的變化。課題組做了從50 ms直至1 ms級(jí)的信號(hào)接入測(cè)試,設(shè)計(jì)的中斷服務(wù)可以工作在兩毫秒級(jí)別上都不受干擾影響,這已經(jīng)大大超出了原工程科研項(xiàng)目的要求。
在做這些中斷試驗(yàn)中,作者另外也做了相關(guān)的其他輔助試驗(yàn),例如以下一些試驗(yàn)也頗有意義[8]:Windows多媒體時(shí)鐘、毫秒級(jí)精確度測(cè)試、Windows線程級(jí)時(shí)鐘及毫秒級(jí)精確度測(cè)試;其他由Delphi組件開發(fā)的時(shí)鐘精確度測(cè)試;Windows消息(用戶消息從發(fā)到收)耗時(shí)測(cè)試;Windows高性能計(jì)數(shù)器精確度測(cè)試;Windows線程級(jí)調(diào)度測(cè)試(從A線程設(shè)置事件,到B線程等到事件所花費(fèi)的時(shí)間),這些測(cè)試全在硬件DIO卡上完成;
課題組經(jīng)測(cè)試:Windows多媒體時(shí)鐘可以達(dá)到1 ms級(jí)精確度,高性能計(jì)數(shù)器也可以達(dá)到毫秒級(jí)精確度。線程時(shí)鐘及其他幾個(gè)Delphi組件時(shí)鐘受窗口移動(dòng)影響[9]。通過測(cè)試發(fā)現(xiàn)Windows線程中使用Event對(duì)象同步是非??斓模谖⒚罴?jí)。消息調(diào)度是不可靠的,受窗口操作影響,Windows定時(shí)器消息在實(shí)時(shí)監(jiān)控程序中不可做為中斷使用的,離要求差的太遠(yuǎn)。
在軍用的實(shí)時(shí)控制項(xiàng)目中,使用硬件中斷接入是最保險(xiǎn)的手段,雖然Windows多媒體時(shí)鐘可達(dá)到1 ms級(jí)精確度,但不可作為中斷使用,因?yàn)闊o法同其他時(shí)鐘設(shè)備同步。硬件信號(hào)可以提供的非??欤鳛橹袛喾?wù)使用時(shí)一定要檢測(cè)軟件系統(tǒng)是否受影響。通過以上各種測(cè)試程序檢測(cè),作者團(tuán)隊(duì)接入的信號(hào)中斷方式工作在2 ms級(jí)不受其他操作干擾影響,已經(jīng)超出原設(shè)計(jì)目標(biāo),希望該文對(duì)廣大讀者有益。
[1]趙蘭濤,蘇彥華.DELPHI串口通信技術(shù)與工程實(shí)踐[M].北京:人民郵電出版社,2004.
[2]潭燕,趙磊,李之明.Delphi高級(jí)輔助工具精解[M].北京:中國鐵道出版社,2003.
[3]JEFFREY J,CHRISTOPHE N.Windows核心編程[M].葛子昂,周靖,廖敏,譯.北京:清華大學(xué)出版社,2008.
[4]范文慶,周彬彬,安靖.精通Windows API--函數(shù)接口編程實(shí)例[M].北京:人民郵電出版社,2009.
[5]飛思科技產(chǎn)品研發(fā)中心.Delphi下深入Windows核心編程[M].北京:電子出版社,2003.
[6]李存賓,汪兵.Delphi深度編程及其項(xiàng)目應(yīng)用開發(fā)[M].北京:中國水利水電出版社,2003.
[7]RICHTER J.Windows高級(jí)編程指南[M].王書洪,劉光明,譯.北京:清華大學(xué)出版社,1999.
[8]張龍卿.Delphi 6深入編程技術(shù)[M].北京:希望電子出版社, 2002.
[9]明日科技.Delphi組件參考大全[M].北京:人民郵電出版社, 2006.
Introducing Method of Hardware Interruption and Depth Performance Test of Interruption
CAI Wen-zhai
(The 39th Research Institute of CETC,Xi'an Shaanxi 710065,China)
This paper discusses the generation method of hardware interruption in Windows operation system.The designed interruption service procedure is tested in various time sequences by using hardware DIO output card,and the interference test is carried out when interruption service works in Windows system.Multiple test methods within the interruption threads and work threads are proposed,the required time of implementing the relevant code segment by kernel level scheduling in Windows system is studied intensively,the accuracy of multiple timers is tested,and the interruption service procedure is designed for engineering purpose.
interruption;timer;performance test;thread;event
TP39
A
1008-1739(2014)23-54-4
定稿日期:2014-11-12
計(jì)算機(jī)與網(wǎng)絡(luò)2014年23期