新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > S3C2410中斷詳解

        S3C2410中斷詳解

        作者: 時間:2016-11-11 來源:網絡 收藏
        最開始的代碼,大家都很熟悉,最基本的中斷跳轉

        bResetHandler

        本文引用地址:http://www.104case.com/article/201611/316988.htm

        bHandlerUndef;handler for Undefined mode
        bHandlerSWI;handler for SWI interrupt
        bHandlerPabort;handler for PAbort
        bHandlerDabort;handler for DAbort
        b.;reserved
        bHandlerIRQ;handler for IRQ interrupt
        bHandlerFIQ;handler for FIQ interrupt

        跳轉的標號是一系列的宏

        LTORG
        HandlerFIQ HANDLER HandleFIQ
        HandlerIRQ HANDLER HandleIRQ
        HandlerUndef HANDLER HandleUndef
        HandlerSWI HANDLER HandleSWI
        HandlerDabort HANDLER HandleDabort
        HandlerPabort HANDLER HandlePabort

        該宏在文件的最前面實現(xiàn),做了一些跳轉前的處理。如下:

        MACRO
        $HandlerLabel HANDLER $HandleLabel

        $HandlerLabel
        subsp,sp,#4 ;decrement sp(to store jump address)
        stmfdsp!,{r0} ;PUSH the work register to stack(lr doest push because it return to original address)
        ldr r0,=$HandleLabel;load the address of HandleXXX to r0
        ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
        str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
        ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
        MEND

        以HandleIRQ跳轉為例說明中斷的二級跳轉流程,以上的宏代碼說明IRQ跳轉到了標號HandleIRQ處,該標號如下定義:(是一系列的中斷以及二級中斷入口地址)

        AREA RamData, DATA, READWRITE

        ^ _ISR_STARTADDRESS ;(該值自己定義,是存放中斷向量表的地址)
        HandleReset # 4
        HandleUndef # 4
        HandleSWI # 4
        HandlePabort # 4
        HandleDabort # 4
        HandleReserved # 4
        HandleIRQ # 4
        HandleFIQ # 4

        ;Dont use the label IntVectorTable,
        ;The value of IntVectorTable is different with the address you think it may be.
        ;IntVectorTable(二級IRQ中斷向量表)
        HandleEINT0 # 4
        HandleEINT1 # 4
        HandleEINT2 # 4
        HandleEINT3 # 4
        HandleEINT4_7# 4
        HandleEINT8_23# 4
        HandleRSV6# 4
        HandleBATFLT # 4
        HandleTICK # 4
        HandleWDT# 4
        HandleTIMER0 # 4
        HandleTIMER1 # 4
        HandleTIMER2 # 4
        HandleTIMER3 # 4
        HandleTIMER4 # 4
        HandleUART2 # 4
        HandleLCD # 4
        HandleDMA0# 4
        HandleDMA1# 4
        HandleDMA2# 4
        HandleDMA3# 4
        HandleMMC# 4
        HandleSPI0# 4
        HandleUART1# 4
        HandleRSV24# 4
        HandleUSBD# 4
        HandleUSBH# 4
        HandleIIC # 4
        HandleUART0 # 4
        HandleSPI1 # 4
        HandleRTC # 4
        HandleADC # 4

        而HandleIRQ由以下代碼賦值,可以看出跳轉到了IsrIRQ:

        drr0,=HandleIRQ ;This routine is needed
        ldrr1,=IsrIRQ ;if there isnt subs pc,lr,#4 at 0x18, 0x1c放置中斷跳轉
        strr1,[r0]

        IsrIRQ ;真正的IRQ中斷的入口
        subsp,sp,#4 ;reserved for PC留出一個位置保存中斷入口地址
        stmfdsp!,{r8-r9}

        ldrr9,=INTOFFSET
        ldrr9,[r9] ;讀入中斷偏移碼
        ldrr8,=HandleEINT0 ;二級跳轉表的首地址
        addr8,r8,r9,lsl #2 ;R8=R8+R9X4得到相應的中斷入口地址
        ldrr8,[r8]
        strr8,[sp,#8] ;中斷入口地址送進SP(第一個代碼留出的4字節(jié)空間)
        ldmfdsp!,{r8-r9,pc}

        到此為止,中斷已經順利的進入了中斷向量表,用C語言編寫服務程序已變的非常簡單。如EINT0中斷的ISR

        void Eint0(void)

        { }

        pISR_EINT0=(U32)Eint0; //用中斷入口指向函數指針即可。



        關鍵詞: S3C2410中斷詳

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 峨边| 天气| 浙江省| 青海省| 六盘水市| 台中县| 建始县| 花莲市| 上饶县| 临泽县| 河东区| 乌海市| 平定县| 敦化市| 肇庆市| 越西县| 桃江县| 永兴县| 荆门市| 宁德市| 原阳县| 金乡县| 漳平市| 兴安盟| 碌曲县| 湖南省| 廊坊市| 新和县| 湖北省| 家居| 略阳县| 绥芬河市| 永登县| 灵璧县| 连山| 孙吴县| 遂宁市| 民和| 分宜县| 隆回县| 平武县|