在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 超詳細的2440中斷機制分析!

            超詳細的2440中斷機制分析!

            作者: 時間:2016-12-02 來源:網絡 收藏
            一直在看2440的中斷處理部分,不懂的實在太多了,百度到這篇文章,實在有聽君一席話,勝養(yǎng)十年豬的感覺啊,下面上文章:
            中斷向量
            b HandlerIRQ ;handler for IRQ interrupt
            很自然,因為所有的單片機都是那樣,中斷向量一般放在開頭,用過單片機的人都會很熟悉,那就不多說了。
            異常服務程序
            這里不用中斷(interrupt)而用異常(exception),畢竟中斷只是異常的一種情況,
            下面主要分析的是“中斷異常”說白了,就是我們平時單片機里面用的中斷?。?!所有由器件引起的中斷,例如TIMER中斷,UART中斷,外部中斷等等,都有一個統(tǒng)一的入口,那就是中斷異常 IRQ ! 然后從IRQ的服務函數(shù)里面分辨出,當前究竟是什么中斷,再跳轉到相應的中斷服務程序。這樣看來,ARM比單片機要復雜一些了,不過原理是不變的。
            上面說的就是思路,跟著這個思路來接著分析。
            HandlerIRQ 很明顯是一個標號,我們找到了
            HandlerIRQ HANDLER HandleIRQ
            這里是一個宏定義,我們再找到這個宏,看他是怎么定義的:
            MACRO
            $HandlerLabel HANDLER $HandleLabel
            $HandlerLabel
            sub sp,sp,#4 ;decrement sp(to store jump address)
            stmfd sp!,{r0} ;PUSH the work register to stack(lr does not 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
            用 HandlerIRQ 將這個宏展開之后得到的結果實際是這樣的
            HandlerIRQ
            sub sp,sp,#4 ;decrement sp(to store jump address)
            stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original
            address)
            ldr r0,=HandleIRQ ;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)
            至于具體的跳轉原理下面再說,
            好了,這樣的話就容易看的多了,很明顯, HandlerIRQ 還是一個標號,IRQ異常向量就是跳轉到這里執(zhí)行的,這里粗略看一下,應該是保存現(xiàn)場,然后跳轉到真正的處理函數(shù),那么很容易發(fā)現(xiàn)了這么一句 ldr r0,=HandleIRQ ,沒錯,我們又找到了一個標號 HandleIRQ ,看來真正的處理函數(shù)應該是這個 HandleIRQ ,繼續(xù)尋找
            AREA RamData, DATA, READWRITE
            ^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
            HandleReset # 4
            HandleUndef # 4
            HandleSWI # 4
            HandlePabort # 4
            HandleDabort # 4
            HandleReserved # 4
            HandleIRQ # 4
            最后我們發(fā)現(xiàn)在這里找到了 HandleIRQ ,^ 其實就是 MAP ,這段程序的意思是,從 _ISR_STARTADDRESS 開始,預留一個變量,每個變量一個標號,預留的空間為 4個字節(jié),也就是 32BIT,其實這里放的是真正的C寫的處理函數(shù)的地址,說白了,就是函數(shù)指針 - - 這樣做的話就很靈活了
            接著,我們需要安裝IRQ處理句柄,說白了,就是設置處理函數(shù)的地址,讓PC指針可以正確的跳轉。
            于是我們在接著的找到安裝句柄的語句
            ; Setup IRQ handler
            ldr r0,=HandleIRQ ;This routine is needed
            ldr r1,=IsrIRQ ;if there is not subs pc,lr,#4 at 0x18, 0x1c
            str r1,[r0]
            說白了就是將 IsrIRQ 的地址填到 HandleIRQ對應的地址里面,前面說了 HandleIRQ 放的是中斷處理的函數(shù)的入口地址,我們繼續(xù)找 IsrIRQ
            IsrIRQ
            sub sp,sp,#4 ;reserved for PC
            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}
            要理解這個代碼,得先學學2440的中斷系統(tǒng)了,INTOFFSET存放的是當前中斷的偏移號,根據偏移就知道當前是哪個中斷源發(fā)生的中斷。
            注意了,我們說的是中斷,而不是異常,看看原來的表是啥樣子的
            ^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
            HandleReset # 4
            HandleUndef # 4
            HandleSWI # 4
            HandlePabort # 4
            HandleDabort # 4
            HandleReserved # 4
            HandleIRQ # 4
            HandleFIQ # 4
            HandleEINT0 # 4
            HandleEINT1 # 4
            HandleEINT2 # 4
            HandleEINT3 # 4
            .......
            可以看到,前面幾個是異常,從 HandleEINT0 就是 IRQ異常的向量存放的地方了,這樣就可以理解為什么上面 IsrIRQ 里面里面要執(zhí)行那條指令
            ldr r8,=HandleEINT0
            add r8,r8,r9,lsl #2
            道理很簡單, HandleEINT0 就是所有IRQ中斷向量表的入口,在這個地址上面,加上一個適當?shù)钠屏?,INTOFFSET ,那么我們知道現(xiàn)在,到底是哪個IRQ在申請中斷了。
            上一頁 1 2 下一頁

            關鍵詞: 2440中斷機

            評論


            技術專區(qū)

            關閉