新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > VxWorks基于AT91RM9200處理器的中斷處理

VxWorks基于AT91RM9200處理器的中斷處理

作者: 時(shí)間:2012-03-27 來源:網(wǎng)絡(luò) 收藏



3 中斷模塊實(shí)現(xiàn)機(jī)制

3.1 異常中斷向量表的生成及實(shí)現(xiàn)

  在usrInit()函數(shù)中通過intVecBaseSet((FUNCPTR*)VEC_BASE_ADRS)函數(shù)對(duì)異常中斷向量表的基址進(jìn)行設(shè)置, VEC_BASE_ADRS在configall.h中定義為程序運(yùn)行空間的起始地址,但是在ARM中并沒有中斷基址寄存器,由于ARM9有重影射機(jī)制,可以將程序運(yùn)行空間的起始地址影射成0地址,這也符合ARM體系結(jié)構(gòu)通常都是把異常中斷向量表放在0地址處的慣例,異常中斷向量表可以從反匯編 bootrom_uncmp后的0地址處看到。當(dāng)有內(nèi)置的外設(shè)中斷或外部中斷產(chǎn)生時(shí),系統(tǒng)首先跳轉(zhuǎn)到異常中斷向量表的0x18處,此處是IRQ中斷向量的位置,該內(nèi)存中放置的是一條跳轉(zhuǎn)指令,因?yàn)閑xcVecInit()對(duì)中斷向量表初始化后,生成了一個(gè)exeEnterTbl,在這個(gè)表中列出了異常向量和對(duì)應(yīng)入口函數(shù)的結(jié)構(gòu)表,exeEnterTbl結(jié)構(gòu)如圖2所示。


 VxWorks基于AT91RM9200處理器的中斷處理
圖2 excEnterTbl的結(jié)構(gòu)

  由于ARM9用了重影射機(jī)制,因此重影射之后,系統(tǒng)將LOCAL_MEM_LOCAL_ADRS影射成0地址,中斷向量表從0地址處開始。從 excVecInit()的反匯編代碼可以看出,系統(tǒng)把指令ldr pc,[pc,#244]的反匯編代碼放在了從0x00000004開始的每個(gè)異常中斷向量地址處,也就是將excEnterTbl中每個(gè)異常處理函數(shù)的入口地址都放在了(0xF4+0x8+0x4+所對(duì)應(yīng)異常相對(duì)于未定義指令異常(0x00000004)的偏移)的內(nèi)存中,這樣就將異常向量和異常處理入口函數(shù)關(guān)聯(lián)起來了。

3.2 中斷向量表的結(jié)構(gòu)及生成

  那么當(dāng)系統(tǒng)產(chǎn)生中斷后,是如何設(shè)置中斷向量表,并且將中斷向量和入口程序關(guān)聯(lián)起來的呢?和異常向量表有點(diǎn)類似,但是中斷向量表是操作系統(tǒng)動(dòng)態(tài)分配的一段連續(xù)的內(nèi)存空間,這個(gè)空間的結(jié)構(gòu)如圖3所示。


 VxWorks基于AT91RM9200處理器的中斷處理
圖3 VxWorks中斷向量表的結(jié)構(gòu)

  因?yàn)槭莿?dòng)態(tài)分配,所以在這段內(nèi)存空間中,操作系統(tǒng)只給當(dāng)前中斷分配了中斷號(hào)、函數(shù)的入口和被傳遞的參數(shù)。每個(gè)中斷源按照中斷號(hào)順序排列,在為每個(gè)中斷源分配的內(nèi)存空間中頭4個(gè)字節(jié)是中斷向量表的初始化函數(shù)的入口,該函數(shù)對(duì)于每個(gè)中斷源來說是通用的,然后順序放置的是中斷號(hào)、函數(shù)入口和被傳遞的參數(shù).通過intconnect()函數(shù)可以將中斷向量和中斷處理函數(shù)關(guān)聯(lián)起來,因此在系統(tǒng)獲知了發(fā)生中斷的中斷號(hào)時(shí),就可以找到相應(yīng)的中斷處理函數(shù)去處理該中斷。當(dāng)發(fā)生IRQ異常時(shí),系統(tǒng)強(qiáng)制把程序指針拉到0x18處,在0x18處是這樣一條指令ldrpc,[pc,#244],IRQ異常相對(duì)于未定義指令異常的偏移是0x14,所以相當(dāng)于把0x114地址處的內(nèi)容賦給pc,而0x114處的內(nèi)容正是IRQ異常向量處理的入口函數(shù)intEnt的地址,因此程序跳轉(zhuǎn)到intent處去執(zhí)行。

4 中斷處理跟蹤調(diào)試的部分反匯編代碼

  通過使用ARM Developer Site仿真器,在0x18處設(shè)置斷點(diǎn)后單步執(zhí)行來分析中斷處理的過程。中斷處理函數(shù)的入口處代碼如下:


  2070b174[0xe59fb410] ldr r11,0x2070b58c; /*=#0x207a40c8,0x207a40c8是中斷向量表的位置*/
  2070b178[0xe59dc018] ldr r12,[r13,#0x18] /*將0x207b1ce8中的內(nèi)容給r12應(yīng)該是中斷號(hào)!!!*/
  2070b17c[0xe59bb000] ldr r11,[r11,#0] /*0x207a40c8處的內(nèi)容是0x21ffbef8*/
  2070b180[0xe08b318c] add r3,r11,r12,lsl #3 /*將0x21ffbef8(內(nèi)存地址)給r3,0x21ffbef8的內(nèi)容是向量0x207064b0,這是debug口中斷處理函數(shù)的入口*/
  2070b184[0xe79ba18c] ldr r10,[r11,r12,lsl#3]
  2070b188[0xe5930004] ldr r0,[r3,#4] /*相應(yīng)的參數(shù)傳遞給r0*/
  2070b18c[0xe1a0e00f] mov r14,pc
  2070b190[0xe1a0f00a] mov pc,r10 /* r10=0x207064b0,跳轉(zhuǎn)到debug口中斷處理函數(shù)處執(zhí)行*/
  0x21ffbef8(中斷向量表基址)處的情況是:
  21ffbef8[0x2070b434] dcd 0x2070b434 4.p
  21ffbefc[0x00000000] dcd 0x00000000....
  21ffbf00[0x207064b0] dcd 0x207064b0.dp
  21ffbf04[0x207a9990] dcd 0x207a9990..z
  21ffbf08[0x2070b434] dcd 0x2070b434 4.p
  21ffbf0c[0x00000002] dcd 0x00000002....
  21ffbf10[0x2070b434] dcd 0x2070b434 4.P
  21ffbf14[0x00000003] dcd 0x00000003....
  21ffbf18[0x2070b434] dcd 0x2070b434 4.P
  21ffbf1c[0x00000004] dcd 0x00000004....

5 結(jié)語

  Vxworks操作系統(tǒng)首先調(diào)用excVecInit()生成一個(gè)異常中斷向量表excEnterTbl,當(dāng)有IRQ中斷發(fā)生時(shí),根據(jù) excEnterTbl中0x00000018處的指令ldr pc,[pc,#244]跳轉(zhuǎn)到0x00000114處,即IRQ異常中斷的入口處intEnt執(zhí)行,隨后通過讀AIC_IVR寄存器得到當(dāng)前優(yōu)先級(jí)最高的中斷,返回這個(gè)中斷號(hào),并跳轉(zhuǎn)到intConnect()函數(shù)給該中斷號(hào)關(guān)聯(lián)的中斷處理程序入口去執(zhí)行。在這個(gè)過程中,中斷向量表的生成是 Vxworks動(dòng)態(tài)分配的,在中,為0到31號(hào)中斷源在中斷向量表中都分配了空間,該空間的格式固定。中斷處理結(jié)束后,通過往 AIC_EIOC寄存器中寫任意值,從中斷中返回。


上一頁 1 2 下一頁

關(guān)鍵詞: VxWorks AT91RM9200 中斷處理

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉