新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 2440中斷向量的理解

        2440中斷向量的理解

        作者: 時間:2016-11-21 來源:網絡 收藏
        定時器中斷為例,我們作為用戶需要完成的任務:1定時器的初始化,各種寄存器賦值2使能中斷(cpsr和中斷控制器),然后將服務程序地址賦給pISR_TIMER1(為什么賦給它,后面討論)3當然是編寫具體的中斷服務程序。其他啟動代碼幫助我們完成了。程序執行過程中,中斷發生了,我們看看處理器如何找到我們的服務程序的(這不是天然的,是經過n道工序,沒有無緣無故的愛)。
        (1),中斷發生,arm跳到0x00000018執行此處指令,這是硬件決定的。這里放置了一個跳轉指令:b HandlerIRQ ;handlerforIRQinterrupt
        (2)繼續找,HandlerFIQHANDLERHandleFIQ,這是什么呢,他是一個宏,我把它翻譯過來:
        HandlerFIQ
        sub sp,sp,#4 ;decrementsp(tostorejumpaddress)
        stmfd sp!,{r0} ;PUSHtheworkregistertostack(lrdoestpushbecauseitreturntooriginaladdress)
        ldrr0,=HandleFIQ;loadtheaddressofHandleXXXtor0
        ldrr0,[r0] ;loadthecontents(serviceroutinestartaddress)ofHandleXXX
        strr0,[sp,#4];storethecontents(ISR)ofHandleXXXtostack
        ldmfdsp!,{r0,pc};POPtheworkregisterandpc(jumptoISR)
        有興趣的可以看下,它最終將pc賦值HandleFIQ的值
        (3)那么HandleFIQ那里儲存了什么呢?arm在啟動時做了這樣的賦值
        ldr r0,=HandleIRQ
        ldr r1,=IsrIRQ
        str r1,[r0]
        可見現在(2)中pc值為IsrIRQ所代表的地址。
        (4)現在來到了IsrIRQ。詳細看下:
        IsrIRQ
        sub sp,sp,#4;reservedforPC
        stmfd sp!,{r8-r9}

        ldr r9,=INTOFFSET
        ldr r9,[r9]
        ldr r8,=HandleEINT0
        add r8,r8,r9,lsl#2
        ldr r8,[r8]
        str r8,[sp,#8]
        ldmfd sp!,{r8-r9,pc}
        這段代碼,首先計算服務程序的地址,然后跳過去。但是INTOFFSET和HandleEINT0兩個東西然人費解。INTOFFSET寄存器的功能則很簡單,它的作用只是用于表明哪個中斷正在被處理。下面是該寄存器各位詳細功能列表

        HandleEINT0其實就是中斷是量表的首地址(區分于arm的異常向量表),而上面所說的pISR_TIMER1就是有中斷向量表得到的存放實際的中斷處理函數的地址
        #definepISR_TIMER1 (*(unsigned*)(_ISR_STARTADDRESS+0x4c))
        其實這個地址就應該是add r8,r8,r9,lsl#2中最終得到的r8。


        關鍵詞: 2440中斷向

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 桦南县| 徐闻县| 侯马市| 图们市| 泾源县| 磴口县| 鹤壁市| 通化市| 清镇市| 宜春市| 霍林郭勒市| 突泉县| 扶余县| 虹口区| 无棣县| 宜章县| 个旧市| 屯昌县| 政和县| 虹口区| 浑源县| 沙田区| 泸水县| 北海市| 溧水县| 大厂| 基隆市| 巴南区| 黑龙江省| 永川市| 调兵山市| 萨嘎县| 龙井市| 东安县| 高台县| 丰镇市| 东宁县| 巴彦县| 哈尔滨市| 衡南县| 偃师市|