中斷:
在6410 arm體系中,有很多模組可以產生中斷,比如gpio,uart,ts等都可以產生。在這些模組和cpu之間還有乙個中斷控制器。這個中斷控制器就是用於協調這些模組和cpu之間的互動的。比如:gpio和uart同時發出中斷請求,那麼cpu來處理那個中斷呢?這就需要用到中斷控制器了。如下圖所示:
從上圖可以看到arm1176中斷控制器支援64組中斷源。具體哪64組可以參考6410datasheet。假如使用按鍵,則使用到的中斷源為第0和第1組中斷源
cpu在執行每一條指令之前,都會先判斷有無中斷發生,若有中斷發生:
硬體上:
1.cpu進入irq模式
2.cpsr儲存到spsr_irq中
3.轉換為r13_irq,r14_irq
4.把下一條指令的位址儲存到r14_irq中
5.跳轉到0x18位址執行
軟體上:
1.儲存現場
[cpp]view plain
copy
/* 1. 儲存現場 */
ldr sp, =0x54000000
sub lr, lr, #4 /*減去4個位元組的原因是當前指令沒有執行就去執行中斷處理了*/
s***b sp!, /* lr就是swi的下一條指令位址 */
2.處理中斷
a.分辨中斷
b.呼叫相應的處理函式
c.處理完後清中斷
[cpp]view plain
copy
/* 2.3 清中斷 */
eint0pend = 0x3f; /* 清中斷 */
vic0address = 0;
3.恢復現場
[cpp]view plain
copy
/* 3. 恢復現場 */
ldmia sp!, ^ /* ^表示把spsr恢復到cpsr */
要想使用中斷,該做那些工作?
1.初始化,比如按鍵(gpio),把按鍵設定為中斷源
a.設定源頭(按鍵)
**如下:
[cpp]view plain
copy
/* 配置gpio引腳為中斷引腳 */
/* gpn0~5 設為中斷引腳 */
gpncon &= ~(0xfff);
gpncon |= 0xaaa;
/* 設定中斷觸發方式為: 雙邊沿觸發 */
eint0con0 &= ~(0xfff);
eint0con0 |= 0x777;
/* 使能中斷 */
eint0mask &= ~(0x3f);
b.設定中斷控制器(使能中斷控制器的中斷源組)
**如下:
[cpp]view plain
copy
/* 在中斷控制器裡使能這些中斷 */
vic0intenable |= (0x3); /* bit0: eint0~3, bit1: eint4~11 */
6個按鍵所屬的中斷源組為第0組和第1組
c.開啟總開關(cpsr中的乙個值)
**如下:
[cpp]view plain
copy
mrs r0, cpsr
bic r0,r0,#0x9f /* 清cpsr的i位,m4~m0 */
orr r0,r0,#0x10
msr cpsr,r0 /* 進入user mode */
**:
6410之中斷處理
中斷 在6410 arm體系中,有很多模組可以產生中斷,比如gpio,uart,ts等都可以產生。在這些模組和cpu之間還有乙個中斷控制器。這個中斷控制器就是用於協調這些模組和cpu之間的互動的。比如 gpio和uart同時發出中斷請求,那麼cpu來處理那個中斷呢?這就需要用到中斷控制器了。如下圖所...
6410之linux中斷處理結構
微控制器下的中斷處理 1.分辨是哪個中斷 2.呼叫處理函式 3.清中斷 在linux中,上面的這些操作基本上都是在asm do irq中進行操作的,下面進行分析 asmlinkage void exception asm do irq unsigned int irq,struct pt regs ...
驅動開發入門之中斷處理
驅動程式開發過程中對中斷的處理是很重要的一部分,直接關係程式的執行結果與效率,所以需要對其給予足夠的重視.中斷處理包含兩個方面,與ce系統相關的部分及與硬體相關的部分.ce系統特定的處理流程 與其它系統有所區別的,或者說這部分 在其它系統上是無法執行的 一般為 1.用createevent建立乙個自...