引言 硬件中斷處理在實(shí)時(shí)操作系統(tǒng)設(shè)計(jì)中起著十分重要的作用,它是外部事件通知操作系統(tǒng)的最常用手段。中斷的正常運(yùn)行是操作系統(tǒng)穩(wěn)定工作的先決條件。VxWorks作為一款優(yōu)秀的實(shí)時(shí)嵌入式系統(tǒng),通常采用中斷的方式來滿足系統(tǒng)實(shí)時(shí)性要求。因此,熟悉其中斷的處理過程對于VxWorks操作系統(tǒng)的開發(fā)至關(guān)重要。本文通過基于S3C44B0X處理器VxWorks嵌入式操作系統(tǒng)的BSP移植,詳細(xì)分析了VxWorks操作系統(tǒng)基于ARM處理器的中斷處理方法。 1 ARM異常中斷處理 ARM體系結(jié)構(gòu)支持復(fù)位(Reset)等7種異常中斷類型,各異常中斷的向量地址及中斷的處理優(yōu)先級如表1所示。當(dāng)異常中斷發(fā)牛時(shí),硬件邏輯根據(jù)異常類型給程序計(jì)數(shù)器(PC)強(qiáng)制賦值,使程序從表1給出的相應(yīng)的矢量地址開始執(zhí)行異常處理程序。在異常中斷向量表中指定了各異常中斷與其處理程序的對應(yīng)關(guān)系,一般來說,矢量地址處將包含一條指向相應(yīng)程序的轉(zhuǎn)移指令,從而可跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序。異常中斷向量表存放在存儲(chǔ)器的0地址處,大小為32字節(jié),每個(gè)異常中斷占4字節(jié)大小,保留了4字節(jié)空間。 表1 各異常中斷的向量地址以及中斷處理優(yōu)先 ![]() S3C44BOX的中斷控制器町以接收來自26個(gè)中斷源的30個(gè)中斷請求,其中有4個(gè)外部中斷(EINT/4/5/6/7)是邏輯或的關(guān)系,它們共用一條中斷請求線。當(dāng)片內(nèi)外圍中斷和片外中斷模式設(shè)定為IRQ時(shí),如有多重中斷發(fā)生,中斷控制器經(jīng)過優(yōu)先級判斷選擇其中一個(gè)中斷,通過IRQ向ARM7TDMI內(nèi)核發(fā)出IRQ中斷請求。另外.在中斷服務(wù)程序中需特別注意:必須加入對L_ISPC或F_ISPC寄存器相應(yīng)的中斷位寫1操作,來清除只讀中斷掛起寄存器INTPEND的掛起位,以使中斷正常運(yùn)行。 2 VxWorks中斷處理機(jī)制 VxWorks中斷處理主要包括:保存被中斷任務(wù)的上下文,調(diào)用中斷服務(wù)程序(ISR),中斷返回恢復(fù)被中斷任務(wù)的上下文,其具體流程如圖1所示。對被中斷任務(wù)現(xiàn)場信息的保存,在S3C44B0處理器體系結(jié)構(gòu)中,VxWorks采用集中式的保存方式,即在內(nèi)存中專門設(shè)置一個(gè)中斷保存堆棧.所有中斷的現(xiàn)場信息都統(tǒng)一保存在此堆棧中。堆棧的定位和大小初始化依據(jù)指定參數(shù)在系統(tǒng)啟動(dòng)時(shí)進(jìn)行配置。對于堆棧的大小,必須足夠大,以滿足最壞情況下中斷嵌套的深度。 ![]() 圖1 VxWorks中斷處理執(zhí)行流程 2.1 異常向量表的生成及實(shí)現(xiàn) 當(dāng)異常發(fā)生時(shí),程序計(jì)數(shù)器(PC)會(huì)被強(qiáng)制為相應(yīng)異常處理程序的入口地址.然后進(jìn)行中斷源的識別,根據(jù)中斷號在中斷向量表中找到相應(yīng)中斷服務(wù)程序(ISR)的入口地址。VxWorks將異常向量表定位在RAM中,基地址為VEC_BASE_ADRS,在configA11.h中定義.一般為RAM存儲(chǔ)器的起始地址。在系統(tǒng)啟動(dòng)初始化時(shí),由intVecBaseSet()函數(shù)設(shè)置向量表的基地址。向量表地址設(shè)定后,需要初始化指定異常的缺省處理函數(shù)。VxWorks在映像的代碼段建立了一張中斷缺省函數(shù)表,函數(shù)excVecInit()根據(jù)這張表來設(shè)置向量表的各異常中斷向量值。需初始化的向量表范圍由LOW_VEC和HIGH_VEC確定,在excArchLib.h中定義。由于不同的處理器異常處理機(jī)制不同,有時(shí)需根據(jù)具體的異常處理來建立自己的異常向量表,具體建立實(shí)現(xiàn)過程在下面討論。 2.2 中斷服務(wù)程序的連接 VxWorks為中斷提供接口函數(shù)intConnect(),它將中斷服務(wù)程序(ISR)和中斷向量相關(guān)聯(lián)。在操作系統(tǒng)內(nèi)核啟動(dòng)后,VxWorks建立與中斷號相對應(yīng)的中斷向量表,中斷向量表中的每個(gè)中斷向量包含中斷服務(wù)程序(ISR)的入口地址。當(dāng)中斷事件發(fā)生時(shí).VxWorks內(nèi)核將調(diào)用與其中斷向量對應(yīng)的中斷服務(wù)程序。intConnect()原型如下: STATUS intConnect ( VOIDFUNCPTR * vector, /* 要關(guān)聯(lián)的中斷向量 */ VOIDFUNCPTR routine, /*中斷發(fā)生時(shí)調(diào)用的函數(shù) */ int parameter /*傳遞給lsR函數(shù)的參數(shù)*/ ) 但實(shí)際上,中斷出現(xiàn)時(shí)并不是直接調(diào)用指定的中斷處理函數(shù)。而是,intConnect()函數(shù)將創(chuàng)建一小段代碼,這段代碼用以保存必要寄存器、設(shè)置堆棧入口、之后調(diào)用中斷處理函數(shù)。相反,當(dāng)從該函數(shù)返回時(shí),這段代碼先恢復(fù)寄存器和堆棧,然后退出中斷。 3 VxWorks基于S3C44B0X的中斷處理 3.1 基于S3C44B0X處理器的VxWorks異常向量表的生成S3C44BOX處理器不支持內(nèi)存重定向操作,也就是每個(gè)片選的地址范圍是定死的,不能根據(jù)需要自己指定。啟動(dòng)flash存儲(chǔ)器一直位于0地址,異常人口不能在運(yùn)行時(shí)寫入,故必須硬編碼將異常入口填寫在啟動(dòng)flash的0地址處。romInit.s是系統(tǒng)上電時(shí)的初始人口程序.從flash的0地址開始運(yùn)行。故在其開始出定義異常入口程序?qū)崿F(xiàn)如下: _ARM_FUNCTION(romInit) _romInit: B cold /* 上電復(fù)位后執(zhí)行的第1條指令,也可看作是復(fù)位向量 */ ⋯ /* 未定義指令、軟件中斷等異常入口 */ B . B _romIRQ /* IRQ中斷異常入口 */ B . 在地址Ox00000014處S3C44B0X處理器未使用,保留。另外VxWorks不支持快速中斷.地址Ox0000001c保留。 由于VxWorks建立的異常向量表定位在RAM中.那么當(dāng)中斷發(fā)生時(shí)如何把兩者連接起來.從而由VxWorks實(shí)現(xiàn)中斷管理呢?本BsP根據(jù)VxWorks缺省異常向量表,建立自定義的向量表,實(shí)現(xiàn)從ROM到RAM異常的連接,總體程序如下: /* _romIRQ 及其它函數(shù)定義 */ _romIRQ; sub sp,sp,#4 stmfd sq1 , (r0) ldr r0,L$_promIRQ ldr r0,[r0] /* 裝載IRQ異常地址到R0 */ str r0,[sp,#4] ldmfd sp!,{r0,pc} /* 跳轉(zhuǎn)到異常服務(wù)程序 */ /* _romIRQ指向RAM中的位置 */ L$_promIRQ: .long S3C_EXC_BASE + 20 /* #define S3C_EXC_BASE 0x0c000100 */ /* 在真正RAM空間建立異常向量表,和VxWorks建立的向量表相同,只是位置不同 */ void s3cExcVecSet(void) { UINT32 i: ... i=(UINT32)intEnt; *((UINT32 *)(S3C_EXC_BASE + Ox14))=i; } 對以上代碼分析:當(dāng)中斷發(fā)生時(shí).程序跳轉(zhuǎn)到_romIRQ處,然后執(zhí)行出棧操作,把L$_promIRQ地址(0x0c000114=(s3c_EXC_BASE + 20))的內(nèi)容賦給程序計(jì)數(shù)器(PC);而上述vxwofks在RAM空間建立異常向量表時(shí),把異常中斷服務(wù)程序(intEnt)的地址放在地址0x0c00Oll4(s3C_EXC_BASE + 0x14)中,即PC=(UINT32) intEnt實(shí)現(xiàn)從ROM到RAM中斷的連接。 3.2 中斷驅(qū)動(dòng)中的回調(diào)函數(shù) VxWorks中intArchLib庫所包含的中斷系統(tǒng)函數(shù)與具體的處理器體系結(jié)構(gòu)相關(guān).其默認(rèn)體系結(jié)構(gòu)中不包含ARM處理器,所以此庫中的函數(shù)都要依賴于具體BsP提供的例程來完成其功能。VxWorks采用Hook的方法來實(shí)現(xiàn),針對本處理器的BSP,在sngkcIntrCtl.c文件中,定義了四個(gè)鉤子函數(shù): sysIntLvlVecChkRtn = sngks32cIntLvlVecChk;/* 中斷源檢測,返回中斷號 */ sysIntLvlEnableRtn = sngks32cIntLvlEnable; /* 使能相應(yīng)中斷 */, svslntLvlDisableRtn = sngks32cIntLvlDisable; /* 禁止相應(yīng)中斷 */, svsIntLvlvecAckRtn = sngks32cIntLvLAck; /* 清除中斷標(biāo)志位 */, 用來完成中斷驅(qū)動(dòng)。當(dāng)外部中斷發(fā)生時(shí),程序進(jìn)入intEnt函數(shù),運(yùn)行sysIntLvlVecChkRm鉤子函數(shù)讀中斷服務(wù)掛起寄存器(I_ISPR)來檢測中斷源,并返回中斷號,通過在intConnect函數(shù)中建立的中斷向量與中斷服務(wù)函數(shù)的連接,從而調(diào)用相應(yīng)的中斷服務(wù)程序。在中斷返回時(shí).執(zhí)行sysIntLvlvecAckRtn鉤子函數(shù)通過寫IRQ中斷掛起清零寄存器(I_ISPC),來清除剛處理完的中斷掛起位。完整的VxWorks基于S3C44BOX處理器的中斷響應(yīng)流圖如圖2所示: ![]() 圖2 VxWorks基于S3C44B0X處理器的中斷響應(yīng)流圖 4 實(shí)例分析 外部中斷EINT4/5/6/7共用一個(gè)中斷請求線,當(dāng)其中一個(gè)中斷發(fā)生時(shí),中斷掛起寄存器(INTPND)的EINT4/5/6/7位置1.具體是其中哪個(gè)發(fā)生中斷可通過讀外部中斷掛起寄存器(EXTINTPND)來判斷。 中斷服務(wù)程序連接 intConnect ((VOIDFUNCPTR *)INUM_TO_IVEC(21), (VOIDFUNCPTR)isr4567,0) 外部中斷使能 intEnable(21); /* 觸發(fā)鉤子函數(shù) */ svsIntLvlEnableRtn; /* 清中斷屏蔽寄存器(INTMSK)的EINT4/5/6/7位使能中斷? */ 中斷服務(wù)程序: void isr4567(void) { int j; intDisable(21); /* 關(guān)中斷 */ S3C44B0X_INT_REG_READ (S3C44BOX_EXTINTPND,j);/*讀外部中斷掛起寄存器 */ switch (j) /* 判斷外部中斷4/5/6/7具體為哪個(gè) */ { case 1: /* EINT4觸發(fā) */ semGive(semInt4); /* 釋放二值信號量,同步EINT服務(wù)程序 */ break: ⋯ /* EINT5,EINT6,EINT7觸發(fā)程序 */ } ⋯ /* 清外部中斷掛起位,使能外部中斷 */ } 在中斷服務(wù)程序設(shè)計(jì)中對處理代碼有諸多限制,如處理代碼應(yīng)盡量短,不能調(diào)用可能引起阻塞的任務(wù)等。針對這種限制,可以采用中斷服務(wù)程序分步處理法,具體是將原來的中斷服務(wù)程序分為新的中斷服務(wù)程序和中斷服務(wù)任務(wù)兩部分:新的中斷服務(wù)程序僅僅執(zhí)行最基本的中斷處理,例如禁止中斷、判斷中斷類型等;而絕大多數(shù)的中斷處理任務(wù),特別是有可能造成阻塞的任務(wù),都放在中斷服務(wù)任務(wù)中執(zhí)行。新的中斷服務(wù)程序和中斷服務(wù)任務(wù)采用二進(jìn)制信號量進(jìn)行同步(如上述程序設(shè)計(jì)所示),但中斷服務(wù)任務(wù)在創(chuàng)建時(shí)必須滿足在所有創(chuàng)建的任務(wù)中具有較高的優(yōu)先級,以使中斷發(fā)生時(shí)外部事件得到優(yōu)先處理,否則中斷響應(yīng)就失去其意義。 5 結(jié)束語 隨著計(jì)算機(jī)技術(shù)和控制技術(shù)快速發(fā)展,VxWorks實(shí)時(shí)嵌入式操作系統(tǒng)被廣泛應(yīng)用于各種設(shè)備和實(shí)時(shí)控制系統(tǒng)中,而硬件中斷處理在實(shí)時(shí)操作系統(tǒng)設(shè)計(jì)中起著十分重要的作用。針對嵌入式系統(tǒng)的硬件設(shè)計(jì)和軟件規(guī)劃,本文闡述了VxWorks的中斷處理機(jī)制,分析了VxWorks的中斷處理過程,提出了基于S3C44B0X處理器的中斷處理實(shí)現(xiàn)方法.提高了系統(tǒng)的實(shí)時(shí)性并滿足塒外部突發(fā)事件的及時(shí)處理.對從事實(shí)時(shí)系統(tǒng)的開發(fā)具有一定的參考和借鑒作用。 本文作者創(chuàng)新點(diǎn):首次深刻分析了VxWorks基于S3C44B0X處理器的中斷處理過程。并以實(shí)際外部中斷處理為例,提出了在中斷服務(wù)程序設(shè)計(jì)中采取的分步處理。 作者:錢華明,牛付震 來源:《微計(jì)算機(jī)信息》(嵌入式與SOC)2009年第5-2期 |