關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > Windows 中斷程序設計

        Windows 中斷程序設計

        作者: 時間:2012-10-19 來源:網絡 收藏

        掛住/解掛向量的時機很重要。主窗口第一次被創建時會傳送它WM-CREATE消息,這時是掛住向量的最好時機。退出時需解掛向量,否則可能崩潰。主窗口接收到WM-DE-STROY之后進行解掛工作,是最適合的。解掛向量可先用INT35H,0204H功能將老的向量保存,退出時用INT35H,0205H恢復。

        五、編程實現

        有了DPMI的支持,我們就可以很方便地處理數據采集、串行通信等工業過程中的實時事件。下面以3.1平臺下中斷方式實現的串行通信為例,說明中斷程序的編制和實現。為便于參考,給出了詳細的代碼。開發平臺BC3.1/BC4.5,其本身支持0.9版的DPMI,無需運行其它支持DPMI的軟件。編程語言C,可與C++混合編譯。

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

        //windows asy communication

        //by Li Xiuming

        //last modified on June 25,1996

        #include〈windows.h〉

        #include〈dos.h〉

        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()

        { //串口1初使化

        s8259=inportb(0x21); //讀入8259當前狀態并保存

        outportb(0x21,s82590xe8); //初始化8259,允許0x0c號中斷

        outportb(0x3fb,0x83);

        outportb(0x3f8,0x0c);

        outportb(0x3f9,0x00);

        outportb(0x3fb,0x03);

        outportb(0x3fc,0x08); //允許中斷信號送到8259A,以便能中斷

        outportb(0x3f9,0x01); //0x01,中斷允許

        return 1;

        }

        void interrupt far DataReceive()

        { //中斷接收子程序

        static int i=0; //靜態局部變量

        char rechar=0; //每中斷一次,i自動加1

        rechar=inportb(0x3f8); //從數據口讀出發送過來的數據

        if(inflag==0)

        {

        if(rechar!=?s? i==0) //幀起始

        {

        i=0;

        goto ll;

        }

        datacom-r[i++]=rechar; //存入datacom-r[](通信緩沖區)

        if(rechar==?e?) //幀結束

        {

        inflag=1;

        i=0;

        }

        }

        ll:outportb(0x20,0x20); //回送中斷結束標志

        }

        //調用DPMI

        //保存舊的0CH號保護模式中斷向量

        //設置新的保護模式中斷服務例程

        void InitCom(void)

        {

        asm{

        cli

        mov ax,204h

        mov bl,0ch

        int 31h

        sti

        }

        old-vector=MK-FP(-CX,-DX);//保存

        asm{ cli //設置新的0x0c中斷服務例程

        mov ax,205h

        mov bl,0ch

        mov cx,seg datareceive

        mov dx,offset datareceive

        int 31h

        sti

        }

        InitCom1();

        }

        //恢復8259狀態

        //恢復0CH保護模式向量

        void RestoreComm(void)

        {

        outportb(0x21,s8259);

        asm{

        cli

        mov ax,205h

        mov bl,0ch

        mov cx,seg old-vector

        mov dx,offset old-vector

        int 31h

        sti

        }

        }

        在窗口第一次被創建時會傳送它WM-CREATE消息,這時調用InitCom()即可。在主窗口關閉時,即主窗口中收到WM-DESTROY消息時,調用RestoreComm()恢復原來的狀態。

        這樣在對串口初始化,設置中斷服務例程后,通信事件發生時,會立即跳入中斷子程序中執行,越過系統的消息隊列,達到實時處理通信事件的目的。而數據處理模塊可通過全局標志flag訪問全局的數據通信緩沖區獲取實時數據。這種實現方式與基于消息機制的通信API實現相比具有實時性強的特點,因為它超過Windows系統的兩極消息機制。

        上述程序已在實際系統中得到應用。在Windows 3.1支持下,同時運行三個Windows任務:服務器SERVER(內有實時串行通信,多個網絡數據子服務),客戶CLIENT,FOXPRO數據庫系統。整個系統運行良好。切換到WIN95平臺下(支持0.9版DPMI),系統也運行良好。

        參考文獻

        1 張豫夫、曹建文譯.【澳】Barry Kauler著.Windows匯編語言及系統.北京大學出版社,1995

        2 趙人任等譯.【美】Mike Klein者.Windows程序員使用指南(一).北京:清華出版社,1995

        3 劉林、陳紅編譯.80386硬件與接口技術.北京:北京希望電腦公司,1991


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 青岛市| 大埔区| 伊春市| 肇源县| 遵化市| 曲阜市| 门头沟区| 文昌市| 濮阳县| 普兰县| 泽库县| 定结县| 东源县| 章丘市| 莱阳市| 陆河县| 淳化县| 徐闻县| 济阳县| 农安县| 喀什市| 云龙县| 萝北县| 盈江县| 镇沅| 高唐县| 禄劝| 宁都县| 得荣县| 津南区| 洪江市| 龙里县| 宕昌县| 滦平县| 大余县| 随州市| 安顺市| 阳朔县| 婺源县| 潜江市| 嘉祥县|