• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 初探WindowsCE異常和中斷服務(wù)程序

    初探WindowsCE異常和中斷服務(wù)程序

    作者: 時間:2012-10-31 來源:網(wǎng)絡(luò) 收藏

    1./相量的裝入和執(zhí)行方式

    本文引用地址:http://www.czjhyjcfj.com/article/148296.htm

    都是異步發(fā)生的事件,當該事件發(fā)生,系統(tǒng)將停止目前正在執(zhí)行的代碼轉(zhuǎn)而執(zhí)行事件響應的。而事件的入口點就是/向量所在的位置。ARM的中斷向量可以是0x0開始的低地址向量,也可以是在FFFF0000位置的高向量地址。winCE下使用高地址作為trap區(qū),所以在CE下arm使用高地址向量。

    VectorINStructiONs

    ldr pc, [pc, #0x3E0-8] ; reset

    ldr pc, [pc, #0x3E0-8] ; undefined inSTruction

    ldr pc, [pc, #0x3E0-8] ; SVC

    ldr pc, [pc, #0x3E0-8] ; Prefetch abort

    ldr pc, [pc, #0x3E0-8] ; data abort

    ldr pc, [pc, #0x3E0-8] ; unused vector location

    ldr pc, [pc, #0x3E0-8] ; IRQ

    ldr pc, [pc, #0x3E0-8] ; FIQ

    而在ffff03e0的位置放上如下的數(shù)據(jù),每一項(32bit)對應一個異常的跳轉(zhuǎn)地址也就是winCE的異常/中斷向量跳轉(zhuǎn)表。該表項的內(nèi)容就是發(fā)生異常后將要執(zhí)行的的入口地址。具體如下。

    VectorTable

    DCD -1 ; reset

    DCD UndefException ; undefined instruction

    DCD SWIHandler ; SVC

    DCD PrefetchAbort ; Prefetch abort

    IF :DEF:ARMV4T :LOR: :DEF:ARMV4I

    DCD OEMDataAbortHandler ; data abort

    ELSE

    DCD DataAbortHandler ; data abort

    ENDIF

    DCD -1 ; unused vector

    DCD IRQHandler ; IRQ

    DCD FIQHandler ; FIQ

    在上面的這些代碼/數(shù)據(jù)在內(nèi)存空間上按照上述要求放置好以后,每次觸發(fā)一個異常就自動運行到相應跳轉(zhuǎn)表項所對應的地址執(zhí)行。

    2.異常/中斷服務(wù)程序

    在arm下,由于有7種異常狀態(tài)包括reset、Undef exception、software interrupt(swi)、Prefech Abort、DataAbort、IRQ、FIQ七種異常/中斷。reset僅在復位時發(fā)生,其他6種都是在系統(tǒng)運行時發(fā)生。當任何一個異常發(fā)生并得到響應時,ARM 內(nèi)核自動完成以下動作:

    拷貝 CPSR 到 SPSR_

    設(shè)置適當?shù)?CPSR 位:

    改變處理器狀態(tài)進入 ARM 狀態(tài)

    改變處理器模式進入相應的異常模式

    設(shè)置中斷禁止位禁止相應中斷

    更新 LR_

    設(shè)置 PC 到相應的異常向量

    同時不管異常發(fā)生在ARM 還是Thumb 狀態(tài)下,處理器都將自動進入ARM 狀態(tài)。并且中斷使能會自動被關(guān)閉。在這個時候由于部分通用寄存器是不同模式公用的,所以還需要保存這些將會被破壞的寄存器,待到處理完成的時候恢復這些寄存器被中斷前的狀態(tài)。另外在進入異常模式后,lr的值不一定就是我們所需恢復執(zhí)行的位置,該位置受到異常類型和流水線誤差的影響。在SWI模式下,LR就是返回值。在IRQ和FIQ中LR=LR-4,DataAbort下LR=LR-8;下面分別對這些服務(wù)程序進行分析。

    2-1.undef exception服務(wù)程序

    undef exception在執(zhí)行到過非法的指令時產(chǎn)生,通常來模擬一些處理器不支持的功能,如浮點運算。簡單說一下undef exception的過程:當當前指令為一條處理器不支持的指令時,處理器會自動動將該指令送交各協(xié)處理器(如MMU、FPU)處理,如果這些協(xié)處理器都無法識別這條指令的時候,就產(chǎn)生該異常。下面開始看相應的代碼。

    NESTED_ENTRY UndefException

    sub lr, lr, #4 ; (lr) = address of undefined instruction

    stmdb sp, {r0-r3, lr}

    mov r1, #ID_UNDEF_INSTR

    b CommonHandler

    ENTRY_END UndefException

    上面就是undef Exception的服務(wù)程序的入口處(已經(jīng)將不參與編譯和Thumb模式下的代碼去掉),通過lr-=4計算出觸發(fā)異常前的指令地址,同時保存r0-r3和lr入undef_exception stack用于最后恢復現(xiàn)場和取得異常指令本身,隨后進入分發(fā)程序CommonHandler.CommonHandler是一個公共的異常服務(wù)程序,它通過不同的傳入?yún)?shù)來進行處理,在這里mov r1,#ID_UNDEF_INSTR就是指定異常模式為undef Exception.

    2-2.swi服務(wù)程序

    按在ARM處理器的設(shè)計意圖,系統(tǒng)軟件的系統(tǒng)調(diào)用(systemCalls)都是通過SWI指令完成。SWI相當于一個中斷指令,不同的是SWI不是由外部中斷源產(chǎn)生的,同時對應于SWI的異常向量位于0xc的位置或0xffff 000c的位置。也就是說當執(zhí)行一個swi指令后,當前程序流中斷,并轉(zhuǎn)入0xc或0xffff000c執(zhí)行,同時將CPSR_mode(當前程序狀態(tài)寄存器)復制入SPSR_svc,轉(zhuǎn)入SVC模式運行(使用特權(quán)模式的寄存器組)。也就是說系統(tǒng)通過執(zhí)行SWI引發(fā)系統(tǒng)swi異常后切換入特權(quán)模式,系統(tǒng)調(diào)用功能號由swi xx后的xx決定,在運行完指定功能的代碼后返回異常時的地址并恢復用戶模式。Wince中這部分代碼是如何實現(xiàn)的。

    DCD SWIHandler ; SVC《--------------------------SWI入口點。

    LEAF_ENTRY SWIHandler

    IF {FALSE}

    ENDIF

    movs pc, lr

    ENTRY_END SWIHandler

    上面IF {FALSE}到ENDIF之間的代碼在編譯的時候是得不到編譯的(事實上這部分代碼是用于開發(fā)中調(diào)試使用的,針對特殊的硬件平臺,一般與我們使用的硬件平臺無關(guān)。所以下面摘抄的代碼都不將不參與編譯的內(nèi)容寫入),因此SWI服務(wù)程序就是一句話。movs pc, lr也就是直接回到SWI的地方,同時將SPSR_svc恢復到CPSR_mode中。這個過程中并沒有進行在系統(tǒng)態(tài)執(zhí)行特定系統(tǒng)指令序的工作,而僅僅是簡單的返回,所以這不是系統(tǒng)調(diào)用,系統(tǒng)調(diào)用還需要根據(jù)調(diào)用號的不同運行指定的核心態(tài)代碼。也就是說Wince的系統(tǒng)調(diào)用不是通過SWI來完成的,而是通過其他的異常處理手段達成的。

    2-3 中斷服務(wù)程序

    IRQ(大概是最熟悉的異常方式了)在外部中斷源在需要向處理器請求服務(wù)時發(fā)生,比如:時鐘、外圍器件FIFO上/下溢出、按鍵等等。IRQHandler就是中斷的處理句柄,具體如下。

    ----------------------------------------------------------------------------------

    NESTED_ENTRY IRQHandler

    sub lr, lr, #4 ; fix return address

    stmfd sp!, {r0-r3, r12, lr} ;保存將要用到的寄存器和lr壓入stack_irq


    上一頁 1 2 下一頁

    評論


    相關(guān)推薦

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

    關(guān)閉
    主站蜘蛛池模板: 桃园市| 吴堡县| 新昌县| 鄂州市| 宁武县| 北川| 申扎县| 海南省| 岑溪市| 靖州| 昆明市| 中阳县| 宝山区| 武汉市| 措美县| 忻州市| 菏泽市| 仁布县| 施甸县| 桦甸市| 东山县| 荥经县| 通化市| 凤台县| 拉孜县| 安庆市| 宝清县| 新安县| 嘉黎县| 平谷区| 乳源| 土默特左旗| 大理市| 大丰市| 阿巴嘎旗| 曲松县| 康保县| 新昌县| 兴城市| 甘谷县| 东丽区|