精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

通過HandleException處理所有異常

電子設(shè)計(jì) ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-08-28 10:26 ? 次閱讀

NasIRy

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

中斷和異常都是異步發(fā)生的事件,當(dāng)該事件發(fā)生,系統(tǒng)將停止目前正在執(zhí)行的代碼轉(zhuǎn)而執(zhí)行事件響應(yīng)的服務(wù)程序。而事件服務(wù)程序的入口點(diǎn)就是中斷/異常向量所在的位置。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ù),每一項(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;下面分別對(duì)這些服務(wù)程序進(jìn)行分析。

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

undef exception在執(zhí)行到過非法的指令時(shí)產(chǎn)生,通常來模擬一些處理器不支持的功能,如浮點(diǎn)運(yùn)算。簡(jiǎn)單說一下undef exception的過程:當(dāng)當(dāng)前指令為一條處理器不支持的指令時(shí),處理器會(huì)自動(dòng)動(dòng)將該指令送交各協(xié)處理器(如MMU、FPU)處理,如果這些協(xié)處理器都無法識(shí)別這條指令的時(shí)候,就產(chǎn)生該異常。下面開始看相應(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模式下的代碼去掉),通過lr-=4計(jì)算出觸發(fā)異常前的指令地址,同時(shí)保存r0-r3和lr入undef_exception stack用于最后恢復(fù)現(xiàn)場(chǎng)和取得異常指令本身,隨后進(jìn)入分發(fā)程序CommonHandler.CommonHandler是一個(gè)公共的異常服務(wù)程序,它通過不同的傳入參數(shù)來進(jìn)行處理,在這里mov r1,#ID_UNDEF_INSTR就是指定異常模式為undef Exception.

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

按在ARM處理器的設(shè)計(jì)意圖,系統(tǒng)軟件的系統(tǒng)調(diào)用(SystemCalls)都是通過SWI指令完成。SWI相當(dāng)于一個(gè)中斷指令,不同的是SWI不是由外部中斷源產(chǎn)生的,同時(shí)對(duì)應(yīng)于SWI的異常向量位于0xc的位置或0xffff 000c的位置。也就是說當(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)模式的寄存器組)。也就是說系統(tǒng)通過執(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í)上這部分代碼是用于開發(fā)中調(diào)試使用的,針對(duì)特殊的硬件平臺(tái),一般與我們使用的硬件平臺(tái)無關(guān)。所以下面摘抄的代碼都不將不參與編譯的內(nèi)容寫入),因此SWI服務(wù)程序就是一句話。movs pc, lr也就是直接回到SWI的地方,同時(shí)將SPSR_svc恢復(fù)到CPSR_mode中。這個(gè)過程中并沒有進(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)代碼。也就是說Wince的系統(tǒng)調(diào)用不是通過SWI來完成的,而是通過其他的異常處理手段達(dá)成的。

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

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

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

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。

; 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í)行過程中,就需要專門的處理了。這些API都是放在INTERLOCKED_START和INTERLOCKED_END之間的,通過LR很容易就檢查出是否是INTERLOCKEDXXX的過程中。這里并不關(guān)心互鎖的實(shí)現(xiàn)就繞開這部分代碼繼續(xù)往下看,當(dāng)作中斷沒有發(fā)生在interlock過程處理。

;

; 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)行調(diào)度

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

; 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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19169

    瀏覽量

    229155
  • SWI
    SWI
    +關(guān)注

    關(guān)注

    0

    文章

    56

    瀏覽量

    22880
  • WinCE
    +關(guān)注

    關(guān)注

    2

    文章

    128

    瀏覽量

    49009
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    用OPA2353UA做電壓跟隨器時(shí),輸出有異常,是什么原因呢?

    請(qǐng)教下,我是用OPA2353UA做電壓跟隨器時(shí),輸出有異常,是什么原因呢? 輸出波形如下
    發(fā)表于 08-07 08:19

    OPA615在輸入為0 mv時(shí),輸出有異常直流電平怎么解決?

    OPA615在輸入為0 mv時(shí),輸出有異常直流電平問題
    發(fā)表于 08-09 07:28

    Java中的常用異常處理方法 java推薦

    finally 代碼塊中,可以運(yùn)行清理類型等收尾善后性質(zhì)的語句。聲明自定義異常在Java中可以自定義異常,在自定義異常類時(shí)需注意以下幾點(diǎn):1. 所有異常都必須是 Throwable
    發(fā)表于 01-19 17:26

    網(wǎng)絡(luò)爬蟲常見異常情況

    的關(guān)系,即HTTPError是URLError的子類,HTTPError有異常狀態(tài)碼與異常原因,URLError沒有異常狀態(tài)碼。所以,我們?cè)?b class='flag-5'>處理的時(shí)候,不能使用URLError直接代替
    發(fā)表于 05-09 17:26

    請(qǐng)問SYS/BIOS中有異常機(jī)制嗎?用戶可以自己設(shè)置異常處理函數(shù)嗎?

    本帖最后由 一只耳朵怪 于 2018-6-20 10:53 編輯 請(qǐng)問SYS/BIOS中有異常機(jī)制嗎?用戶可以自己設(shè)置異常處理函數(shù)嗎?目前開發(fā)用的C6678+SYS/BIOS。
    發(fā)表于 06-20 01:22

    多通道AD使用讀多個(gè)通道數(shù)據(jù)有異常

    用一多通道AD7734轉(zhuǎn)換4路模擬量,四通道單獨(dú)用均好使;多通道啟動(dòng)后讀任意一個(gè)通道數(shù)據(jù)正常,讀多個(gè)通道數(shù)據(jù)有異常,請(qǐng)教原因,望不吝賜教,謝謝!
    發(fā)表于 11-19 09:13

    Java捕獲異常處理的常用方法

    finally 代碼塊中,可以運(yùn)行清理類型等收尾善后性質(zhì)的語句。聲明自定義異常在Java中可以自定義異常,在自定義異常類時(shí)需注意以下幾點(diǎn):1. 所有異常都必須是 Throwable
    發(fā)表于 11-27 11:40

    Java異常體系級(jí)處理辦法

    Exception,Throwable作為所有異常的超類,如圖:    Error:一般為底層的不可恢復(fù)的類,一般此類錯(cuò)誤都比較嚴(yán)重,JVM將終止其運(yùn)行的線程;  VirtualMachineError
    發(fā)表于 01-05 17:48

    LCD電容觸摸屏,觸摸屏幕時(shí),總是會(huì)有異常坐標(biāo),這是為何?

    LCD電容觸摸屏,觸摸屏幕時(shí),總是會(huì)有異常坐標(biāo),這是為何?
    發(fā)表于 07-02 10:58

    C語言的異常處理案例代碼

    相信很多朋友在此之前可能根本沒有使用或者聽說過C語言的異常處理,印象中都是C++或者java才有的東西,C語言怎么會(huì)有異常處理呢?
    的頭像 發(fā)表于 12-22 08:44 ?3798次閱讀

    一種針對(duì)浮點(diǎn)運(yùn)算的分段式異常處理方法

    異常會(huì)造成程序錯(cuò)誤,實(shí)現(xiàn)完全沒有異常的浮點(diǎn)計(jì)算軟件也很艱難,因此,實(shí)現(xiàn)有效的異常處理方法很重要.但現(xiàn)有的異常
    發(fā)表于 01-19 15:50 ?1次下載

    處理器中異常和中斷解決

    或中斷請(qǐng)求(IRQ)。幾乎所有的現(xiàn)代處理器都支持異常和中斷,微控制器的中斷可以由片上外設(shè)或軟件產(chǎn)生。由此可見,通常我們處理的中斷是異常的一種
    的頭像 發(fā)表于 10-12 17:14 ?4995次閱讀

    PLC的異常類型和處理辦法

    1.中央處理異常: 如果出現(xiàn)中央處理異常報(bào)警,應(yīng)檢查連接到中央處理器內(nèi)部總線的所有設(shè)備。具體
    發(fā)表于 04-19 09:43 ?0次下載
    PLC的<b class='flag-5'>異常</b>類型和<b class='flag-5'>處理</b>辦法

    SpringMVC 如何優(yōu)雅的處理各種異常?

    那有沒有一種方案,既不需要跟Controller耦合,也可以將定義的 異常處理器 應(yīng)用到所有控制器呢?所以注解@ControllerAdvice出現(xiàn)了,簡(jiǎn)單的說,該注解可以把異常
    發(fā)表于 05-29 16:00 ?507次閱讀
    SpringMVC 如何優(yōu)雅的<b class='flag-5'>處理</b>各種<b class='flag-5'>異常</b>?

    變壓器有異常響聲是什么原因 變壓器異常聲響的原因有哪些?

    變壓器有異常響聲是什么原因 變壓器異常聲響的原因有哪些? 變壓器是電力系統(tǒng)中非常重要的電氣設(shè)備,用于將高電壓變換為低電壓或者低電壓變換為高電壓,以便進(jìn)行輸電或者供電。在變壓器的運(yùn)行過程中,有時(shí)候會(huì)發(fā)
    的頭像 發(fā)表于 11-23 15:34 ?9836次閱讀