<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

PROLOG_END

和上面一樣,的入口處都是例行公事的計算返回位置以抵消流水線(xiàn)誤差。再將要用到的寄存器壓入STACK_IRQ。

; 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

上面這部分的內容是關(guān)于互鎖的檢測,由于如信號量這些同步手段都必須作為原子操作進(jìn)行,不允許打斷。所以如果發(fā)生在互鎖API的執行過(guò)程中,就需要專(zhuān)門(mén)的處理了。這些API都是放在INTERLOCKED_START和INTERLOCKED_END之間的,通過(guò)LR很容易就檢查出是否是INTERLOCKEDXXX的過(guò)程中。這里并不關(guān)心互鎖的實(shí)現就繞開(kāi)這部分代碼繼續往下看,當作沒(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 interrupt and they 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)行調度

beq

%B20

; interrupted, reschedule again

msr  spsr, r2

ldr  lr, [r0, #TcxPc-TcxR3]

ldmdb  r0,

movs  pc,

lr

; return to user or system mode

HandleException是實(shí)際進(jìn)行處理的函數,針對上面沒(méi)有處理完的進(jìn)一步分析并進(jìn)行處理。這個(gè)函數是沒(méi)有公開(kāi)代碼的,所以沒(méi)有辦法進(jìn)一步深入下去。由于處理的類(lèi)型比較多所以這個(gè)異常處理函數的代碼量是相當大的,因此會(huì )耗費相對比較多的時(shí)鐘周期,在之前的代碼中我們都是在關(guān)閉的情況下進(jìn)行異常處理,如果在這里還不打開(kāi)中斷的話(huà)整個(gè)異常處理過(guò)程會(huì )相當的長(cháng),這樣會(huì )很大程度上影響系統的實(shí)時(shí)性,所以在這里調用HandleException之前是將中斷重新打開(kāi)的,待到處理完成再將中斷關(guān)閉。對于這些異常,如果不能處理就只有兩種情況:1.結束該進(jìn)程/線(xiàn)程。2.掛起系統。第二種情況下掛起系統HandleException是不會(huì )返回的。因此,只有異常處理正常流程和結束線(xiàn)程的可能。對于返回的情況,這個(gè)時(shí)候如果返回觸發(fā)異常的地址繼續運行的話(huà),仍然會(huì )導致異常,所以結束進(jìn)程/線(xiàn)程都需要重新調度才能完成了。對于異常處理成功的情形,就不必調度了,直接就可以返回產(chǎn)生異常的地方繼續執行。在這里還要考慮套嵌(這里僅僅是指系統模式和兼管模式的異常套嵌)的情形,也就是中斷/異常已經(jīng)進(jìn)入調度狀態(tài)又再次產(chǎn)生中斷/異常,這個(gè)時(shí)候就強行取消上一次調度,進(jìn)而重新調度。這用于調度過(guò)程中遇到異?;謴秃蛣儕Z的情況,如果不屬于這種情況的話(huà)就直接恢復寄存器狀態(tài)并且返回中斷點(diǎn)繼續執行。

; Return to a non-preemptible privileged mode.

;

;   (r0) = ptr to THREAD structure

;   (r2) = target mode

30  msr  cpsr,

r2

; switch to target mode

add  r0, r0, #TcxR0

ldmia  r0,

; reload all registers return

通過(guò)HandleException處理以后,已經(jīng)完成了所有異常的處理,所以這里只是考慮反回的情況,由于這里不包含用戶(hù)模式下的處理,所以這里處理的都是特權模式,完全可以訪(fǎng)問(wèn)kdata區域,這里就直接利用Kdata區域中的線(xiàn)程備份來(lái)完成恢復寄存器和返回。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>