1 前言
近年來(lái),在Windows 95 平臺(tái)上進(jìn)行數(shù)控軟件的開(kāi)發(fā)是數(shù)控產(chǎn)品更新的標(biāo)志和趨勢(shì)。利用Windows 95 豐富的資源,可方便地生成各種菜單及數(shù)控指令編輯軟件等,產(chǎn)品的開(kāi)發(fā)周期短。而且,利用Windows 95 是多任務(wù)操作系統(tǒng)的特性,在保證前臺(tái)加工任務(wù)準(zhǔn)確按時(shí)完成的情況下,還可執(zhí)行在線監(jiān)測(cè)、故障診斷等任務(wù),充分發(fā)揮主機(jī)的性能。 目前,國(guó)內(nèi)數(shù)控電火花成形機(jī)控制軟件的操作平臺(tái)一般采用DOS 系統(tǒng)或 16 位的Windows 3.X系統(tǒng),而國(guó)外如阿奇公司等已采用 Windows 95系統(tǒng)作為其控制軟件平臺(tái),使軟件的數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)等功能得到很大的提高,用戶使用效果很好。另外,基于 Windows 95 的 CAD/CAM 軟件及其他工具軟件很多,為了增強(qiáng)控制軟件的功能,在 Windows 95 平臺(tái)上開(kāi)發(fā)電火花數(shù)控系統(tǒng)控制軟件是很有必要的。 事實(shí)上,在電火花數(shù)控系統(tǒng)的開(kāi)發(fā)中,常需實(shí)時(shí)采集一些狀態(tài)信息,通過(guò)接口板將信號(hào)傳送給主機(jī),主機(jī)則通過(guò)中斷方式接受數(shù)據(jù)來(lái)實(shí)現(xiàn)實(shí)時(shí)的測(cè)量和控制。而 Windows 95 是消息驅(qū)動(dòng)的多任務(wù)環(huán)境,各種消息都按它們到達(dá)的先后順序排隊(duì)處理,消息機(jī)制是不分任務(wù)輕重緩急的,若無(wú)中斷設(shè)置,僅憑消息機(jī)制,不能保證數(shù)控前臺(tái)控制任務(wù)在準(zhǔn)確的時(shí)間內(nèi)執(zhí)行。因此,要想解決這個(gè)問(wèn)題,必須實(shí)現(xiàn) Windows 95 的中斷處理。
2 Windows 95的中斷原理與實(shí)現(xiàn)
關(guān)于 DOS 和 16 位的Windows 3.X 的中斷原 理和機(jī)制方面介紹的資料很多,實(shí)現(xiàn)起來(lái)相對(duì)容易,不再贅述。這里著重闡述Windows 95 的中斷原理,并簡(jiǎn)要介紹其實(shí)現(xiàn)方法。 眾所周知,Intel 的 80X86CPU 系列芯片規(guī)定了0、1、2和3四個(gè)級(jí)別的執(zhí)行代碼可信度(即ring 0~3級(jí)),Windows 95 中只用到了0級(jí)和3級(jí)。執(zhí)行ring 0級(jí)的代碼,可直接對(duì)硬件、中斷和文件系統(tǒng)進(jìn)行物理訪問(wèn),僅有操作系統(tǒng)及其部件被允許在 ring 0 級(jí)內(nèi)執(zhí)行。而應(yīng)用程序的代碼只在可信度最低的 ring 3 級(jí)內(nèi)執(zhí)行,其訪問(wèn)硬件和自身進(jìn)程空間以外的內(nèi)存能力受到限制。 通常,在 Windows 95 下可用兩種方法實(shí)現(xiàn)中斷,一種是編寫(xiě) DLL 程序,另一種是使用虛擬設(shè)備驅(qū)動(dòng)程序(VxD)。二者的區(qū)別在于:VxD 是作為操作系統(tǒng)的組件運(yùn)行于 ring 0級(jí)的,而DLL程序運(yùn)行于 ring 3級(jí)。事實(shí)上,VxD 也被認(rèn)為是一個(gè)32位保護(hù)模式下的可執(zhí)行 DLL。應(yīng)明確的是 VxD 運(yùn)行在虛擬機(jī)管理器 (VMM) 控制之下,VMM 是位于最底層的操作系統(tǒng)部件(VMM 包含了所有基本的系統(tǒng)功能,如任務(wù)調(diào)度、虛擬內(nèi)存操作、程序裝入及終止、任務(wù)間通訊等,此外,還負(fù)責(zé)處理主要的中斷及例外情況)。硬件設(shè)備在數(shù)據(jù)準(zhǔn)備好后就發(fā)中斷信號(hào),但 VxD 并不直接截獲這些中斷信號(hào),而是依賴于虛擬可編程中斷控制器 (VPICD) 來(lái)硬件中斷。 VPICD 可以將硬件中斷映射到其它設(shè)備,向其它設(shè)備提供服務(wù),通過(guò)這些服務(wù)允許虛擬設(shè)備請(qǐng)求中斷,并可在 VMM 中模擬硬件中斷信號(hào)。由于 Windows 95 系統(tǒng)多任務(wù)在硬件上就是通過(guò)硬件的虛擬化來(lái)實(shí)現(xiàn)的,利用這種方法來(lái)實(shí)現(xiàn)較高的定時(shí)精度符合 Windows 95 系統(tǒng)本身的原則,簡(jiǎn)單方便且有利于 Windows 95 系統(tǒng)的穩(wěn)定。見(jiàn)下圖。

VxD運(yùn)行過(guò)程圖
因此,目前在 Windows 95 系統(tǒng)下實(shí)現(xiàn)較高精度的實(shí)時(shí)控制,一般采用編寫(xiě)VxD 程序來(lái)實(shí)現(xiàn)。實(shí)現(xiàn)定時(shí)的方法如下: (1)采用 Windows 系統(tǒng)本身所提供的虛擬定時(shí)器的 API(VTDAPI)。應(yīng)用程序必須首先得到 VTDAPI的入口地址,再通過(guò)功能 VTDAPI-Begin-Int-Period 來(lái)設(shè)置中斷周期,最后可用功能 VTDAPI-Start-User-Timer 啟動(dòng)定時(shí)器,聲明一個(gè)將被周期調(diào)用的回調(diào)函數(shù)。需要指出的是 Windows 95 系統(tǒng)中可注冊(cè)32個(gè)這樣的定時(shí)器。 (2)采用虛擬定時(shí)器設(shè)備虛擬硬件定時(shí)器,提供別的虛擬設(shè)備用來(lái)建立時(shí)鐘的中斷率服務(wù)或捕獲一個(gè)給定的虛擬設(shè)備 I/O 端口的禁止或開(kāi)放。首先通過(guò)功能VTD-Begin-Min-Int-Period 設(shè)置系統(tǒng)中斷周期。然后可通過(guò)功能 VTD-Enable-Trapping 和 VTD-Disable-Trapping 來(lái)強(qiáng)迫定時(shí)設(shè)備禁止或開(kāi)放端口。通過(guò)功能 Set-VM-Time-Out 啟動(dòng)定時(shí)器,配合相應(yīng)函數(shù)完成所要求的實(shí)時(shí)控制任務(wù)。實(shí)際上,對(duì)于外部的物理中斷,同樣可采用這種方法。 為了說(shuō)明虛擬設(shè)備的中斷控制,首先介紹一個(gè)數(shù)據(jù)結(jié)構(gòu),定義如下: STRUCT VPICD-IRQ-Descriptor { WORD VID-IRQ-Number; ∥虛擬設(shè)備申請(qǐng)的 IRQ 數(shù) WORD VID-Options; ∥初始化為0 DWORD VID-Hw-Int-Proc; ∥用戶中斷處理程序的地址 DWORD VID-Virt-Int-Proc; ∥虛擬中斷處理程序地址 DWORD VID-EOI-Proc; ∥物理中斷結(jié)束后調(diào)用函數(shù)的地址 DWORD VID-Mask-Change-Proc; ∥中斷屏蔽地址 DWORD VID-IRET-Proc; ∥中斷請(qǐng)求地址 DWORD VID-IRET-Time-Out; ∥中斷請(qǐng)求的最大時(shí)間,500ms PVOID VID-Hw-Int-Ref; ∥用戶中斷參數(shù) }; 虛擬設(shè)備中斷控制的處理過(guò)程如下:首先,用戶通過(guò) CreateFile()函數(shù)裝載VxD,系統(tǒng)向 VxD 發(fā)送 DEVICE-DYNAMIC-INIT 消息,調(diào)用對(duì)應(yīng)的初始化程序。然后,執(zhí)行中斷處理程序,它的步驟是調(diào)用 VPICD-Pyhs-EOI 結(jié)束物理中斷,調(diào)用 VPICD-Set-Int-Request 設(shè)置虛擬中斷,進(jìn)行中斷處理,調(diào)用VPICD-Clear-Int-Request 清除虛擬中斷,調(diào)用VPICD-Virtual-EOI 結(jié)束虛擬中斷。當(dāng)用戶通過(guò) CloseHandle()函數(shù)卸載 VxD 時(shí),系統(tǒng)向 VxD 發(fā)送 DEVICE-DYNAMIC-EXIT 消息,控制處理程序調(diào)用對(duì)應(yīng)的退出處理程序。 了解了虛擬設(shè)備中斷控制過(guò)程的原理,就可方便地使用 VxD 實(shí)現(xiàn)中斷處理。目前,具有代表性的 VxD 開(kāi)發(fā)工具包括: Microsoft 公司出品的設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)包 DDK,該產(chǎn)品出現(xiàn)較早,使用的范圍也較廣,但要求開(kāi)發(fā)人員具備一定的匯編語(yǔ)言基礎(chǔ),工作量較大。Vireo Software 公司開(kāi)發(fā)的用于編寫(xiě)設(shè)備驅(qū)動(dòng)程序的工具包 VtoolsD,它包括一個(gè) VxD 代碼生成器 Quick VxD、可加載和卸載 VxD 的工具 VxDLoad,可給出系統(tǒng)已加載 VxD 信息的 VxDView,以及 ANSI C 運(yùn)行庫(kù)、VMM/VxD 服務(wù)庫(kù)、VxD 的 C++類(lèi)庫(kù)。VtoolsD 除了能工作在 Windows95 環(huán)境下,還具有很強(qiáng)的開(kāi)發(fā)能力及較高的開(kāi)發(fā)效率,是個(gè)相當(dāng)優(yōu)秀的軟件包。另外,KRFTech 公司出品的編寫(xiě)設(shè)備驅(qū)動(dòng)程序的工具包 WinDriver 也是一個(gè)不錯(cuò)的開(kāi)發(fā)工具,與 VtoolsD 一樣,可使編程人員用 C++語(yǔ)言來(lái)編寫(xiě)設(shè)備驅(qū)動(dòng)程序,而不是將大量精力放在編寫(xiě)那些復(fù)雜、難于調(diào)試的內(nèi)核模式代碼上,從而使用起來(lái)方便可靠。
3 VxD 在數(shù)控系統(tǒng)中的一個(gè)應(yīng)用
在我們研制開(kāi)發(fā)的電火花成形機(jī)數(shù)控系統(tǒng)中,對(duì)主軸的伺服控制要求很高,因此需要相當(dāng)高的實(shí)時(shí)性。采用 Windows 95 操作系統(tǒng)之后,必須解決實(shí)時(shí)性問(wèn)題,為此編制了 VxD 程序。限于篇幅,只能結(jié)合功能簡(jiǎn)單介紹一下其實(shí)現(xiàn)過(guò)程。 根據(jù)設(shè)計(jì)方案,采用 IRQ10 作為硬件中斷信號(hào),中斷源由外部硬件定時(shí)器提供,設(shè)定為 1ms。使用 VtoolsD 中 VxD 代碼生成器 Quick VxD 自動(dòng)生成一個(gè) VxD 框架。在其中添加自己的代碼,如硬件中斷處理函數(shù): VOID MyHwInt::OnHardwareInt(VMHANDLE hVM) { InterruptHandling(); ∥中斷處理函數(shù),包含了具體要實(shí)現(xiàn)的控制任務(wù) sendPhysicalEOI(); ClearCarry(); } VxD 程序動(dòng)態(tài)加載和卸載函數(shù): BOOL MyintDevice::OnSysDynamicDeviceInit() { pMyIRQ=new MyHwInt(); if(pMyIRQ&&pMyIRO->hook()){ pMyIRQ->physicalUnmask(); return TRUE; } else return FALSE; } BOOL MyintDevice::OnSysDynamicDeviceExit() { pMyIRQ->physicalMask(); delete pMyIRQ; return TRUE; } VxD 與主程序之間的通訊函數(shù): DWORD MyintDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams) {… switch(pDIOCParmas->dioc-IOCtlCode){ case 111: … break; default: break; } return 0; … } 等等。 通常情況下,源代碼直接用 VC++就可編譯通過(guò),生成需要的 VxD。如需要調(diào)試的話,采用 Numega Technologies 公司的 Soft/ICE for Windows 95 工具軟件來(lái)調(diào)試 VxD 相當(dāng)方便。 實(shí)踐證明,使用 VxD 之后,再結(jié)合一定的伺服策略,很好地解決了主軸的伺服控制問(wèn)題,加工精度得到可靠保證,而且系統(tǒng)的穩(wěn)定性也很好,經(jīng)長(zhǎng)時(shí)間考機(jī)后,沒(méi)出現(xiàn)任何異常。
4 實(shí)時(shí)控制應(yīng)用程序的發(fā)展趨勢(shì)
由于 Windows 系統(tǒng)的硬件不透明性,使得一般用戶要完成一定硬件操作具有較大的難度。鑒于 VxD 和 VMM 已成為 Windows 95 的系統(tǒng)核心,VxD 的設(shè)計(jì)業(yè)已成為實(shí)時(shí)控制應(yīng)用程序的關(guān)鍵技術(shù)。 另外,Microsoft 公司為了滿足工業(yè)上一些實(shí)時(shí)控制的要求,特別于 1999 年 6 月推出了實(shí)時(shí)操作系統(tǒng) Windows CE。 我們知道,對(duì)于一個(gè)實(shí)時(shí)操作系統(tǒng)來(lái)講,有三個(gè)關(guān)鍵的參數(shù),即中斷由操作系統(tǒng)和設(shè)備驅(qū)動(dòng)程序屏蔽的最大時(shí)間、設(shè)備驅(qū)動(dòng)程序處理中斷的最大時(shí)間和從中斷開(kāi)始到任務(wù)執(zhí)行的中斷延遲時(shí)間,Windows CE 系統(tǒng)中這三個(gè)參數(shù)限值的參考值均在微秒級(jí),這對(duì)于現(xiàn)在的一些控制要求基本能滿足。由此看來(lái),基于 Windows CE 系統(tǒng)的實(shí)時(shí)應(yīng)用程序的開(kāi)發(fā),將成為可能。 |