宋 杰, 丁志遠
(安徽大學 計算機科學與技術學院,安徽 合肥 230039)
?
·專題研究———虛擬仿真實驗( 24)·
基于Proteus的X86中斷仿真異常問題探究和對策
宋 杰, 丁志遠
(安徽大學 計算機科學與技術學院,安徽 合肥 230039)

X86系列的CPU及其系統一直是“微機原理”課程的主流內容,其中中斷是此課程的核心部分。目前,核心實驗仍然是采取使用真實硬件進行實驗的方式,但這種方式也帶來實驗項目受限,元器件易損壞等問題。隨著Proteus對8086系列的CPU提供仿真功能,很多高校也開始將X86系列的微機原理實驗向上移植。仿真實驗便于實驗內容擴展,便于學生自行實驗,沒有實驗場地約束,破解了實驗時間、地點的難題。仿真實驗畢竟和物理實驗有所差異,有不夠完善之處,在移植過程中,實現中斷的8259實驗出現了一些問題。本文就此問題進行了研究和實驗,剖析了產生問題的原因,并給出了多種解決問題的方法。
Proteus; intel 8086; 中斷; intel 8259; 仿真
Proteus軟件不僅具有其他EDA工具軟件的仿真功能[1-2],還能仿真單片機、ARM及外圍器件及虛擬儀器[3-5],在單片機領域獲得了巨大的成就,在仿真設計和實驗方面的功效已得到了廣泛的認可[6]。用虛擬軟件代替實驗箱的硬件電路,形象具體,增強了學生的感性認識,有助于對實驗原理的理解,通過軟件仿真,不僅節約了硬件資源,拓展了實驗范圍,而且提高了教學效率[7]。
Proteus V7.6版本后開始提供對8086CPU的仿真,使原先只是針對單片機系列的仿真逐漸擴展到X86領域[8]。國內很多高校已開展了研究[9-12],在實踐過程中,大部分仿真都獲得了理想的結果,但在仿真8259中斷時,或多或少遇到了問題。本文從多角度、多方法對此問題進行了分析、驗證并提供了解決對策。
中斷機制是現代計算機系統中的重用基礎機制,它在系統中協調系統對各種外部事件的響應和處理。中斷是CPU對系統發生的某個事件作出的一種反應,中斷系統是計算機的重要組成部分。中斷系統的應用大大提高了計算機性能和效率。
2.1 建立中斷仿真模擬系統
8259A是專門對中斷控制而設計的可編程中斷控制器。單個的8259A能管理8級向量優先級中斷,最多可以級聯成64級的向量優先級中斷系統。8259A有多種工作方式,各種工作方式的設定是在初始化時通過軟件進行的[13]。仿真電路采用經典的電路結構,如圖1所示。

圖1 基于8259A的中斷仿真模擬系統電路圖
2.2 仿真模擬系統程序設計
在對8259A進行編程時,首先必須進行初始化。一般先使用CLI 指令將所有的可屏蔽中斷禁止,然后寫入初始化命令字。在初始化主片8259 時,寫入初始化命令字的順序是:ICW1、ICW2、ICW3然后是ICW4[14]。關鍵代碼由如下部分構成:
(1)8259A的初始化代碼。
(2)設置中斷向量代碼(實驗設中斷向量為60H)。
(3)中斷處理子程序(代碼略)。
3.1 仿真驗證
按下單次脈沖單元按鍵,觸發外部中斷,即可控制K0~K7控制LED0至LED7的亮與暗,當K0~K7全部閉合時,中斷子程序自動返回到原程序。但是,仿真表明,若按照上述原理以及8259A的編程操作,并不能通過Proteus軟件的到預想的仿真結果。
3.2 中斷仿真失敗的數據分析
(1) 8086寄存器。點擊中斷觸發按鈕后,IP寄存器的值為00B8H,CS寄存器的值為8E00H。而非在代碼中設置的中斷向量60H*4。這說明8086并未按照正確的中斷向量執行中斷處理子程序。
(2) 8259寄存器。點擊中斷觸發按鈕后,8259中的中斷服務寄存器的值為10000000B,說明8259已經對中斷觸發按鈕進行了響應,并對其進行了處理。
(3) 內存空間。查找在代碼中設置的中斷向量地址,即60H*4號地址的單元,發現其連續的4個空間的值分別為:30H、00H、00H、00H,即中斷子程序的地址為30H。表明中斷向量寫入正確。
3.3 失敗原因推理
通過上述數據分析,中斷向量寫入正確,則仿真失敗的原因應該與8086芯片以及8259芯片有關。8259的中斷服務寄存器中的值表明8259以對中斷進行了響應,而8086中的IP與CS寄存器沒能得到正確的中斷向量,由此可推測8086芯片與8259芯片中的信息聯絡出現問題。
由上述原理、數據分析可進行如下兩種假設:
(1)8259沒有向8086發出或發出了不正確的中斷類型號,即問題出現在8259芯片上。
(2)8259發出了正確的中斷類型號,但8086接收出錯,即問題出現在8086芯片上。
3.4 分析仿真失敗原因實驗設計
為了對仿真失敗的原因進行探究,從空間和時間的角度設計如下兩個實驗。
(1) 實驗1。根據8086的數據分析可知,8086沒有得到正確的中斷向量,故跳轉到了錯誤的中斷處理子程序的入口地址。下面從空間的角度,將原源代碼進行如下修改:
把整個中斷向量表全部寫入INT0中斷子程序的入口地址,即添加如下代碼[15]:
MOV AX,OFFSET INT0 ;取INT0的偏移地址
MOV BX,SEG INT0 ;取INT0的段地址
L: MOV [SI],AX ;將整個中斷向量表全部寫入INT0的入口地址
MOV [SI+2],BX
ADD SI,4
LOOP L
實驗結果:可得到仿真的預想的效果,即8086可以正確跳轉到INT0中斷子程序。
(2) 實驗2。由于8086不能跳轉到正確的中斷子程序入口地址,從時間角度入手,將原源代碼進行如下修改:
在源程序的末尾以循環的方式不斷向數據總線輸入INT0的中斷子程序的入口地址,即將源程序末尾的JMP 語句換為如下代碼:
LI: MOV DX,800H ;將任意外設地址寫入DX
MOV AL,60h ;中斷類型號為60H
OUT DX,AL
JMP LI
實驗結果:可得到仿真的預想的效果,即8086可以正確的跳轉到INT0中斷子程序。
3.5 兩種假設的判定實驗設計
根據兩種假設,要想知道問題出現在8086還是8259芯片上,需要了解8259是否發出了正確的中斷向量。因此,使用虛擬邏輯分析儀對數據總線上的數據進行監控[6]。
(1) 線路連接。將數據總線的低八位鏈接在虛擬邏輯分析儀的A0~A7,8086的INTA引腳鏈接邏輯分析儀的A8引腳,如圖1所示。
(2) 操作步驟。將邏輯分析儀的捕捉分辨率設為0.2 m,設置A0至A8的觸發條件為任意條件觸發。開始仿真后,獲得捕捉的邏輯波形,如圖2所示。

圖2 邏輯分析儀捕獲圖
(3) 實驗結果。觀察捕獲的波形可發現,8086通過INTA引腳發出連續的兩個負脈沖(A8引腳),在第二個脈沖期間,8259送出了正確的中斷類型號60H。
在仿真的過程中查看仿真日志,就可以發現,日志上記錄的信息表明8259發送了正確的中斷類型號。
這個實驗從另一角度更加確切地證明了此結論。
3.6 兩種假設的最終實驗結論
前述實驗結果,可以證明8259芯片向8086發送了正確的中斷類型號。進一步對代碼進行修改,并用邏輯分析儀進行捕捉。
在主程序末尾添加如下代碼:
MOV DX,800H ;任意外設地址
MOV AX,60H ;中斷類型號為60H
OUT DX,AX ;目的是將60H輸出至數據總線
使用邏輯分析儀捕捉數據,可發現無論8259向8086發送的中斷類型碼是多少(如:將中斷類型號設置為50H,而實際的中斷類型號仍為60H),8086識別的中斷類型號都是最后輸出至數據總線的數據,亦即中斷源發送中斷請求前最后一次出現在數據總線上的數據。
結論:第二個假設是正確的,即8259發出了正確的中斷類型號,但8086接收出錯,即問題出現在8086芯片上。
根據前面得出的結論可知,由于8086芯片的故障,使得中斷仿真失敗。為了可以正常進行8059中斷實驗,在當前情況下,給出兩個主要的應對解決方法:
(1) 方法一。根據實驗一可知,從空間的角度,將原源代碼進行修改,即把整個中斷向量表全部寫入INT0中斷子程序的入口地址。
(2) 方法二。由實驗二可知,從時間角度入手,將原源代碼進行修改,即在源程序的末尾以循環的方式不斷向數據總線輸入INT0的中斷子程序的入口地址。
通過以上兩種方法,在無中斷嵌套的情況下可以進行正確的中斷仿真。
但是,需特別指出,在需要進行中斷嵌套的情況下,由于8086識別的中斷類型號是中斷源發送中斷請求前最后一次出現在數據總線上的數據,而且中斷源發送中斷的時間具有隨機性,故無法通過代碼的方式來保證8086接受到正確的中斷類型號。所以在中斷嵌套的情況下,目前無法進行正確的仿真。
X86系列的Proteus仿真實驗大都獲得了較好的結果,但在8259中斷實驗不夠圓滿,這說明仿真實驗具有一定的局限性,我們可以通過某些方法進行改進、克服。同時也要通過實驗告訴學生這個問題的本質,促進他們對微機系統更深入的了解。
[1] 方天紅,張升義. Proteus在“數字邏輯電路”課程項目驅動教學中的應用[J]. 實驗室研究與探索,2014(4):195-198.
[2] 郭亞琴,王正群,秦 燕. Proteus軟件在電子產品設計與制作中的應用[J]. 實驗室研究與探索,2013(12):101-104.
[3] 周潤景,袁偉停.基于PROTEUS的ARM虛擬開發技術[M].北京:北京航空航天大學出版社,2007.
[4] 周潤景,張麗娜.基于Proteus的電路及單片機系統設計與仿真[M].北京:北京航空航天大學出版社,2006.
[5] 江世明.基于Proteus的單片機應用技術[M].北京:電子工業出版社, 2009 .
[6] 周潤景,張麗娜.PROTEUS入門實用教程[M].北京:北京航空航天大學出版社,2006.
[7] 王海燕,楊艷華.Proteus和Keil軟件在單片機實驗教學中的應用[J]. 實驗室研究與探索,2012(5):88-91.
[8] 顧 輝,梁惺彥.微機原理與接口技術——基于8086和Proteus仿真[M].北京:電子工業出版社.2011.
[9] 張亞軍. Proteus在《微型機原理》課程教學中的應用[J]. 科技視界,2014(13):177-179.
[10] 王 娟. Proteus軟件在單片機專題實訓中的應用[J]. 實驗技術與管理,2010(8):73-77.
[11] 楊驍涵. 微機原理與接口技術虛擬實驗平臺的設計與實現[D].北京郵電大學, 2012.
[12] 李現國,張 艷.Proteus仿真在微機原理及接口技術教學中的應用[J]. 實驗技術與管理,2010(12):125-127.
[13] 周荷琴,吳秀清.微型計算機原理與接口技術[M].5版.合肥:中國科學技術大學出版社,2013.
[14] 徐 晨,陳繼紅,王春明,等.微機原理及應用[M].北京:高等教育出版社,2004.
[15] 沈美明,溫冬嬋.IBM PC匯編語言程序設計[M].北京:清華大學出版社,2002.
The Analysis and Resolution on Error Simulation of X86 Interrupt with Proteus
SONGJie,DINGZhi-yuan
(Computer Science and Technology School, Anhui University, Hefei 230039, China)
X86 CPU and its interface system are popular in "Computer Principle" course, and interrupt is one of the most important contents. Now, physical experiment is still the main method, but experiment items are limited and the electrical components are easy to be damaged. Many universities are doing simulation experiments on Proteus because it provides the simulation of 8086 CPU. Experiment item is easy expanded by simulation, and students can do it by themselves. The experiment time and location are flexible. Simulation experiments still have a few differences with physical experiment, and are not very perfect. There are still some problems with 8259 interrupt experiment. Some studies and experiments have been done on this problem. The analysis of the causes and solutions of the simulation are presented.
Proteus; Intel 8086; interrupt; Intel 8259; simulation
2015-01-08
國家自然科學基金(61271352);安徽省高等教育振興計劃重大教學改革研究項目(2013zdjy040)
宋 杰(1966-),男,安徽合肥人,博士,副教授,安徽大學網絡工程系主任,研究方向:嵌入式系統、智能計算。
E-mail:jsong@ahu.edu.cn
TP 391.9; G 434
A
1006-7167(2015)08-0081-04