色偷偷偷久久伊人大杳蕉,色爽交视频免费观看,欧美扒开腿做爽爽爽a片,欧美孕交alscan巨交xxx,日日碰狠狠躁久久躁蜜桃

x
x

基于S3C44BOX處理器的VxWorks中斷設(shè)計

發(fā)布時間:2010-5-4 15:17    發(fā)布者:我芯依舊
關(guān)鍵詞: S3C44BOX , VxWorks , 中斷設(shè)計
引言

硬件中斷處理在實(shí)時操作系統(tǒng)設(shè)計中起著十分重要的作用,它是外部事件通知操作系統(tǒng)的最常用手段。中斷的正常運(yùn)行是操作系統(tǒng)穩(wěn)定工作的先決條件。VxWorks作為一款優(yōu)秀的實(shí)時嵌入式系統(tǒng),通常采用中斷的方式來滿足系統(tǒng)實(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ā)牛時,硬件邏輯根據(jù)異常類型給程序計數(shù)器(PC)強(qiáng)制賦值,使程序從表1給出的相應(yīng)的矢量地址開始執(zhí)行異常處理程序。在異常中斷向量表中指定了各異常中斷與其處理程序的對應(yīng)關(guān)系,一般來說,矢量地址處將包含一條指向相應(yīng)程序的轉(zhuǎn)移指令,從而可跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序。異常中斷向量表存放在存儲器的0地址處,大小為32字節(jié),每個異常中斷占4字節(jié)大小,保留了4字節(jié)空間。

表1 各異常中斷的向量地址以及中斷處理優(yōu)先


S3C44BOX的中斷控制器町以接收來自26個中斷源的30個中斷請求,其中有4個外部中斷(EINT/4/5/6/7)是邏輯或的關(guān)系,它們共用一條中斷請求線。當(dāng)片內(nèi)外圍中斷和片外中斷模式設(shè)定為IRQ時,如有多重中斷發(fā)生,中斷控制器經(jīng)過優(yōu)先級判斷選擇其中一個中斷,通過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è)置一個中斷保存堆棧.所有中斷的現(xiàn)場信息都統(tǒng)一保存在此堆棧中。堆棧的定位和大小初始化依據(jù)指定參數(shù)在系統(tǒng)啟動時進(jìn)行配置。對于堆棧的大小,必須足夠大,以滿足最壞情況下中斷嵌套的深度。


圖1 VxWorks中斷處理執(zhí)行流程

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

當(dāng)異常發(fā)生時,程序計數(shù)器(PC)會被強(qiáng)制為相應(yīng)異常處理程序的入口地址.然后進(jìn)行中斷源的識別,根據(jù)中斷號在中斷向量表中找到相應(yīng)中斷服務(wù)程序(ISR)的入口地址。VxWorks將異常向量表定位在RAM中,基地址為VEC_BASE_ADRS,在configA11.h中定義.一般為RAM存儲器的起始地址。在系統(tǒng)啟動初始化時,由intVecBaseSet()函數(shù)設(shè)置向量表的基地址。向量表地址設(shè)定后,需要初始化指定異常的缺省處理函數(shù)。VxWorks在映像的代碼段建立了一張中斷缺省函數(shù)表,函數(shù)excVecInit()根據(jù)這張表來設(shè)置向量表的各異常中斷向量值。需初始化的向量表范圍由LOW_VEC和HIGH_VEC確定,在excArchLib.h中定義。由于不同的處理器異常處理機(jī)制不同,有時需根據(jù)具體的異常處理來建立自己的異常向量表,具體建立實(shí)現(xiàn)過程在下面討論。

2.2 中斷服務(wù)程序的連接

VxWorks為中斷提供接口函數(shù)intConnect(),它將中斷服務(wù)程序(ISR)和中斷向量相關(guān)聯(lián)。在操作系統(tǒng)內(nèi)核啟動后,VxWorks建立與中斷號相對應(yīng)的中斷向量表,中斷向量表中的每個中斷向量包含中斷服務(wù)程序(ISR)的入口地址。當(dāng)中斷事件發(fā)生時.VxWorks內(nèi)核將調(diào)用與其中斷向量對應(yīng)的中斷服務(wù)程序。intConnect()原型如下:

STATUS intConnect
(
VOIDFUNCPTR  * vector, /* 要關(guān)聯(lián)的中斷向量 */
VOIDFUNCPTR routine, /*中斷發(fā)生時調(diào)用的函數(shù) */
int parameter  /*傳遞給lsR函數(shù)的參數(shù)*/
)

但實(shí)際上,中斷出現(xiàn)時并不是直接調(diào)用指定的中斷處理函數(shù)。而是,intConnect()函數(shù)將創(chuàng)建一小段代碼,這段代碼用以保存必要寄存器、設(shè)置堆棧入口、之后調(diào)用中斷處理函數(shù)。相反,當(dāng)從該函數(shù)返回時,這段代碼先恢復(fù)寄存器和堆棧,然后退出中斷。

3 VxWorks基于S3C44B0X的中斷處理

3.1 基于S3C44B0X處理器的VxWorks異常向量表的生成S3C44BOX處理器不支持內(nèi)存重定向操作,也就是每個片選的地址范圍是定死的,不能根據(jù)需要自己指定。啟動flash存儲器一直位于0地址,異常人口不能在運(yùn)行時寫入,故必須硬編碼將異常入口填寫在啟動flash的0地址處。romInit.s是系統(tǒng)上電時的初始人口程序.從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ā)生時如何把兩者連接起來.從而由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ā)生時.程序跳轉(zhuǎn)到_romIRQ處,然后執(zhí)行出棧操作,把L$_promIRQ地址(0x0c000114=(s3c_EXC_BASE + 20))的內(nèi)容賦給程序計數(shù)器(PC);而上述vxwofks在RAM空間建立異常向量表時,把異常中斷服務(wù)程序(intEnt)的地址放在地址0x0c00Oll4(s3C_EXC_BASE + 0x14)中,即PC=(UINT32) intEnt實(shí)現(xiàn)從ROM到RAM中斷的連接。

3.2 中斷驅(qū)動中的回調(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文件中,定義了四個鉤子函數(shù):

sysIntLvlVecChkRtn = sngks32cIntLvlVecChk;/* 中斷源檢測,返回中斷號 */
sysIntLvlEnableRtn = sngks32cIntLvlEnable; /* 使能相應(yīng)中斷 */,
svslntLvlDisableRtn = sngks32cIntLvlDisable; /* 禁止相應(yīng)中斷 */,
svsIntLvlvecAckRtn = sngks32cIntLvLAck; /* 清除中斷標(biāo)志位 */,

用來完成中斷驅(qū)動。當(dāng)外部中斷發(fā)生時,程序進(jìn)入intEnt函數(shù),運(yùn)行sysIntLvlVecChkRm鉤子函數(shù)讀中斷服務(wù)掛起寄存器(I_ISPR)來檢測中斷源,并返回中斷號,通過在intConnect函數(shù)中建立的中斷向量與中斷服務(wù)函數(shù)的連接,從而調(diào)用相應(yīng)的中斷服務(wù)程序。在中斷返回時.執(zhí)行sysIntLvlvecAckRtn鉤子函數(shù)通過寫IRQ中斷掛起清零寄存器(I_ISPC),來清除剛處理完的中斷掛起位。完整的VxWorks基于S3C44BOX處理器的中斷響應(yīng)流圖如圖2所示:


圖2 VxWorks基于S3C44B0X處理器的中斷響應(yīng)流圖

4 實(shí)例分析

外部中斷EINT4/5/6/7共用一個中斷請求線,當(dāng)其中一個中斷發(fā)生時,中斷掛起寄存器(INTPND)的EINT4/5/6/7位置1.具體是其中哪個發(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具體為哪個 */
{
case 1:  /* EINT4觸發(fā) */
semGive(semInt4);  /* 釋放二值信號量,同步EINT服務(wù)程序 */
break:
⋯  /* EINT5,EINT6,EINT7觸發(fā)程序 */
}
⋯  /* 清外部中斷掛起位,使能外部中斷 */
}

在中斷服務(wù)程序設(shè)計中對處理代碼有諸多限制,如處理代碼應(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è)計所示),但中斷服務(wù)任務(wù)在創(chuàng)建時必須滿足在所有創(chuàng)建的任務(wù)中具有較高的優(yōu)先級,以使中斷發(fā)生時外部事件得到優(yōu)先處理,否則中斷響應(yīng)就失去其意義。

5 結(jié)束語

隨著計算機(jī)技術(shù)和控制技術(shù)快速發(fā)展,VxWorks實(shí)時嵌入式操作系統(tǒng)被廣泛應(yīng)用于各種設(shè)備和實(shí)時控制系統(tǒng)中,而硬件中斷處理在實(shí)時操作系統(tǒng)設(shè)計中起著十分重要的作用。針對嵌入式系統(tǒng)的硬件設(shè)計和軟件規(guī)劃,本文闡述了VxWorks的中斷處理機(jī)制,分析了VxWorks的中斷處理過程,提出了基于S3C44B0X處理器的中斷處理實(shí)現(xiàn)方法.提高了系統(tǒng)的實(shí)時性并滿足塒外部突發(fā)事件的及時處理.對從事實(shí)時系統(tǒng)的開發(fā)具有一定的參考和借鑒作用。

本文作者創(chuàng)新點(diǎn):首次深刻分析了VxWorks基于S3C44B0X處理器的中斷處理過程。并以實(shí)際外部中斷處理為例,提出了在中斷服務(wù)程序設(shè)計中采取的分步處理。


作者:錢華明,牛付震      來源:《微計算機(jī)信息》(嵌入式與SOC)2009年第5-2期
本文地址:http://m.54549.cn/thread-10985-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表