VxWorks基于A(yíng)T91RM9200處理器的中斷處理
Vxworks作為一個(gè)實(shí)時(shí)嵌入式操作系統,通常采用中斷的方式來(lái)滿(mǎn)足系統實(shí)時(shí)性的要求。
因此,熟悉其中斷的處理過(guò)程對于VxWorks操作系統的開(kāi)發(fā)是至關(guān)重要的.本文通過(guò)編寫(xiě)和調試基于AT91RM9200處理器的VxWorks嵌入式操作系統的BSP,來(lái)討論VxWorks操作系統的中斷機制。
1 VxWorks中斷處理機制及AIC
AT91RM9200使用一個(gè)8優(yōu)先級,可單獨屏蔽中斷的中斷向量控制器AIC。在A(yíng)RM體系結構中,有7種異常中斷,對應有一個(gè)異常中斷向量表。 ARM體系結構要求這個(gè)異常中斷向量表從0地址處開(kāi)始,對于外部中斷請求IRQ,系統又增加了一塊由中斷控制器控制的中斷向量表。
2 AT91RM9200 BSP的中斷驅動(dòng)的實(shí)現
2.1 中斷驅動(dòng)中定義的函數
STATUS at91rm9200LvlVecChk (int*,int*);
STATUS at91rm9200LvlVecAck(int,int);
STATUS at91rm9200LvlEnable(int);
STATUS at91rm9200LvlDisable(int);
2.2 高級中斷控制器AIC的初始化
在usrInit()中excVecInit()函數對異常中斷向量進(jìn)行初始化.整個(gè)中斷庫,以及中斷控制器的初始化都是在syslib.c中的 sysHwInit2()函數中完成的.該函數在sysClkConnect()中被調用,因為系統時(shí)鐘中斷要在內核開(kāi)放中斷后就要使能,因此內核在初始化為一個(gè)多任務(wù)環(huán)境后,就產(chǎn)生一個(gè)usrRoot()的任務(wù),在該任務(wù)中要建立系統時(shí)鐘中斷,因此調用了sysClkConnect()函數,中斷庫以及中斷控制器的初始化也就完成了。
高級中斷控制器必須進(jìn)行初始化,其初始化是在板級支持包BSP的中斷驅動(dòng)程序中。具體的實(shí)現函數是void at91rm9200IntDevInit(void)。該函數在文件syslib.c的sysHwInit2()函數中調用。
at91rm9200IntDevInit(void)函數中主要是配置系統的鉤子函數,然后對中斷源向量寄存器和中斷模式寄存器進(jìn)行配置,同時(shí)要清除并禁止AIC中所有的中斷。
2.3 中斷驅動(dòng)中的回調函數
在intEnt中,程序很快就進(jìn)入了特權模式(SVC32),如果是中斷可嵌套模式,要設置該模式下的堆棧,并且將中斷深度intCnt值加1.然后跳轉到intIntRtnPreempt中,在intIntRtnPreempt中為后來(lái)調用中斷驅動(dòng)中的函數開(kāi)辟了32個(gè)字節的堆??臻g,并且將程序指針拉到at91rm9200LvlVecChk函數處執行,at91rm9200LvlVecChk函數是在中斷驅動(dòng)中定義的函數,是用來(lái)檢測當前掛起的中斷中,優(yōu)先級最高的中斷源。檢測出最高優(yōu)先級的中斷后,首先要禁止該中斷,因此要調用at91rm9200LvlDisable函數,該函數也在中斷驅動(dòng)中定義。在禁止中斷的過(guò)程中,需要通過(guò)intLock和intUnLock函數來(lái)保護臨界代碼不被新的中斷打斷。
at91rm9200LvlVecChk()函數是通過(guò)讀AIC_IVR寄存器來(lái)獲取當前最高優(yōu)先級的中斷,將獲得的中斷號和中斷向量賦給2個(gè)變量,并且禁止該中斷。
at91rm9200LvlVecAek()函數是在中斷處理結束后,通過(guò)寫(xiě)AIC_EIOC寄存器來(lái)清除剛剛處理的中斷,并將其使能。 at91rm9200LvlEnable(int leve1)和at91rm9200LvlDisable(int level)來(lái)允許和禁止中斷,從而保護臨界代碼不被新的中斷所打斷。
2.4 中斷驅動(dòng)程序實(shí)現的流程圖
中斷驅動(dòng)程序實(shí)現的流程圖如圖1所示。
圖1 中斷驅動(dòng)程序實(shí)現的流程圖
評論