国产强伦姧在线观看无码,中文字幕99久久亚洲精品,国产精品乱码在线观看,色桃花亚洲天堂视频久久,日韩精品无码观看视频免费

      您現(xiàn)在的位置:智能制造網(wǎng)>技術(shù)中心>WindowsCE異常和中斷服務(wù)程序初探

      直播推薦

      更多>

      企業(yè)動(dòng)態(tài)

      更多>

      推薦展會(huì)

      更多>

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

      2009年03月12日 16:38:48人氣:956來(lái)源:浙江啟揚(yáng)智能科技有限公司

      1。中斷/異常相量的裝入和執(zhí)行方式。     
            中斷和異常都是異步發(fā)生的事件,當(dāng)該事件發(fā)生,系統(tǒng)將停止目前正在執(zhí)行的代碼轉(zhuǎn)而執(zhí)行事件響應(yīng)的服務(wù)程序。而事件服務(wù)程序的入口點(diǎn)就是中斷/異常向量所在的位置。arm的中斷向量可以是0x0開(kāi)始的低地址向量,也可以是在FFFF0000位置的高向量地址。winCE下使用高地址作為trap區(qū),所以在CE下arm使用高地址向量。下面我們來(lái)了解一下中斷/異常向量的安裝和執(zhí)行過(guò)程。
      在kernelStart的過(guò)程中通過(guò)程序?qū)⑷缦麓a復(fù)制到ffff0000的位置.
      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ù),每一項(xiàng)(32bit)對(duì)應(yīng)一個(gè)異常的跳轉(zhuǎn)地址也就是winCE的異常/中斷向量跳轉(zhuǎn)表。該表項(xiàng)的內(nèi)容就是發(fā)生異常后將要執(zhí)行的服務(wù)程序的入口地址。具體如下。
      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ā)一個(gè)異常就自動(dòng)運(yùn)行到相應(yīng)跳轉(zhuǎn)表項(xiàng)所對(duì)應(yīng)的地址執(zhí)行。
       
      2.異常/中斷服務(wù)程序
        在arm下,由于有7種異常狀態(tài)包括reset、Undef exception、software interrupt(swi)、Prefech Abort、DataAbort、IRQ、FIQ七種異常/中斷。reset僅在復(fù)位時(shí)發(fā)生,其他6種都是在系統(tǒng)運(yùn)行時(shí)發(fā)生。當(dāng)任何一個(gè)異常發(fā)生并得到響應(yīng)時(shí),ARM 內(nèi)核自動(dòng)完成以下動(dòng)作:
      拷貝 CPSR 到 SPSR_
      設(shè)置適當(dāng)?shù)?CPSR 位:
      改變處理器狀態(tài)進(jìn)入 ARM 狀態(tài)
      改變處理器模式進(jìn)入相應(yīng)的異常模式
      設(shè)置中斷禁止位禁止相應(yīng)中斷
      更新 LR_
      設(shè)置 PC 到相應(yīng)的異常向量
      同時(shí)不管異常發(fā)生在ARM 還是Thumb 狀態(tài)下,處理器都將自動(dòng)進(jìn)入ARM 狀態(tài)。并且中斷使能會(huì)自動(dòng)被關(guān)閉。在這個(gè)時(shí)候由于部分通用寄存器是不同模式公用的,所以還需要保存這些將會(huì)被破壞的寄存器,待到處理完成的時(shí)候恢復(fù)這些寄存器被中斷前的狀態(tài)。另外在進(jìn)入異常模式后,lr的值不一定就是我們所需恢復(fù)執(zhí)行的位置,該位置受到異常類型和流水線誤差的影響。在SWI模式下,LR就是返回值。在IRQ和FIQ中LR=LR-4,DataAbort下LR=LR-8;具體原因我們就不討論了,有興趣可以參看<基于ARM 的嵌入式程序開(kāi)發(fā)要點(diǎn)>一文。下面分別對(duì)這些服務(wù)程序進(jìn)行分析。
        
      2-1.undef exception服務(wù)程序
           
      undef exception在執(zhí)行到過(guò)非法的指令時(shí)產(chǎn)生,通常來(lái)模擬一些處理器不支持的功能,如浮點(diǎn)運(yùn)算。簡(jiǎn)單說(shuō)一下undef exception的過(guò)程:當(dāng)當(dāng)前指令為一條處理器不支持的指令時(shí),處理器會(huì)自動(dòng)動(dòng)將該指令送交各協(xié)處理器(如MMU、FPU)處理,如果這些協(xié)處理器都無(wú)法識(shí)別這條指令的時(shí)候,就產(chǎn)生該異常。下面開(kāi)始看相應(yīng)的代碼。
              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模式下的代碼去掉),通過(guò)lr-=4計(jì)算出觸發(fā)異常前的指令地址,同時(shí)保存r0-r3和lr入undef_exception stack用于zui后恢復(fù)現(xiàn)場(chǎng)和取得異常指令本身,monHandler是一個(gè)公共的異常服務(wù)程序,它通過(guò)不同的傳入?yún)?shù)來(lái)進(jìn)行處理,在這里mov r1,#ID_UNDEF_INSTR就是異常模式為undef Exception.
       
      2-2.swi服務(wù)程序
           
            按在ARM處理器的設(shè)計(jì)意圖,系統(tǒng)軟件的系統(tǒng)調(diào)用(SystemCalls)都是通過(guò)SWI指令完成。SWI相當(dāng)于一個(gè)中斷指令,不同的是SWI不是由外部中斷源產(chǎn)生的,同時(shí)對(duì)應(yīng)于SWI的異常向量位于0xc的位置或0xffff 000c的位置。也就是說(shuō)當(dāng)執(zhí)行一個(gè)swi指令后,當(dāng)前程序流中斷,并轉(zhuǎn)入0xc或0xffff000c執(zhí)行,同時(shí)將CPSR_mode(當(dāng)前程序狀態(tài)寄存器)復(fù)制入SPSR_svc,轉(zhuǎn)入SVC模式運(yùn)行(使用特權(quán)模式的寄存器組)。也就是說(shuō)系統(tǒng)通過(guò)執(zhí)行SWI引發(fā)系統(tǒng)swi異常后切換入特權(quán)模式,系統(tǒng)調(diào)用功能號(hào)由swi xx后的xx決定,在運(yùn)行完功能的代碼后返回異常時(shí)的地址并恢復(fù)用戶模式。我們看看,Wince中這部分代碼是如何實(shí)現(xiàn)的。
              DCD     SWIHandler                      ; SVC<<--------------------------SWI入口點(diǎn)。
              
           LEAF_ENTRY SWIHandler
        IF {FALSE}               
        ...
        ENDIF
              movs    pc, lr
              ENTRY_END SWIHandler
              上面IF {FALSE}到ENDIF之間的代碼在編譯的時(shí)候是得不到編譯的(事實(shí)上這部分代碼是用于開(kāi)發(fā)中調(diào)試使用的,針對(duì)特殊的硬件平臺(tái),一般與我們使用的硬件平臺(tái)無(wú)關(guān)。所以下面摘抄的代碼都不將不參與編譯的內(nèi)容寫(xiě)入),因此SWI服務(wù)程序就是一句話。movs    pc, lr也就是直接回到SWI的地方,同時(shí)將SPSR_svc恢復(fù)到CPSR_mode中。這個(gè)過(guò)程中并沒(méi)有進(jìn)行在系統(tǒng)態(tài)執(zhí)行特定系統(tǒng)指令序的工作,而僅僅是簡(jiǎn)單的返回,所以這不是系統(tǒng)調(diào)用,系統(tǒng)調(diào)用還需要根據(jù)調(diào)用號(hào)的不同運(yùn)行的核心態(tài)代碼。也就是說(shuō)Wince的系統(tǒng)調(diào)用不是通過(guò)SWI來(lái)完成的,而是通過(guò)其他的異常處理手段達(dá)成的。


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

      IRQ(大概是zui熟悉的異常方式了)在外部中斷源在需要向處理器請(qǐng)求服務(wù)時(shí)發(fā)生,比如:時(shí)鐘、外圍器件FIFO上/下溢出、按鍵等等。IRQHandler就是中斷的處理句柄,下面我們來(lái)具體看看。
      ----------------------------------------------------------------------------------    
          NESTED_ENTRY IRQHandler
              sub     lr, lr, #4                      ; fix return address
              stmfd   sp!, {r0-r3, r12, lr}       ;保存將要用到的寄存器和lr壓入stack_irq
              PROLOG_END
              和上面一樣,服務(wù)程序的入口處都是例行公事的計(jì)算返回位置以抵消流水線誤差。再將要用到的寄存器壓入STACK_IRQ,這樣,準(zhǔn)備工作就做完了。
              ; Test interlocked API status.       
              ;INTERLOCKED_START EQU USER_KPAGE+0x380
          ;INTERLOCKED_END EQU USER_KPAGE+0x400
              sub     r0, lr, #INTERLOCKED_START
              cmp     r0, #INTERLOCKED_END-INTERLOCKED_START
              bllo    CheckInterlockedRestart
              上面這部分的內(nèi)容是關(guān)于互鎖的檢測(cè),由于如信號(hào)量這些同步手段都必須作為原子操作進(jìn)行,不允許打斷。所以如果中斷發(fā)生在互鎖API的執(zhí)行過(guò)程中,就需要專門的處理了。這些API都是放在INTERLOCKED_START和INTERLOCKED_END之間的,通過(guò)LR很容易就檢查出是否是INTERLOCKEDXXX的過(guò)程中。這里并不關(guān)心互鎖的實(shí)現(xiàn)就繞開(kāi)這部分代碼繼續(xù)往下看,當(dāng)作中斷沒(méi)有發(fā)生在interlock過(guò)程處理。
              ;
              ; CAREFUL! The stack frame is being altered here. It''s ok since
              ; the only routine relying on this was the Interlock Check. Note that
              ; we re-push LR onto the stack so that the incoming argument area to
              ; OEMInterruptHandler will be correct.
              ;
              mrs     r1, spsr                        ; (r1) = saved status reg
              stmfd   sp!, {r1}                       ; save SPSR onto the IRQ stack   
              mov     r0,lr                           ; parameter to OEMInterruptHandler
           msr     cpsr_c, #SVC_MODE:OR:0x80       ; switch to supervisor mode w/IRQs disabled
              stmfd   sp!, {lr}                       ; save LR onto the SVC stack       
              stmfd   sp!, {r0}                       ; save IRQ LR (in R0) onto the SVC stack (param)
              ;
              ; Now we call the OEM''s interrupt handler code. It is up to them to
              ; enable interrupts if they so desire. We can''t do it for them since
              ; there''s only on interruptthey haven''t yet defined their nesting.
              ;

              CALL    OEMInterruptHandler
              ldmfd   sp!, {r1}                       ; dummy pop (parameter)
              ldmfd   sp!, {lr}                       ; restore SVC LR from the SVC stack
              msr     cpsr_c, #IRQ_MODE:OR:0x80       ; switch back to IRQ mode w/IRQs disabled
          ; Restore the saved program status register from the stack.
              ;
              ldmfd   sp!, {r1}                       ; restore IRQ SPSR from the IRQ stack
              msr     spsr, r1                        ; (r1) = saved status reg
              ldr     lr, =KData                      ; (lr) = ptr to KDataStruct
             
             
              cmp     r0, #SYSINTR_RESCHED      ;->時(shí)間片已到,進(jìn)行調(diào)度
              beq     %F10           
              ;SYSINTR_DEVICES EQU 8         ;是否設(shè)備中斷,中斷號(hào)是否有效
          ;SYSINTR_MAX_DEVICES EQU 32   
              sub     r0, r0, #SYSINTR_DEVICES
              cmp     r0, #SYSINTR_MAX_DEVICES
                                  ;由此可以看出windowsCE的系統(tǒng)中斷號(hào)zui大支持32種從9-40.
                                  ;其中第16號(hào)(24)被定義為SYSINTR_FIRMWARE
              ; If not a device request (and not SYSINTR_RESCHED)
             
              ldrhsb  r0, [lr, #bResched]             ; (r0) = reschedule flag
              bhs     %F20                            ; not a device request
             
              ;PendEvents  EQU 0x340             ; offset 0x10*sizeof(DWORD) of aInfo
                                  ;device 中斷
              ldr     r2, [lr, #PendEvents]           ; (r2) = pending interrupt event mask
              mov     r1, #1
              orr     r2, r2, r1, LSL r0              ; (r2) = new pending mask
              str     r2, [lr, #PendEvents]           ; save it
          ;*PendEvents = *PendEvents|(1<        ;
              ; mark reschedule needed
                                  ;情況1:r0=SYSINTR_RESCHED=1
                                  ;情況2: r0 =r0-SYSINTR_DEVICES>=SYSINTR_MAX_DEVICES       
      10      ldrb    r0, [lr, #bResched]             ; (r0) = reschedule flag
              orr     r0, r0, #1                      ; set "reschedule needed bit"
              strb    r0, [lr, #bResched]             ; flag

      20      mrs     r1, spsr                        ; (r1) = saved status register value
              and     r1, r1, #0x1F                   ; (r1) = interrupted mode
              cmp     r1, #USER_MODE                  ; previously in user mode?
              cmpne   r1, #SYSTEM_MODE                ; if not, was it system mode?
              cmpeq   r0, #1                          ; user or system: is resched == 1
              ;if(SytemMode(spsr)||UserMode(spsr))&&r0!=1) return;
              ldmnefd sp!, {r0-r3, r12, pc}^          ; can''t reschedule right now so return
        *************************************************************************************
              sub     lr, lr, #4
              ldmfd   sp!, {r0-r3, r12}
              stmdb   lr, {r0-r3}
              ldmfd   sp!, {r0}
              str     r0, [lr]                        ; save resume address
              mov     r1, #ID_RESCHEDULE              ; (r1) = exception ID
              b       CommonHandler
              ENTRY_END IRQHandler
          將spsr_irq壓入IRQ堆棧保存。為調(diào)用OEMInterruptHandler作準(zhǔn)備。(通常中斷處理程序切換入系統(tǒng)態(tài)執(zhí)行的目的在于避免使用終端模式下的寄存器,以方便是實(shí)現(xiàn)終端套嵌,這兒切入系統(tǒng)態(tài)時(shí)終端使能是關(guān)閉的,對(duì)于模態(tài)切換的原因我很迷惑。)OEMInterrupt需要在特權(quán)模式下執(zhí)行,所以這里增加了切換入特權(quán)(SVC)模式的內(nèi)容。緊接著將要用與傳遞參數(shù)的寄存器保存。設(shè)定傳入?yún)?shù),r0就可以開(kāi)始調(diào)用OEMInterruptHandler了,這里的調(diào)用規(guī)則遵循windowsCE的規(guī)范而不是ATPCS的規(guī)范。具體過(guò)程參考ARM Parameter Passing@msdn。下面是函數(shù)原形。int OEMInterruptHandler(unsigned int ra);這里傳入的參數(shù)就是上面的r0,事實(shí)上r0代表的參數(shù)ra并沒(méi)有實(shí)質(zhì)的作用在這里僅僅是形式上的實(shí)現(xiàn)一下而已,不過(guò)在這兒可以看到這個(gè)傳入的ra實(shí)際上就是被中斷的地址,如果需要知道被中斷的位置可以通過(guò)ra來(lái)查詢,而msdn里面說(shuō)這個(gè)參數(shù)是保留的。返回的參數(shù)也是保存在r0中。其中返回值是系統(tǒng)中斷類型。其中SYSINTR_RESCHED為系統(tǒng)時(shí)鐘中斷,每次時(shí)間片用完,該時(shí)鐘便產(chǎn)生中斷,并設(shè)置kData結(jié)構(gòu)的bResched位,進(jìn)入調(diào)度流程。如果中斷類型是系統(tǒng)設(shè)備中斷,那就設(shè)置PendEvents,待再次調(diào)度的時(shí)候處理中斷。所以O(shè)EMInterruptHandler必須提前就要對(duì)中斷進(jìn)行響應(yīng)對(duì)該中斷源設(shè)置mask,防止在這過(guò)程中同一中斷不停發(fā)生,導(dǎo)致中斷飽和影響程序流的執(zhí)行,直道中斷處理真正完成后再次開(kāi)放該中斷的mask。在這里還可以看到的是系統(tǒng)設(shè)備中斷號(hào)的范圍是從SYSINTR_DEVICES到SYSINTR_MAX_DEVICES,也就是從9-40一共32個(gè)設(shè)備中斷號(hào),其中SYSINTR_FIRMWARE為8+16號(hào),這個(gè)在編寫(xiě)OAL的中斷服務(wù)程序時(shí)需要注意。如果當(dāng)前的返回值既不是設(shè)備中斷號(hào)又不是調(diào)度中斷號(hào),則讀出當(dāng)前調(diào)度標(biāo)示,根據(jù)該標(biāo)示進(jìn)行判斷是否調(diào)度/或返回.如果是進(jìn)入調(diào)度流程則恢復(fù)初始的寄存器狀態(tài),再按CommonHandler的要求保存寄存器。進(jìn)入CommonHandler,等待分發(fā)。
         
      2-3 FIQ服務(wù)程序
              照例看看程序
              NESTED_ENTRY FIQHandler
              sub     lr, lr, #4                      ; fix return address
              stmfd   sp!, {r0-r3, r12, lr}
              PROLOG_END
              CALL    OEMInterruptHandlerFIQ
              ldmfd   sp!, {r0-r3, r12, pc}^          ; restore regs & return for NOP
              ENTRY_END FIQHandler
              LTORG

      FIQ是arm體系下*的異常方式,其工作過(guò)程與IRQ類似都是由外部引腳觸發(fā)但設(shè)計(jì)用途不同,IRQ用于通常的外部中斷源的處理,是作為統(tǒng)一、通用的與外部器件交互的手段,而IRQ僅僅用于處理周期短同時(shí)又需要快速處理的場(chǎng)合其觸發(fā)的事件源通常也來(lái)此外部FIQ中斷。如:更換電池、數(shù)據(jù)傳輸這類工作??上攵狥IQ講究的是快速,精干。因此FIQ服務(wù)程序通常沒(méi)有分發(fā),而僅僅是針對(duì)單一的工作進(jìn)行處理保證處理的實(shí)時(shí)性。因此FIQ的處理相對(duì)IRQ就簡(jiǎn)單很多,直接調(diào)用
      OEMInterruptHandlerFIQ進(jìn)行處理后返回就完成了整個(gè) FIQ服務(wù)程序。

      全年征稿/資訊合作 聯(lián)系郵箱:1271141964@qq.com

      免責(zé)聲明

      • 凡本網(wǎng)注明"來(lái)源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請(qǐng)必須注明智能制造網(wǎng),http://towegas.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
      • 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
      • 本網(wǎng)轉(zhuǎn)載并注明自其它來(lái)源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品來(lái)源,并自負(fù)版權(quán)等法律責(zé)任。
      • 如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

      <
      更多 >

      工控網(wǎng)機(jī)器人儀器儀表物聯(lián)網(wǎng)3D打印工業(yè)軟件金屬加工機(jī)械包裝機(jī)械印刷機(jī)械農(nóng)業(yè)機(jī)械食品加工設(shè)備制藥設(shè)備倉(cāng)儲(chǔ)物流環(huán)保設(shè)備造紙機(jī)械工程機(jī)械紡織機(jī)械化工設(shè)備電子加工設(shè)備水泥設(shè)備海洋水利裝備礦冶設(shè)備新能源設(shè)備服裝機(jī)械印染機(jī)械制鞋機(jī)械玻璃機(jī)械陶瓷設(shè)備橡塑設(shè)備船舶設(shè)備電子元器件電氣設(shè)備


      我要投稿
      • 投稿請(qǐng)發(fā)送郵件至:(郵件標(biāo)題請(qǐng)備注“投稿”)1271141964.qq.com
      • 聯(lián)系電話0571-89719789
      工業(yè)4.0時(shí)代智能制造領(lǐng)域“互聯(lián)網(wǎng)+”服務(wù)平臺(tái)
      智能制造網(wǎng)APP

      功能豐富 實(shí)時(shí)交流

      智能制造網(wǎng)小程序

      訂閱獲取更多服務(wù)

      微信公眾號(hào)

      關(guān)注我們

      抖音

      智能制造網(wǎng)

      抖音號(hào):gkzhan

      打開(kāi)抖音 搜索頁(yè)掃一掃

      視頻號(hào)

      智能制造網(wǎng)

      公眾號(hào):智能制造網(wǎng)

      打開(kāi)微信掃碼關(guān)注視頻號(hào)

      快手

      智能制造網(wǎng)

      快手ID:gkzhan2006

      打開(kāi)快手 掃一掃關(guān)注
      意見(jiàn)反饋
      關(guān)閉
      企業(yè)未開(kāi)通此功能
      詳詢客服 : 0571-87858618