Windows中斷程式設計

2021-06-21 05:49:08 字數 4291 閱讀 1752

一、前  言

windows提供強大的功能以及友好的圖形使用者介面(gui),使得它不僅廣泛的用作管理事務型工作的支援平台,也被工業領域的工程人員所關注。但windows3.1並非基於優先順序來排程任務,無法立即響應外部事件中斷,也就不能滿足工業應用環境中實時事件處理和實時控制應用的要求。因此,如何在windows環境中處理外部實時事件一直是技術人員尤其是實時領域工程人員所關注的問題。目前已有的方法大都採用內掛實時多工核心的方式,如windows的實時控制軟體包flx等,而irmx實時作業系統則把windows3.1當作它的乙個任務來執行。對於大型的工程專案,開發人員可採用購買實時軟體然後整合方式。對中小專案,從投資上考慮就不很經濟。如何尋找一種簡明的方法來處理外部實時事件依然顯得很必要。

本文首先闡述windows的訊息機制及中斷機制,然後結合dpmi介面,給出一種保護模式下中斷程式的設計方法,以處理外部實時事件。經實際執行結果表明,該方法具有簡潔、實用、可靠的特點,並同樣可執行於win95。

二、windows的訊息機制

windows是一訊息驅動式系統,。 windows訊息提供了應用程式與應用程式之間、應用程式與windows系統之間進行通訊的於段。應用程式要實現的功能由訊息來觸發,並靠對訊息的響應和處理來完成。

windows系統中有兩種訊息佇列,一種是系統訊息佇列,另一種是應用程式訊息佇列。計算機的所有輸入裝置由 windows監控,當乙個事件發生時,windows先將輸入的訊息放入系統訊息佇列中,然後再將輸入的訊息拷貝到相應的應用程式佇列中」應用程式中的訊息迴圈從它的訊息佇列中檢索每乙個訊息並傳送給相應的視窗函式中。乙個事件的發生,到達處理它的視窗函式必須經歷上述過程。值得注意的是訊息的非搶先性,即不論事件的急與緩,總是按到達的先後排隊(一些系統訊息除外),這就使得一些外部實時事件可能得不到及時的處理。

三、windows的保護模式及中斷機制

1.windows的保護模式

保護模式指的是線性位址由乙個選擇符間接生成的,該選擇符指向描述表中的某一項;而實模式中則通過乙個段/偏移量對來直接定址。80386(486) cpu提儀的保護模式能力包括乙個64k的虛擬位址空間和乙個4g的段尺寸。windows3.1實現時有所差別,它支援標準模式和增強模式。標準模式針對286機器,不周本文**範圍。增強模式是對386以上cpu而言,windows正是使用保護模式來打破lm的屏障並且執行簡單的記憶體保護。它使用選擇器、描述器和描述器表控制訪問指定記憶體的位置和段。描述器表包括全域性描述器表區域性描述器表、中斷描述器表。保護模式與實模式有許多不同。其中顯著的差異是訪問記憶體的機制不同。

2.中斷機制

(1)實模式中斷

為了便於理解,我們先回顧實模式中斷。

在實模式下,中斷向量表ivt起到相當重要的作用。無論來自外部硬體的中斷或是內部的軟中斷intn,在cpu中都產生同樣的響應。

①cpu將當前的指令指標暫存器(ip)、**段暫存器(cs)、標誌暫存器壓入堆疊。

②然後cpu使用 n值作為指向中斷向量表ivt的索引,在ivt中找出服務例程的遠位址。

②cpu將此遠地垃裝入cs:ip暫存器中,並開始執行服務例程。

④中斷例程總以iret指令結束。此指令使存在堆疊中的三個值彈出並填入cs、ip和標誌暫存器,cpu繼續執行原來的指令。

(2)保護模式中斷

保護模式中斷過程與實模式中斷過程類似,但它不再使用中斷向量表ivt,而使用中斷描述符表(idt)。值得一提的是,windows執行時ivt還存在,應用程式並不使用它,windows仍然使用,但含義已不同『

(1)ivt結構:ivt在ram的 0000:0000之上,佔據開始的1024位元組。它仍然由 bios啟動例程設定,由dos填充到ram中。

②idt中斷描述符表:保護模式下,windows作業系統為實現中斷機制而建立的乙個特殊表,即中斷描述符表idt。該錶被用來儲存中斷服務例程的線性位址,它們是真正的24位或32位位址,沒有段:偏移值結構。中斷描述器表最多可含有256個例

程說明,詳細說明請見[3]。 idt結構見圖2。

②當中斷或異常發生時,處理過程與實模式類丁當前的cs; ip值和標誌暫存器值被儲存。儲存的內容還包括cpu其他內部暫存器的值,以及目

前正在被執行的任務的有關資訊(若必須發生任務切換的話)。cpu設法獲取中斷向量後,以它為索引值查詢idt中的服務例程遠位址,接著將控制轉移到該處的服務例程。這是與實模式轉移到ivt的不同所在。保護模式使用idtr暫存器分配和定位記憶體中的idt中斷描述符表。idt在記憶體中是可移動的,與ivt固定在記憶體中剛好相反。 idt中斷描述符表在 windows中起決定性的作用。理解了windows保護模式的中斷機制。有助於我們理解中斷服務程式的設計,它的關鍵就在於如何將服務例程的位址放入idt中斷描述符表中。當中斷發生時,如何將斷點位址及cpu各暫存器值保護起來,中斷結束時,如何將保護的值恢復。 windows系統本身並不提供實現上述功能的api,而dos保護模式介面dpmi正具備了上述的功能。

下面我們首先介紹dpmi介面,然後基於它實現windows下中斷服務程式的設計。

四、dos保護模式介面 dmpi  windows除了標準服務外,還支援一組特殊的dos服務,稱為dos保護模式介面 dpmi,由一些int2fh和int31h服務組成。它使應用程式能夠訪問 pc系列計算機的擴充記憶體,同時維護系統的保護功能。 dpmi通過軟體中斷31h來定義了乙個新的介面,使得保護模式的應用程式能夠用它作分配記憶體,修改描述符以及呼叫實模式軟體等工作。

windows為應用程式提供 dpmi服務。即windows是dpmi的宿主(host),應用程式是dpmi的客戶(client),可通過int31h呼叫得到dpmi服務。int 31h本身提供多功能。其中它的中斷管理服務允許保護模式用於攔截實模式中斷,並且掛住處理器異常。有些服務能夠和 dpmi宿主合作,以維護應用程式的虛擬中斷標誌。

ax=0205h,bl=中斷號,cx:(e)dx=中斷處理程式選擇符:偏移值。返回:執行成功cf=清零,執行失敗cf,置位。

掛住/解掛中斷向量的時機很重要。主視窗第一次被建立時會傳送它wm—create訊息,這時是掛住中斷向量的最好時機。退出時需解掛向量,否則windows可能崩潰。上視窗接收到wm_destroy之後進行解掛工作,是最適合的。解掛向量可先用int35h,0204h功能將老的中斷向量儲存,退出時用int35h,0205h恢復。

五、程式設計實現

有了dpmi的支援,我們就可以很方便地處理資料採集、序列通訊等工業過程中的實時事件。下面以windows3.1平台下中斷方式實現的序列通訊為例,說明中斷程式的編制和實現。為便於參考,給出了詳細的**。開發平台bc3.1/bc4.5,其本身支援0.9版的dpmi,無需執行其它支援dpmi的軟體。程式語言c,可與c++混合編譯。

初始化com1,9600波特率,每字元8bits,1個停止位,中斷接收,查詢傳送。

//windows asy communica60n

//by li xiumi98

//last modified on june25,1996

#include

#include

void interrupt far datareceive() ;

void interrupt far( * old_vector)();

unsigned char datacom_r[1024],datacom_s[1024]:

int inflag=0 ;

unsigned int s8259;

int initcom1()

void interrupt far datareceive()

datacom_r[i++]=rechar;

if(rechar=='e') }

l1:outportb(0x20,0x20);

} void initcom(void)

old_vector=mk_fp(_cx,_dx);

asm

initcom();

} void restore_comm(void) }

在視窗第一次被建立時會傳送它wm_create訊息,這時呼叫initcom()即可。在主視窗關閉時,即主視窗中收到 wm_destroy訊息時,呼叫restore comm()恢復原來的狀態。

這樣在對串列埠初始化,設定中斷服務例程後,通訊事件發生時,會立即跳入中斷子程式中執行,越過系統的訊息佇列,達到實時處理通訊事件的目的。而資料處理模組可通過全域性標誌f1,8訪問全域性的資料通訊緩衝區獲取實時資料。這種實現方式與基於訊息機制的windows通訊api實現相比具有實時性強的的特點,因為它超過了windows 系統的兩極訊息機制,上述程式已在實際系統中得到應用。在windows3.1支援下同時執行

三個windows任務,伺服器server(內有實時序列通訊,多個網路資料子服務,),客戶client,foxpro資料庫系統。整個系統執行良好。切換到win95平台下,系統也執行良好 。

中斷 中斷程式設計例項

核心模組程式設計之入門 三 模組實用程式簡介 核心模組程式設計之高階 五 授人以漁 在此,我們將編寫乙個模組,其中有乙個中斷函式,當核心接收到某個 irq 上的乙個中斷時會呼叫它。先給出全部 讀者自己除錯,把對該程式的理解跟到本貼後面。include include include static i...

驅動中斷程式設計

1.編寫乙個外部中斷 1.獲取外部中斷編號 int gpio to irq unsigned int gpio 功能 通過io口編號轉換成對應的外部中斷編號 引數 gpio 要獲取的io口編號 返回值 成功 中斷編號 失敗 einval 2.註冊中斷函式 int request irq unsign...

Windows程式設計

1.選單項訊息響應,處理訊息的函式為wndproc windowproc 2.windows 資料型別bool 值為true或false byte 為8位位元組 char 為8位字元 dword 為32位無符號整數,unsigned long word 位16位無符號整數 handle 指向物件的控...