蔡文齋
(中國電子科技集團公司第三十九研究所陜西西安 710065)
硬件中斷引入方法及中斷深度性能測試
蔡文齋
(中國電子科技集團公司第三十九研究所陜西西安 710065)
討論了Windows操作系統下硬件中斷產生的方法,使用硬件DIO輸出卡對設計的中斷服務程序作了多種時序下試驗,做了Windows系統下中斷服務工作時的干擾試驗,在中斷線程和工作線程內部提出了多種試驗方法,深入研究了Windows系統下的內核級調度執行相關代碼段所需的時間,測試了多種時鐘的精確度,設計了工程實用的中斷服務程序。
中斷 定時器 性能測試 線程 事件
某項目要求開發一套高分辨率天線監控系統,工作時序為10 ms級。設計一套硬件中斷策略,使控制系統嚴格按時序執行任務,在設計及開發這一系統時,進一步測試是否可以設計出更快的硬件中斷,做為未來更快時序下實時控制系統監控軟件使用。
Windows系統下硬件中斷一般使用2種方式引入,一種方式為RS-232電平形式,另一種使用TTL電平形式。串口形式下實際是采用Modem狀態變化來檢查中斷信號,TTL電平形式使用I/O卡檢查中斷信號。串口形式下的硬件中斷在軟件系統中使用串口的Modem狀態檢測編程,檢測狀態變化,注意從低電平變到高電平或者從高電平變到低電平全要計算在內[1],所以軟件檢測是需要小技巧的,作者使用異或XOR技術解決了該問題。串口編程有多種方法:①Windows API函數;②OCX控件形式編程;③串行卡設備廠家提供的動態鏈接庫,比如MOXA庫函數;④Delphi或者C++builder下的vcl組件形式,比如comport、nrcomm和TMS串行口控件等等[2]。
無論采用什么形式,作為中斷檢測時全是檢查Modem狀態變化。首先將硬件時碼器的RS-232C形式的硬件信號接入某COM口,例如COM1,下面給出使用MOXA庫函數形式的檢查CTS和DSR狀態變化的關鍵代碼段:

第二種引入中斷的形式是TTL電平形式,由某一硬件設備(一般為B碼時統設備)輸出TTL電平信號,在計算機一端使用帶有中斷控制功能的I/O卡檢測中斷。該類檢測方法與商用板卡有關,比如研華的PCI1751卡等I/O卡就具備該功能。
研華公司的PCI-1751卡為48路I/O卡,支持兩路中斷接入功能,不提供中斷硬件辨識功能,需要軟件開發者想辦法判斷到底是哪路中斷。例如時碼器提供了50PPS和1PPS兩種形式的中斷,軟件檢測時應提供辨識代碼,50PPS信號作為監控軟件同步中斷使用,1PPS信號提供每秒的校時中斷使用,作者使用在中斷線程中檢查不同端口狀態變化的方法給出了辨識方法。
下為Delphi檢測中斷的關鍵代碼段,中斷線程省略[3]。

以下加判斷語句。
中斷服務程序要求編寫的盡量簡捷,主要功能就是檢查中斷到來否,中斷服務程序一旦檢測到中斷,需要有一種通知機制去告知其他工作線程去工作。采用事件通知機制是最快捷的方式[4]。作者測試了事件通知到另一個線程的時刻,是微秒級別的,幾乎不影響毫秒級的調度,Windows下中斷線程流程圖如圖1所示。

圖1 中斷線程流程圖
中斷服務程序一旦檢查到中斷,即通知工作線程去工作,通知為內核對象Event,工作線程開始工作后,一直在等待該通知事件對象,一旦等到,立即復位該事件對象到無信號狀態,再等待下一次事件到有信號狀態,注意這個事件的有信號狀態為中斷線程中設置的,這樣,中斷線程只負責檢查中斷到來否則,一旦到來,置通知事件有信號,中斷線程又轉到下一次的中斷檢查開始處;工作線程就是你的監控程序的控制流線程,一直等中斷線程的通知事件,如果等到該事件有信號,表示通知已經到達,則轉入自己的正式工作,正式工作在監控程序中表現的就是你的各種數據處理函數,控制函數等等,各種業務邏輯的該類函數是各異的,但核心的工作線程機制是相同的[5],為作者團隊將工作線程改為中斷測試線程的流程圖,將中斷測試的代碼段放置該線程的不同的地方就可以做不同的測試了,如圖2所示。

圖2 工作線程流程圖
編寫好中斷服務線程和主工作線程后,下面就要求做嚴格的中斷服務程序的測試,這不同與Windows下一般的程序,時間要求不太嚴格差一點無所謂,軍用系統要求非常嚴格。
試驗環境:一臺雙核工控機,帶4個PCI插槽,軟件環境為Windows xp sp3,準備已經計量過的三用表,示波器,一臺有硬件組專門設計的可通過跳線設置的各種時序的時碼器,該試驗中斷程序使用delphi和C++Builder編程,在中斷線程和工作線程內輸出DO信號,使用硬件方法(示波器)檢查中斷線程或者工作線程是否正常。
通過在中斷線程和工作線程中不同地方輸出DIO信號,在示波器一端觀察并記錄這些輸出,即可測出你欲測試的時序是否正常。當中斷程序執行時,在Windows環境下此時加載大內存程序,例如Word、Excel、開發工具C++Builder或者其他程序。極小化窗口,拖動窗口等動作,觀察示波器一端波形是否變化,即可判斷出你的中斷服務是否正常(干擾信號)。如果示波器輸出不受上述操作影響。說明你接入的中斷信號在你設計的服務程序中可使用。如果受影響,說明該中斷服務軟件不可用。然后不斷變換輸入時序信號,從50 ms開始,每隔10 ms接入中斷信號,直到1 ms級的試驗。從10 ms級以下每隔1 ms做一次試驗,重復以上試驗步驟,觀察你的輸出受影響否。作者帶領的團隊成員編制了這一試驗專用程序,使用DelphiC++Builder兩種語言比較得到了多組結果,這2種語言開發的程序對中斷的測試結果差別很小。
下面介紹幾組試驗方法:
①中斷線程中交替輸出DIO為1或者0,可以在示波器一端測試出中斷是否嚴格按時序出現;
②中斷線程中輸出DIO為1,工作線程中輸出DIO為0,可以測出工作線程中等待事件的調度時間。(Windows API的WaitForSingleObject函數[6]);
③中斷線程中不輸出DIO,只在工作線程中交替輸出1或者0,可以測試出你設計的中斷服務工作后,主工作線程是否按嚴格時序執行任務;
④中斷線程中插幾句Windows API函數,在插入前后分別輸出1或者0,可以測出Windows API化費的時間;
⑤在中斷線程中上下兩句程序中交替輸出1或者0,可以測出DIO輸出的快慢;
⑥在工作線程的你的控制函數前后分別輸出DIO的1或者0,可以測出你的執行主工作函數所花費的時間,等等。
有些讀者可能質疑為什么不使用高性能計數器呢[7],因為在測試時要加入干擾,比如拖動窗口等等,只有硬件級的測試才是最令人信服的,示波器可以捕獲到如何微小的變化。課題組做了從50 ms直至1 ms級的信號接入測試,設計的中斷服務可以工作在兩毫秒級別上都不受干擾影響,這已經大大超出了原工程科研項目的要求。
在做這些中斷試驗中,作者另外也做了相關的其他輔助試驗,例如以下一些試驗也頗有意義[8]:Windows多媒體時鐘、毫秒級精確度測試、Windows線程級時鐘及毫秒級精確度測試;其他由Delphi組件開發的時鐘精確度測試;Windows消息(用戶消息從發到收)耗時測試;Windows高性能計數器精確度測試;Windows線程級調度測試(從A線程設置事件,到B線程等到事件所花費的時間),這些測試全在硬件DIO卡上完成;
課題組經測試:Windows多媒體時鐘可以達到1 ms級精確度,高性能計數器也可以達到毫秒級精確度。線程時鐘及其他幾個Delphi組件時鐘受窗口移動影響[9]。通過測試發現Windows線程中使用Event對象同步是非常快的,在微妙級。消息調度是不可靠的,受窗口操作影響,Windows定時器消息在實時監控程序中不可做為中斷使用的,離要求差的太遠。
在軍用的實時控制項目中,使用硬件中斷接入是最保險的手段,雖然Windows多媒體時鐘可達到1 ms級精確度,但不可作為中斷使用,因為無法同其他時鐘設備同步。硬件信號可以提供的非常快,但作為中斷服務使用時一定要檢測軟件系統是否受影響。通過以上各種測試程序檢測,作者團隊接入的信號中斷方式工作在2 ms級不受其他操作干擾影響,已經超出原設計目標,希望該文對廣大讀者有益。
[1]趙蘭濤,蘇彥華.DELPHI串口通信技術與工程實踐[M].北京:人民郵電出版社,2004.
[2]潭燕,趙磊,李之明.Delphi高級輔助工具精解[M].北京:中國鐵道出版社,2003.
[3]JEFFREY J,CHRISTOPHE N.Windows核心編程[M].葛子昂,周靖,廖敏,譯.北京:清華大學出版社,2008.
[4]范文慶,周彬彬,安靖.精通Windows API--函數接口編程實例[M].北京:人民郵電出版社,2009.
[5]飛思科技產品研發中心.Delphi下深入Windows核心編程[M].北京:電子出版社,2003.
[6]李存賓,汪兵.Delphi深度編程及其項目應用開發[M].北京:中國水利水電出版社,2003.
[7]RICHTER J.Windows高級編程指南[M].王書洪,劉光明,譯.北京:清華大學出版社,1999.
[8]張龍卿.Delphi 6深入編程技術[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