在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            ARM的異常處理過程分析

            作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
            2.接下來就是異常處理函數(shù)對(duì)應(yīng)的操作,可以在進(jìn)入異常處理之前就進(jìn)行返回地址的調(diào)整,這樣后面就不用進(jìn)行處理啦,當(dāng)然也可以在返回過程中再調(diào)整。一般都是在這個(gè)過程中進(jìn)行調(diào)整。進(jìn)行壓棧操作,保存對(duì)應(yīng)的環(huán)境變量。調(diào)用實(shí)際的處理過程等。
            3.出棧,恢復(fù)CPU的狀態(tài)和寄存器的值。由于第一步中已經(jīng)調(diào)整好返回地址,這一步不需要再次調(diào)整。當(dāng)然如果之前沒有調(diào)整,這里則需要進(jìn)行相應(yīng)的調(diào)整。
            在uC/OS-II的官網(wǎng)移植中采用通用異常處理函數(shù)的方式實(shí)現(xiàn)異常的處理,下面我們來分析其中的部分代碼:
            首先是處理器部分的移植,包括異常向量、異常的ID號(hào),存儲(chǔ)異常處理函數(shù)地址的地址等:
            /*ARM的異常ID號(hào),支持7種類型的異常,每一種異常都存在一個(gè)ID號(hào)*/
            #defineOS_CPU_ARM_EXCEPT_RESET 0x00
            #defineOS_CPU_ARM_EXCEPT_UNDEF_INSTR 0x01
            #defineOS_CPU_ARM_EXCEPT_SWI 0x02
            #defineOS_CPU_ARM_EXCEPT_PREFETCH_ABORT 0x03
            #defineOS_CPU_ARM_EXCEPT_DATA_ABORT 0x04
            #defineOS_CPU_ARM_EXCEPT_ADDR_ABORT 0x05
            #defineOS_CPU_ARM_EXCEPT_IRQ 0x06
            #defineOS_CPU_ARM_EXCEPT_FIQ 0x07
            #defineOS_CPU_ARM_EXCEPT_NBR 0x08
            /*異常向量地址*/
            #defineOS_CPU_ARM_EXCEPT_RESET_VECT_ADDR (OS_CPU_ARM_EXCEPT_RESET * 0x04 + 0x00) //0x00
            #defineOS_CPU_ARM_EXCEPT_UNDEF_INSTR_VECT_ADDR (OS_CPU_ARM_EXCEPT_UNDEF_INSTR * 0x04 + 0x00) //0x04
            #defineOS_CPU_ARM_EXCEPT_SWI_VECT_ADDR (OS_CPU_ARM_EXCEPT_SWI * 0x04 + 0x00) //0x08
            #defineOS_CPU_ARM_EXCEPT_PREFETCH_ABORT_VECT_ADDR (OS_CPU_ARM_EXCEPT_PREFETCH_ABORT * 0x04 + 0x00) //0x0c
            #defineOS_CPU_ARM_EXCEPT_DATA_ABORT_VECT_ADDR (OS_CPU_ARM_EXCEPT_DATA_ABORT * 0x04 + 0x00) //0x10
            /*這個(gè)異常是ARM中不支持的異常*/
            #defineOS_CPU_ARM_EXCEPT_ADDR_ABORT_VECT_ADDR (OS_CPU_ARM_EXCEPT_ADDR_ABORT * 0x04 + 0x00) //0x14
            #defineOS_CPU_ARM_EXCEPT_IRQ_VECT_ADDR (OS_CPU_ARM_EXCEPT_IRQ * 0x04 + 0x00) //0x18
            #defineOS_CPU_ARM_EXCEPT_FIQ_VECT_ADDR (OS_CPU_ARM_EXCEPT_FIQ * 0x04 + 0x00) //0x1c
            /*存儲(chǔ)異常處理函數(shù)地址的地址*/
            /* ARM exception handlers addresses */
            #defineOS_CPU_ARM_EXCEPT_RESET_HANDLER_ADDR (OS_CPU_ARM_EXCEPT_RESET * 0x04 + 0x20) //0x20
            #defineOS_CPU_ARM_EXCEPT_UNDEF_INSTR_HANDLER_ADDR (OS_CPU_ARM_EXCEPT_UNDEF_INSTR * 0x04 + 0x20) //0x24
            #defineOS_CPU_ARM_EXCEPT_SWI_HANDLER_ADDR (OS_CPU_ARM_EXCEPT_SWI * 0x04 + 0x20) //0x28
            #defineOS_CPU_ARM_EXCEPT_PREFETCH_ABORT_HANDLER_ADDR(OS_CPU_ARM_EXCEPT_PREFETCH_ABORT * 0x04 + 0x20) //0x2c
            #defineOS_CPU_ARM_EXCEPT_DATA_ABORT_HANDLER_ADDR (OS_CPU_ARM_EXCEPT_DATA_ABORT * 0x04 + 0x20) //0x30
            #defineOS_CPU_ARM_EXCEPT_ADDR_ABORT_HANDLER_ADDR (OS_CPU_ARM_EXCEPT_ADDR_ABORT * 0x04 + 0x20) //0x34
            #defineOS_CPU_ARM_EXCEPT_IRQ_HANDLER_ADDR (OS_CPU_ARM_EXCEPT_IRQ * 0x04 + 0x20) //0x38
            #defineOS_CPU_ARM_EXCEPT_FIQ_HANDLER_ADDR (OS_CPU_ARM_EXCEPT_FIQ * 0x04 + 0x20) //0x3c
            /*存儲(chǔ)在異常向量中的內(nèi)容,實(shí)質(zhì)上是LDR PC,[PC,#0x18]的機(jī)器碼*/

            #define OS_CPU_ARM_INSTR_JUMP_TO_SELF 0xEAFFFFFE
            /* ARM "Jump To Exception Handler"asminstruction */
            #define OS_CPU_ARM_INSTR_JUMP_TO_HANDLER 0xE59FF018
            異常的初始化函數(shù),首先,完成了在異常向量中存儲(chǔ)指令的操作,采用機(jī)器碼的形式就能避免直接訪問寄存器什么的,其次,完成在固定的地址處存放對(duì)應(yīng)異常處理函數(shù)的地址。其中采用了賦值的形式也是需要注意的,采用的強(qiáng)制類型轉(zhuǎn)換和指針相結(jié)合的形式。保證了是修改地址處的內(nèi)容。而不是修改地址。
            /*初始化異常中斷向量*/
            voidOS_CPU_InitExceptVect (void)
            {
            /*
            OS_CPU_ARM_EXCEPT_UNDEF_INSTR_VECT_ADDR是對(duì)應(yīng)中斷向量表的地址
            OS_CPU_ARM_INSTR_JUMP_TO_HANDLER是保存了對(duì)應(yīng)的OS_CPU_ARM_INSTR_JUMP_TO_HANDLER(實(shí)質(zhì)上是一個(gè)指令)
            實(shí)質(zhì)上就是在異常向量中存放了:LDR PC [PC, #0x18],也就是讓PC指向?qū)?yīng)的異常處理地址中的內(nèi)容,
            也就是實(shí)現(xiàn)到實(shí)際處理函數(shù)的跳轉(zhuǎn)。
            異常處理地址中存儲(chǔ)了實(shí)際的異常處理函數(shù)的地址
            其他的異常也有相同的操作,OS_CPU_ARM_INSTR_JUMP_TO_HANDLER是一個(gè)指令的機(jī)器碼形式
            */
            (*(INT32U *)OS_CPU_ARM_EXCEPT_UNDEF_INSTR_VECT_ADDR) = OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_UNDEF_INSTR_HANDLER_ADDR) = (INT32U)OS_CPU_ARM_ExceptUndefInstrHndlr;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_SWI_VECT_ADDR) = OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_SWI_HANDLER_ADDR) = (INT32U)OS_CPU_ARM_ExceptSwiHndlr;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_VECT_ADDR) = OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_HANDLER_ADDR) = (INT32U)OS_CPU_ARM_ExceptPrefetchAbortHndlr;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_DATA_ABORT_VECT_ADDR) = OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_DATA_ABORT_HANDLER_ADDR) = (INT32U)OS_CPU_ARM_ExceptDataAbortHndlr;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_ADDR_ABORT_VECT_ADDR) = OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_ADDR_ABORT_HANDLER_ADDR) = (INT32U)OS_CPU_ARM_ExceptAddrAbortHndlr;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_IRQ_VECT_ADDR) = OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_IRQ_HANDLER_ADDR) = (INT32U)OS_CPU_ARM_ExceptIrqHndlr;
            /*在異常向量中存儲(chǔ)對(duì)應(yīng)的操作,實(shí)質(zhì)上就是將PC值調(diào)轉(zhuǎn)*/
            (*(INT32U *)OS_CPU_ARM_EXCEPT_FIQ_VECT_ADDR) = OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
            (*(INT32U *)OS_CPU_ARM_EXCEPT_FIQ_HANDLER_ADDR) = (INT32U)OS_CPU_ARM_ExceptFiqHndlr;

            關(guān)鍵詞: ARM異常處理過程分

            評(píng)論


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

            關(guān)閉