6410之中斷處理

2021-07-24 18:06:42 字數 1908 閱讀 5671

中斷:

在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建立乙個自...