基于ISA總線(xiàn)與KH-9300的數據采集系統軟件設計
(1)編寫(xiě)中斷服務(wù)程序由于產(chǎn)生中斷時(shí),必須保留被中斷程序中斷時(shí)的一些現場(chǎng)數據,即保存斷點(diǎn),這些值都在寄存器中,以便恢復中斷時(shí)使這些值復原。以繼續執行原來(lái)被中斷的程序。 Turbo C為此提供一種新的函數類(lèi)型:inter-rupt,它將保存由該類(lèi)型函數所指寄存器的值,而在退出該函數時(shí),再復原這些寄存器的值,因而用戶(hù)的中斷服務(wù)程序必須定義成該類(lèi)型的函數,如中斷服務(wù)程序名為myp,則可將這個(gè)函數說(shuō)明為:
Void interrupt myp(unsigned bp,unsigned di,unsigned si,unsigned ds,unsigned es,unsigned dx,unsigned cx,unsignedbx,unsigned ax,unsiged ip,unsigned cs,unsigned flags)
小模式下程序只有1段,在中斷服務(wù)程序中用戶(hù)可像用無(wú)符號整數變量一樣使用這些寄存器。若中斷服務(wù)程序中不使用上述寄存器,則可不寫(xiě)這些寄存器參數,而寫(xiě)為:本文引用地址:http://dyxdggzs.com/article/195713.htm
對于硬件中斷,則在中斷服務(wù)程序結束前要將中斷結束命令字送至系統的中斷控制寄存器,其端口地址為0x20,中斷結束命令字也為0x20,即outportb(0x20,0x20)。
在中斷服務(wù)程序中,若不允許別的優(yōu)先級較高的中斷打斷它,則要禁止中斷,可用函數disable()來(lái)關(guān)閉中斷。若允許中斷,則可用開(kāi)中斷函數enable()來(lái)開(kāi)啟中斷。
(2)安裝中斷服務(wù)程序定義中斷服務(wù)程序后,還需將這個(gè)函數的人口地址填人中斷向量表中,以便產(chǎn)生中斷時(shí)程序能轉入中斷服務(wù)程序去執行。為防止正在改寫(xiě)中斷向量表時(shí),又產(chǎn)生別的中斷而導致程序混亂,可先關(guān)閉中斷,待改寫(xiě)完成后,再開(kāi)啟中斷。
其中faddr是中斷服務(wù)程序的入口地址,其函數名代表入口地址,而inum表示中斷類(lèi)型號,setvect()函數設置中斷向量,上述定義的install()函數將完成把中斷服務(wù)程序入口地址填入中斷向量inum中。
(3)中斷服務(wù)程序的激活對于硬件中斷,在相應的中斷請求線(xiàn)(IRQi,i=0,1,2,…,7)產(chǎn)生一個(gè)由低到高的中斷請求電平,這個(gè)過(guò)程必需由接口電路來(lái)實(shí)現,這個(gè)電平可用程序控制實(shí)現,如發(fā)命令outportb(端口地址,命令)。然后程序等待中斷,當中斷產(chǎn)生時(shí),便去執行中斷。
(4)恢復被修改的中斷向量為在主程序結束后,恢復原來(lái)的中斷向量以指向原中斷服務(wù)程序,在主程序開(kāi)始時(shí),存下原中斷向量的內容,用getvect()實(shí)現,如j=(char*)getvect(0x1c),這樣指針變量中將是0xlc中斷程序的入口地址,當主程序結束時(shí),可恢復原來(lái)的中斷服務(wù)入口地址,可用setvect(0x1c,i),也可用install()函數再次安裝。
4 程序設計
4.1 程序說(shuō)明
程序主要分為主程序和中斷處理子程序2部分。其中主要程序是采用 I/O接口的輸入輸出函數進(jìn)行初始化。包括設置KH-9300定時(shí)計數器8254和中斷控制器8259的工作方式、初值、開(kāi)中斷、觸發(fā)方式,對計算機的 8259開(kāi)中斷等。在主程序的最后把采集的通道數據寫(xiě)入文件。而中斷處理子程序是由CPU在每次接到IRQ5中斷請求信號后立即執行,主要作用是把KH- 9300卡的第2、3、4、5號通道的計數值采集到程序的變量中。主程序和中斷處理子的程序流程分別如圖1、圖2所示。
4.2 編程注意事項
(1)不要用任何DOS功能調用,避免DOS重入。盡量避免使用與屏幕相關(guān)、檢查狀態(tài)、讀鍵盤(pán)及任何磁盤(pán)I/O子程序:避免使用浮點(diǎn)(實(shí)數)運算。中斷服務(wù)程序中所調用函數盡量是BIOS級庫函數;(2)中斷程序執行的時(shí)間應盡可能的短。若 ISR中消耗時(shí)間過(guò)長(cháng),在完成一次運行前有可能被再次調用,導致系統被掛起。(3)控制變量可以是全局變量,也可通過(guò)寄存器變量傳遞給interrupt 函數;(4)若實(shí)時(shí)控制系統對中斷響應速度要求較高,可采用嵌入匯編技術(shù)。
評論