王 超, 符曉玲, 李 斌
(昌吉學(xué)院物理系,新疆昌吉831100)
中斷技術(shù)是微機(jī)原理課程中非常重要內(nèi)容,其應(yīng)用可大大提高CPU的效率,Intel 80X86 系列微機(jī)有一個靈活的中斷系統(tǒng),可以處理256 種中斷源,每個中斷源又對應(yīng)一定的中斷類型號供CPU識別[1-3]。中斷分為外部中斷和內(nèi)部中斷兩種,外部中斷主要由外部設(shè)備的請求引起,具有隨機(jī)性,內(nèi)部中斷有指令執(zhí)行引起,無隨機(jī)性。由于外部中斷執(zhí)行的隨機(jī)性,造成中斷執(zhí)行過程的突發(fā)事件比較多,比如:無法進(jìn)入中斷、中斷返回“跑飛”、中斷嵌套無法完成等。本文利用Proteus設(shè)計了80X86 中斷電路,并進(jìn)行了詳細(xì)的測試分析,可將抽象的中斷過程直觀化地展現(xiàn)了出來。
80X86 中斷電路由8086CPU、數(shù)據(jù)/地址復(fù)用電路、片選電路、可屏蔽中斷請求(Interrupt Request,INTR)按鍵請求及顯示電路和非屏蔽中斷請求(Non Maskable Interrupt,NMI)按鍵請求及顯示電路組成[4-6],主要完成INTR、NMI 的中斷請求及處理,以及它們之間中斷嵌套功能的實(shí)現(xiàn),如圖1 所示。
圖1 80X86中斷電路設(shè)計圖
數(shù)據(jù)/地址復(fù)用電路由3 片74LS273 鎖存器組成,數(shù)據(jù)線用AD[0…15]表示,地址線用A[0…19]表示,用來在不同時刻分時使用總線;片選電路由4078 或非門和74LS138 譯碼器組成,可根據(jù)需要配置任意地址范圍的片選信號;INTR 按鍵請求及顯示電路由8259控制器、74LS373 驅(qū)動器等組成,用來對按鍵S1通斷的輸入信號進(jìn)行識別并以0 ~9 遞增的順序在數(shù)碼管上顯示;NMI按鍵請求及顯示電路由8255 可編程并行接口芯片、模擬中斷請求按鍵等組成,用來對按鍵S2-S4的輸入信號進(jìn)行識別并顯示在數(shù)碼管上,通過8255可擴(kuò)展了多個I/O口,根據(jù)需要外接多種I/O設(shè)備。
根據(jù)圖1 要實(shí)現(xiàn)的功能,完成主程序和中斷服務(wù)程序的編寫。主程序完成初始化8255、8259 等任務(wù),之后循環(huán)等待外部中斷的發(fā)生,當(dāng)有可屏蔽中斷請求時,執(zhí)行加1 操作,當(dāng)有非屏蔽中斷請求時顯示對應(yīng)的按鍵值,中斷服務(wù)結(jié)束后返回主程序(見圖2)。
圖2 軟件流程圖
Proteus的虛擬仿真模式(Virtual Simulation Mode,VSM)包括交互式的動態(tài)仿真和基于仿真圖表的靜態(tài)仿真兩種,交互式動態(tài)仿真可在線實(shí)時觀察電路的仿真結(jié)果,仿真結(jié)果在運(yùn)行結(jié)束后立即消失,基于圖表的仿真結(jié)果可隨時刷新,以圖表的形式駐留在圖中,可供線下進(jìn)行分析。為了精確分析中斷的執(zhí)行過程,采用仿真圖表方式來觀察,在原理圖中分別添加CLK、M/和READY 等探針,并在仿真圖表中添加相應(yīng)的量。
非屏蔽中斷由CPU 的NMI 引腳出現(xiàn)上升沿觸發(fā)時向CPU提出中斷請求,不受IF的影響,也不能由軟件加以屏蔽[7-8],要想通過仿真圖表觀察NMI 請求的過程,是不能和電路進(jìn)行交互操作的,因此可以考慮在按鍵處加入一個等效的信號,使用虛擬仿真工具中的激勵源來完成,如圖3 所示。
圖3 單脈沖激勵源
圖3 中,添加了一個單脈沖激勵源,在60 ms時刻添加一寬度為50 μs 的脈沖,脈沖屬性為高、低、高的脈沖,用來模擬按鍵的通斷情況,并在上升沿觸發(fā)NMI的中斷請求。8086CPU 在當(dāng)前指令執(zhí)行完成后,立即無條件給予響應(yīng),中斷類型號為2,CPU 響應(yīng)后,在ALE的下降沿把出現(xiàn)在AD[0…15]上的地址信號0284H(8255 C口地址)進(jìn)行鎖存,在下一個T狀態(tài)有效時讀取總線AD[0…7]上的數(shù)據(jù)0FEH,如圖4所示。
圖4 NMI中斷響應(yīng)讀時序
在經(jīng)過若干個空閑周期Ti后,將要進(jìn)行總線寫周期,在T1 狀態(tài)ALE 下降沿有效時,將出現(xiàn)在總線AD[0…15]上的數(shù)據(jù)0280H進(jìn)行鎖存,下一個T狀態(tài),在有效時將計算得到的按鍵顯示碼0F9H 通過總線AD[0…7]寫入到8255 的A口,立即顯示對應(yīng)按鍵代碼為“1”,如圖5 所示。
圖5 NMI中斷響應(yīng)寫時序
(1)CPU 訪問外設(shè)讀時序圖??善帘沃袛嗾埱笮盘柾ㄟ^INTR引腳送給CPU,在中斷允許標(biāo)志IF =1時,CPU在結(jié)束當(dāng)前指令周期后響應(yīng)中斷請求[9-11],中斷過程如圖6 所示,在T1 狀為低電平,表示CPU訪問的是外設(shè)8259A,多路復(fù)用總線上發(fā)出地址信息,A[16…19]不用,保持為低電平,AD[0-15]=02A2H,指示出要尋址的外設(shè)端口的地址,在ALE 信號的下降沿74LS273 鎖存器對地址進(jìn)行鎖存;在T2 狀態(tài),A[16…19]=0010B,代表CPU 的狀態(tài)信號線,分別表示8086CPU與總線相連、IF =0(中斷禁止)和正在使用的為CS段寄存器,AD[0 ~15]前期浮空,后期有有效,0060H 出現(xiàn)在數(shù)據(jù)總線上,該值為8259A的初始化字ICW2 =0110 0000 B,其功能為設(shè)置中斷類型號的高5 位;在T3 狀態(tài),A[16…19]繼續(xù)提供狀態(tài)信息,AD[0-15]為CPU 寫的數(shù)據(jù)0060H,CPU在T3 狀態(tài)的下降沿采樣READY信號,因該信號為高電平,表示外設(shè)8259A 已經(jīng)做好接收準(zhǔn)備,無需插入TW等待周期,直接進(jìn)入T4 狀態(tài),在T4 狀態(tài)和T3狀態(tài)交界處,完成數(shù)據(jù)的寫入操作,總線周期結(jié)束,當(dāng)CPU不執(zhí)行總線周期時,系統(tǒng)總線就處于空閑狀態(tài),執(zhí)行空閑周期Ti,在這期間,A[16…19]仍然驅(qū)動上一個總線周期的狀態(tài)信息,其值為0010B,AD[0…15]處于高阻狀態(tài)。
圖6 CPU訪問外設(shè)讀時序圖
(2)CPU 響應(yīng)可屏蔽中斷時序圖。當(dāng)發(fā)出中斷請求后,8086CPU在現(xiàn)行指令執(zhí)行完成之后將進(jìn)行響應(yīng),如圖7 所示,中斷響應(yīng)周期有2 個,每個響應(yīng)周期由4 個T狀態(tài)組成,在兩有效之間,插入了3個空閑周期Ti,以等待外設(shè)提供中斷類型號,每個中斷響應(yīng)周期CPU都會引腳發(fā)出1 個負(fù)脈沖,在第1 個響應(yīng)周期AD[0…7]一直處于浮空狀態(tài),在T1狀態(tài),ALE下降沿輸出地址鎖存信號,A[16…19]為低電平,在T2-T3 狀態(tài),A[16…19]=0110B,其含義為IF =1 表示允許中斷、CPU正在訪問CS段寄存器。在第2 個響應(yīng)周期,T1 狀態(tài),ALE下降沿再次有效1 次,外設(shè)8259A在收后,立即將中斷類型號63H送往數(shù)據(jù)總線的低8 bit AD[0…7]上,中斷請求信號INT一直維持到結(jié)束后終止。
圖7 可屏蔽中斷響應(yīng)時序圖
(3)設(shè)置硬件斷點(diǎn)和調(diào)試彈出窗口。為了提高調(diào)試效率,以便當(dāng)硬件條件發(fā)生時單步執(zhí)行觀察代碼下一步的執(zhí)行情況,可以設(shè)置硬件斷點(diǎn)來完成,例如:想觀察非屏蔽中斷時入口地址是否正確,可以將中斷請求信號INT作為硬件斷點(diǎn)設(shè)置點(diǎn),從模式選擇器中選擇電壓探針,單擊后放置到INT 引腳上,雙擊選擇屬性,如圖8 所示,在實(shí)時斷點(diǎn)類型選擇“數(shù)字的”,即INT引腳低電平觸發(fā),輸入“0”作為觸發(fā)值,裝備時間選擇“1”,當(dāng)INT引腳由高電平“1”變化到低電平“0”時進(jìn)行捕獲,觀察中斷向量表中的內(nèi)容。
圖8 硬件斷點(diǎn)設(shè)置圖
為方便觀察原理圖中某一小部分的變化情況,又不希望經(jīng)常在原理圖和VSM Studio 中來回切換,需要對調(diào)試彈出窗口進(jìn)行設(shè)置,例如:想觀察當(dāng)S1按鍵按下時可屏蔽中斷運(yùn)行結(jié)果顯示情況,可切換到ISIS 選項卡,選擇“調(diào)試彈出模式”,在原理圖中框選需要在VSM Studio 頁面中顯示的部分,這里框選了可屏蔽中斷顯示器、按鍵S1即可。按下仿真運(yùn)行按鈕,切換到VSM Studio選項卡,在IDE 的右邊顯示了剛才選擇的部分原理圖,如圖9 所示。
圖9 中,按下S1按鈕,在硬件斷點(diǎn)INT控制下,程序立即暫停至可屏蔽中斷int3 PROC NEAR 處,單擊調(diào)試/8086/Memory Dump,即可打開存儲器窗口[12-16],通過圖7 可知,8259A 的IR3 可屏蔽中斷類型號為63H,乘以4 可以求得中斷向量表的地址為18CH,通過存儲器窗口可以觀察到在18CH 地址內(nèi)的內(nèi)容為5A 00 02 00,即IP =005AH,CS =0002H,與代碼段中可屏蔽中斷服務(wù)程序int3 的入口地址一致。
圖9 可屏蔽中斷運(yùn)行圖
依據(jù)x86 所規(guī)定的NMI 中斷請求的優(yōu)先級高于INTR中斷請求,為用仿真圖表觀察中斷的嵌套過程,在S1按鍵處放置一個連續(xù)時鐘激勵源,類型為高、低、高,周期為500 μs,即:每隔500 μs 向8259 發(fā)出中斷請求,在數(shù)碼管上循環(huán)遞增顯示0 ~9,用來指示進(jìn)、出INTR中斷的過程。INTR中斷運(yùn)行期間,在按鍵S2置一單脈沖激勵源信號,脈沖屬性為高、低、高,脈沖寬度為20 μs,開始時刻加在1 ms處,用來模擬NMI請求,通過仿真圖表,觀察中斷嵌套過程,如圖10 所示。
圖10 中斷嵌套處理過程
將圖10 中斷嵌套時序分成4 部分,詳細(xì)分析如下所示:
(1)此波形對應(yīng)的是8086 對8255、8259 等初始化操作過程。如圖11,圖中數(shù)據(jù)與程序中初始化數(shù)據(jù)一致。
圖11 初始化操作時序圖
(2)當(dāng)激勵源8259 有正跳變時,產(chǎn)生INTR 中斷請求。體現(xiàn)在ALE兩次有效有效,通過放大/縮小等工具發(fā)現(xiàn)該處中斷類型號為63H,如圖12。可屏蔽中斷電路數(shù)碼管接收到的字型碼為“F9”轉(zhuǎn)化為顯示字符“1”。
圖12 INTR中斷請求
(3)對應(yīng)的是在INTR 請求時,激勵源8255 有負(fù)跳變,產(chǎn)生NMI中斷請求。因NMI的中斷優(yōu)先級高于INTR信號,所以暫停INTR 過程轉(zhuǎn)去執(zhí)行NMI 中斷,體現(xiàn)在INTR中斷請求延長,ALE 兩次有效,NMI數(shù)碼管顯示“1”。NMI 執(zhí)行結(jié)束后,繼續(xù)響應(yīng)INTR 中斷,有效,ALE兩次有效,此處中斷類型碼仍是63H,可屏蔽中斷電路數(shù)碼管顯示為數(shù)字“2”,如圖13所示。
圖13 中斷嵌套
(4)對應(yīng)的是INTR中斷請求及響應(yīng)過程,與第2部分過程類似,INTR 數(shù)碼管顯示“2”,運(yùn)行過程如圖14 所示。
圖14 運(yùn)行過程圖
在仿真運(yùn)行時,也可以通過示波器觀察到中斷嵌套情況,如圖15 所示,當(dāng)不可屏蔽中斷與可屏蔽中斷同時發(fā)生時,首先執(zhí)行不可屏蔽中斷,當(dāng)其執(zhí)行完成后,執(zhí)行可屏蔽中斷請求。
圖15 示波器觀察中斷嵌套時序圖
使用Proteus軟件的多種功能對X86 系列微機(jī)的中斷電路進(jìn)行了設(shè)計、和仿真、分析,用Proteus仿真工具中的激勵源,實(shí)現(xiàn)了交互式動態(tài)仿真向基于圖表的靜態(tài)仿真的轉(zhuǎn)換,有利于對中斷突發(fā)事件過程的精確分析,有助于快速發(fā)現(xiàn)存在的問題,提高解決問題的能力。