硬件中斷處理是實(shí)時(shí)系統(tǒng)設(shè)計(jì)中最重要、最關(guān)鍵的問題。文中綜合軟硬件,從工程應(yīng)用的角度對(duì)此問題加以討論。文中所述內(nèi)容針對(duì)的軟件平臺(tái)是VxWorks實(shí)時(shí)操作系統(tǒng),硬件平臺(tái)選用廣泛使用的X86架構(gòu)的嵌入式計(jì)算機(jī),全文按照CPU、主板、操作系統(tǒng)自下而上的順序展開。
1 Pentium CPU的中斷類型
有兩類事件可引起Pentium掛起當(dāng)前的指令流,即中斷和異常。中斷是由外部事件引發(fā)的,在程序執(zhí)行的任何時(shí)刻都可能出現(xiàn);異常也稱異常中斷,是由內(nèi)部事件引發(fā)的。中斷和異常各有兩類觸發(fā)源:
(1)中斷。
可屏蔽中斷:CPU的INTR引腳收到有效信號(hào),如果Pentium標(biāo)志寄存器IF位為1,則允許中斷,否則信號(hào)在CPU內(nèi)被屏蔽。
非屏蔽中斷:CPU的NMI引腳收到有效信號(hào)而引發(fā)的中斷,這類中斷不能被阻止。
(2)異常。
執(zhí)行異常:CPU試圖執(zhí)行一條指令的過程中出現(xiàn)錯(cuò)誤、故障等不正常條件而引發(fā)的異常中斷。
執(zhí)行軟件中斷指令:Pentium指令系統(tǒng)中包括一些如INTO,INT n這類軟件中斷指令,執(zhí)行時(shí)產(chǎn)生異常中斷。
詳細(xì)分類的話,Pentium可以識(shí)別256種中斷和異常。每種中斷給予一個(gè)編號(hào),即0~255,稱為中斷向量號(hào)(interrupt vector number)。其中NMI、異常以及系統(tǒng)保留占用中斷向量號(hào)0~31,而32~255為用戶中斷向量號(hào),可供INTR和自定義軟件中斷(如匯編中的INT指令)使用。
2 Pentium CPU的中斷響應(yīng)過程
中斷處理子程序的入口地址信息存于內(nèi)存中的一個(gè)表內(nèi),實(shí)模式為中斷向量表IVT,保護(hù)模式為中斷描述符表IDT。中斷發(fā)生時(shí),CPU首先通過某種方式獲得中斷向量號(hào),再以中斷向量號(hào)檢索此表,即可獲取中斷服務(wù)子程序入口地址,詳述如下:
(1)實(shí)模式使用中斷向量表。
中斷向量表IVR的基地址由IDTR(中斷描述符寄存器)指定,大小為1kB。中斷響應(yīng)時(shí)的查表過程與8086/8088一致,在此不再贅述。
(2)保護(hù)模式使用中斷描述符表。
中斷描述符表(IDT)的基地址也由IDTR指定,大小為2kB。中斷描述符表每一表項(xiàng)對(duì)應(yīng)一個(gè)中斷向量號(hào),但表項(xiàng)稱為中斷門描述符或陷阱門描述符。這些門描述符為8字節(jié)長(zhǎng),對(duì)應(yīng)256個(gè)中斷向量號(hào)。以中斷向量號(hào)乘以8作為訪問IDT的偏移,讀取相應(yīng)的中斷門/陷阱門描述符表項(xiàng)。門描述符給出中斷服務(wù)子程序人口地址(段:偏移),其中32位偏移量裝入EIP,16位的段值被裝入CS寄存器。但此段值是選擇符,CPU會(huì)自動(dòng)查GDT或LDT取得代碼段描述符并送到相應(yīng)的描述符寄存器中。
3 X86架構(gòu)的計(jì)算機(jī)對(duì)外部中斷的管理
在嵌入式應(yīng)用中,人們感興趣的主要是指由硬件信號(hào)觸發(fā)的非屏蔽中斷與可屏蔽中斷。在單CPU的X86計(jì)算機(jī)中,采用兩片8259級(jí)聯(lián)來管理16個(gè)可屏蔽外部中斷,由于主8259的IRQ2用于級(jí)聯(lián),所以實(shí)際可用的IRQ只有15個(gè),其中又有一些被系統(tǒng)占用,這種邏輯如今已被集成在主板芯片組的南橋中,如圖1所示。由于傳統(tǒng)的PIC提供的中斷資源較少,現(xiàn)代PC開始采用APIC(高級(jí)可編程中斷控制器)管理外部中斷,它的一個(gè)顯著優(yōu)點(diǎn)是能夠擴(kuò)充系統(tǒng)可用的IRQ資源。文中問題的討論基于傳統(tǒng)的PIC結(jié)構(gòu)。
圖1 外部中斷管理邏輯
4 在VxWorks中設(shè)計(jì)中斷應(yīng)用
Vxworks運(yùn)行在保護(hù)模式下。在Vxworks中,可以采用intConnect關(guān)聯(lián)中斷服務(wù)程序至某個(gè)中斷向量。然而intConnect并不是直接將用戶設(shè)計(jì)的ISR與中斷門描述符相關(guān)聯(lián),而是對(duì)它加了一層封裝,然后將封裝代碼的內(nèi)存首地址與中斷門描述符相關(guān)聯(lián),中斷響應(yīng)過程如圖2所示。采用intConnect為ISA總線設(shè)備關(guān)聯(lián)中斷服務(wù)程序IRQ—ISR至IRQ10的程序片斷如下:
圖2 中斷響應(yīng)過程
程序要點(diǎn)詳述:
① X86架構(gòu)的計(jì)算機(jī)中,一些中斷資源已經(jīng)固定地分配給某些外部設(shè)備,如系統(tǒng)時(shí)鐘固定使用IRQ0,所以在選擇中斷號(hào)時(shí)首先應(yīng)參考硬件手冊(cè),避免與已用的中斷資源沖突。選定中斷號(hào)后,需要在BIOS中加以設(shè)置。避免BIOS在初始化時(shí),把此中斷號(hào)作為可用資源分配給PCI設(shè)備,造成中斷沖突。以上是在開發(fā)ISA設(shè)備時(shí)要注意的,若開發(fā)PCI設(shè)備,一般不做上述考慮,因?yàn)锽IOS可為PCI設(shè)備動(dòng)態(tài)分配中斷資源,且多個(gè)PCI設(shè)備可共享一個(gè)中斷號(hào),只需從PCI配置頭中讀取分配到的中斷號(hào)使用即可。
② VxWorks中使用intConnect掛接中斷服務(wù)程序,但對(duì)于PCI設(shè)備,一般采用pciIntConnect掛接中斷,它與intConnect的主要不同在于intConnect使用的中斷向量是獨(dú)占的,而pciIntConnect則可使多個(gè)外部中斷共享一個(gè)中斷向量。它在內(nèi)部使用一個(gè)鏈表管理多個(gè)ISR,發(fā)生中斷時(shí),鏈接在一個(gè)鏈表上的各個(gè)ISR被依次調(diào)用,pciIntConnect要求每個(gè)ISR被調(diào)用時(shí),應(yīng)該首先查詢是否為自己的設(shè)備產(chǎn)生的中斷,不是則應(yīng)立即返回,以繼續(xù)調(diào)用其它ISR。
③ 在VxWorks中要注意區(qū)分以下4個(gè)與中斷相關(guān)的概念:IRQNumber,INumber,IVector,ILevel。
表1列出了IRQ0~I(xiàn)RQ15對(duì)應(yīng)的中斷向量號(hào)(INumber)與中斷向量(IVector)。
IRQNumber | INumber | IVector |
0 | 32 | 0x100 |
1 | 33 | 0x108 |
2 | 34 | 0x110 |
… | … | … |
15 | 47 | 0x178 |
5 結(jié)束語
文中結(jié)合工程實(shí)踐,以VXWorks與X86架構(gòu)的嵌入式計(jì)算機(jī)為軟硬件平臺(tái),較深入地闡述了在實(shí)時(shí)系統(tǒng)中設(shè)計(jì)中斷應(yīng)用時(shí)需要考慮的一些問題。由于篇幅所限,一些在其他資料中被廣泛提及的設(shè)計(jì)要點(diǎn)(如中斷服務(wù)程序不能調(diào)用可能會(huì)引起調(diào)用阻塞的函數(shù))在此不作介紹。
聯(lián)系客服