免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
VxWorks中的中斷應(yīng)用設(shè)計(jì)要點(diǎn)
                  硬件中斷處理是實(shí)時(shí)系統(tǒng)設(shè)計(jì)中的關(guān)鍵性問題,設(shè)計(jì)人員有必要對(duì)其作深入研究,以更好地滿足開發(fā)工作需要。文中以VxWorks操作系統(tǒng)為軟件平臺(tái),討論了在實(shí)時(shí)系統(tǒng)中進(jìn)行中斷應(yīng)用設(shè)計(jì)時(shí)要注意的一些問題。由于軟硬件的相關(guān)性,選用廣泛應(yīng)用的X86架構(gòu)的嵌入式汁算機(jī)為硬件平臺(tái),對(duì)PenriumCPU和計(jì)算機(jī)主板對(duì)硬件中斷的管理機(jī)制也做了詳細(xì)介紹 所得出的研究結(jié)論在具體的開發(fā)項(xiàng)目中均得以驗(yàn)證,可供相關(guān)技術(shù)人員參考。

硬件中斷處理是實(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的程序片斷如下:

代碼
  1. #define IRQNum 10 /*1*/
  2. ……
  3. /* 2,3 */
  4. if(intConneet((VOIDFUNCPTR)INUM_TO_IVEC(IRQNum+0x20),IRQ_ISR,0)==OK)
  5. {
  6. if(sysIntEnablePIC(IRQNum)==OK) /*4*/
  7. {
  8. print{("Succeeded.\n");
  9. }
  10. }
  11. void IRQ_ISR()
  12. {
  13. int intLockKey;
  14. intLockKey=intLock();/*5*/
  15. ……(critical section)
  16. intUnlock(intLocKey);
  17. }


圖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。

  • IRQNumber:外部中斷信號(hào)由兩片8259級(jí)聯(lián)構(gòu)成的PIC的那個(gè)輸入管腳引入,主8259的8條中斷輸入線對(duì)應(yīng)IRQ0~I(xiàn)RQ7,從8259對(duì)應(yīng)IRQ8~I(xiàn)RQ15。
  • INumber:Pentium CPU 的中斷向量號(hào)。INumber=IRQNumber+INT_NUM_IRQ0,INT_NUM_IRQ0,即IRQ0對(duì)應(yīng)的中斷向量號(hào),BSP的config.h中定義其為0x20(十進(jìn)制的32),即Pentium CPU 中斷向量號(hào)用戶定義區(qū)的起始編號(hào)。
  • IVector:中斷向量,是指某中斷的中斷描述符在中斷描述符表中的偏移量。INumber與IVector間的關(guān)系可簡(jiǎn)單描述為:IVector=INumber*8??梢杂胕vi86.h中定義的兩個(gè)宏(INUM_TO_IVEC,IVEC_TO_INUM)實(shí)施轉(zhuǎn)換。
  • ILevel:中斷優(yōu)先級(jí)。由于主從8259都被初始化為固定優(yōu)先級(jí),優(yōu)先級(jí)逐漸遞減,且兩片8259存在級(jí)聯(lián)關(guān)系,所以優(yōu)先級(jí)關(guān)系為IRQ0 > IRQ1> IRQ2[IRQ8>IRQ9>…>IRQ15]>IRQ3>…>IRQ6>IRQ7。

表1列出了IRQ0~I(xiàn)RQ15對(duì)應(yīng)的中斷向量號(hào)(INumber)與中斷向量(IVector)。

表1 中斷相關(guān)概念對(duì)照表
IRQNumberINumberIVector
0320x100
1330x108
2340x110
15470x178
④ 用intConnect掛中斷后,還必須用sysIntEnablePIC使能中斷,sysIntEnablePIC的函數(shù)原型在i8259Pic.C中定義,實(shí)際上就是針對(duì)某個(gè)IRQ,置8259中斷屏蔽寄存器中的相應(yīng)位為允許。sysIntEnablePIC中的基本操作是利用端口讀寫函數(shù)sysInByte,sysOutByte讀寫8259的中斷屏蔽寄存器。sysInByte,sysOutByte的函數(shù)原型在sysALib.s中定義。
⑤ 關(guān)鍵代碼段可用關(guān)中斷intLock和開中斷intUnlock加以保護(hù)。語句對(duì)intLock與intUnlock在不同的CPU體系架構(gòu)中實(shí)現(xiàn)原理不同。在X86架構(gòu)中,它們是通過操作EFLAGS中的IF位實(shí)現(xiàn)的。反匯編后可觀察它們的匯編形式代碼。
intLock的反匯編代碼:
_intLock: PUSHF /*將EFLAGS壓棧*/
_intLock: POP EAX
+0x002: AND EAX,0x200 /*只保存感興趣的位IF*/
+0x007: CLI /*清IF位*/
+0x008: RET /*EAX作為返回值,即lock-out key */
intUnlock的反匯編代碼:
_intUnlock: MOV EAX,[ESP+4] /*將lock-out key作為參數(shù)傳給EAX */
+0x004: AND EAX,0x200 /*判封鎖中斷前IF位的狀態(tài)如何*/
+0x009: JE intUnlock0 /*若封鎖中斷前也是關(guān)中斷狀態(tài),則不做操作*/
+0x011: STI /*若封鎖中斷前是開中斷狀態(tài),則置IF位*/
intUnlock0: RET /*返回*/
注意不要在中斷閉鎖期間調(diào)用Vxworks系統(tǒng)函數(shù),否則有可能意外打開中斷閉鎖,違反臨界代碼的設(shè)計(jì)意圖。intLock可以在ISR或通常的任務(wù)中使用,當(dāng)在任務(wù)中使用時(shí),關(guān)中斷并不會(huì)禁止任務(wù)調(diào)度,所以,若一個(gè)任務(wù)關(guān)中斷后,又發(fā)生了任務(wù)調(diào)度,則新任務(wù)的上下文將被恢復(fù),而EFLAGS是任務(wù)上下文的一部分,所以IF位可能會(huì)發(fā)生變化,中斷屏蔽可能會(huì)被解除。為了在關(guān)中斷的同時(shí)禁止任務(wù)調(diào)度,可采用如下形式:
if(taskLock()==OK)
{
intLockKey= intLock();
…(critical section)
intUnlock(intLockKey);
taskUnlock();
}
以上介紹了設(shè)計(jì)中斷應(yīng)用時(shí)在軟件方面要注意的一些問題,再簡(jiǎn)單說一下硬件中斷信號(hào)的提供。VxWorks中8259被初始化為上升沿觸發(fā),值得注意的是,外部中斷信號(hào) 須保持為高電平直至第一個(gè)INTA信號(hào)的下降沿到來,否則會(huì)造成假中斷,觸發(fā)IRQ7的中斷服務(wù)程序,常用的硬件中斷信號(hào)形式是利用一個(gè)負(fù)脈沖的后沿(上升沿)。IRQ7是并口使用的中斷號(hào),在調(diào)試過程中,可以在VxWorks中裁減掉并口模塊,在IRQ7上掛一個(gè)測(cè)試用的中斷服務(wù)程序,以觀察記錄假中斷。

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ù))在此不作介紹。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VxWorks下MPC860的中斷處理機(jī)制及其應(yīng)用
Interrupt
內(nèi)核代碼學(xué)習(xí)==>深入介紹Linux內(nèi)核(八)
什么是中斷,為什么要中斷?
操作系統(tǒng)啟動(dòng)過程
Linux內(nèi)核的中斷處理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服