ARM 中斷向量介紹

2021-07-22 23:03:03 字數 4393 閱讀 3293

驗證的**詳細分析了基於arm嵌入式系統的異常處理流程。然後闡明關鍵字「-irq」的作用,設計出中斷處理函式。最後,通過設定中斷控制暫存器,設計外部中斷eint3的初始化程式,並給出主程式流程圖。實踐證明程式執行穩定可靠。

引言計算機體系結構中,異常或者中斷是處理系統中突發事件的一種機制,幾乎所有的處理器都提供這種機制。異常主要是從處理器被動接受的角度出發的一種描述,指意外操作引起的異常。而中斷則帶有向處理器主動申請的意味。但這兩種情況具有一定的共性,都是請求處理器打斷正常的程式執行流程,進入特定程式的一種機制。若無特別說明,對「異常」和「中斷」都不作嚴格的區分。本文結合經過實際驗證的**對arm9中斷處理流程進行分析,並設計出基於s3c2410晶元的外部中斷處理程式。

1.異常中斷響應和返回

系統執行時,異常可能會隨時發生。當乙個異常出現以後,arm微處理器會執行以下幾步操作:

1)  將下一條指令的位址存入相應連線暫存器lr,以便程式在處理異常返回時能從正確的位置重新開始執行。

2)  將cpsr複製到相應的spsr中。

3)  根據異常型別,強制設定cpsr的執行模式位。

4)   強制pc從相關的異常向量位址取下一條指令執行,從而跳轉到相應的異常處理程式處。

這些工作是由arm 核心完成的,不需要使用者程式參與。異常處理完畢之後,arm微處理器會執行以下幾步操作從異常返回:

1)  將連線暫存器lr的值減去相應的偏移量後送到pc中。

2)   將spsr複製回cpsr中。

3)   若在進入異常處理時設定了中斷禁止位,要在此清除。

這些工作必須由使用者在中斷處理函式中實現。為保證在arm處理器發生異常時不至於處於未知狀態,在應用程式的設計中,首先要進行異常處理。採用的方式是在異常向量表中的特定位置放置一條跳轉指令,跳轉到異常處理程式。當arm處理器發生異常時,程式計數器pc會被強制設定為對應的異常向量,從而跳轉到異常處理程式。當異常處理完成以後,返回到主程式繼續執行。可以認為應用程式總是從復位異常處理程式開始執行的,因此復位異常處理程式不需要返回。

2.異常處理程式設計

2.1   異常響應流程

由於向量表的限制,只能有一條指令b完成32mb範圍內的跳轉,並不能保證所有的異常處理函式都位於32mb範圍內。為了擴充套件跳轉範圍,需要二次跳轉才能把異常處理函式的位址傳送給pc。異常處理呼叫關係如圖1所示。

三星公司**提供了test2410_r11軟體包,其中2410init.s有如下**:

handler***

sub    sp,sp,#4   ;減少sp,儲存跳轉位址

stmfd  sp!,    ;將工作暫存器壓入堆疊

ldr   r0,=handle*** ;將handle***位址放入r0

ldr     r0,[r0]   ;將中斷程式入口位址放入r0

str   r0,[sp,#4]  ;將中斷程式入口位址壓入堆疊

ldmfd   sp!,  ;將工作暫存器和中斷程式入口位址彈出到r0和pc

圖1異常處理呼叫

並且在ram中定義了存有中斷程式入口位址表_isr_startaddress:

area ramdata, data, readwrite

^   _isr_startaddress

handlereset                 #   4

handleundef               #   4

handleswi                #   4

handlepabort           #   4

handledabort           #   4

handlereserved         #   4

handleirq                #   4

handlefiq                #   4

通常handler***位於程式入口位址32mb範圍內,handle***是以_isr_startaddress為基位址的ram中位址。該**主要實現跳轉功能,把異常處理程式位址handle***送到pc中。例如產生irq中斷時,pc會被強制設定為0x18,執行指令:b  handlerirq

在handlerirq程式段內,處理器做一些必要的處理,就會將_isr_startaddress表中存放的irq入口位址送入pc,然後開始執行相關中斷程式。由於_isr_startaddress表存放在ram中,後面的c語言程式可以方便地更改相關中斷服務程式的內容。

2.2   異常分支

系統可能存在多個 irq/fiq的中斷處理程式。為了從向量表入口處的跳轉最終能找到正確的中斷處理程式,需要設計一套處理機制和方法來實現。可以在arm的異常向量表之外,增加一張關聯中斷控制器的向量表,向量表中的內容對應每個具體的中斷源,可以協助跳轉到不同的中斷處理程式。

當響應外設的乙個中斷請求時,首先觸發arm核的中斷,進人中斷程式,再通過中斷控制器識別中斷源,使pc能夠自動獲得中斷處理程式的位址。有的晶元支援特殊的硬體分支功能,依據中斷源自動跳轉到向量表的相應位址,多數情況下是用軟體來處理異常分支。

在s3c2410體系中,中斷的呼叫可以看成是經歷了2次「中斷向量表」的查詢。2410init.s中的以下**完成功能就是查詢中斷偏移暫存器intoffset,得到當前中斷的中斷號,並根據中斷號再呼叫相關的中斷服務程式。

isrirq

sub    sp,sp,#4     

stmfd         sp!,     

ldr     r9,=intoffset

ldr     r9,[r9]

ldr     r8,=handleeint0

add    r8,r8,r9,lsl #2

ldr     r8,[r8]

str     r8,[sp,#8]

ldmfd         sp!,

為了方便c程式使用中斷,將isrirq設為irq的中斷服務程式。

ldr     r0,=handleirq

ldr     r1,=isrirq

str     r1,[r0]

其中handleeint0是使用者自己開闢的一塊儲存空間的起始位址,後面按次序存放中斷異常處理程式的位址,也可以理解為二級中斷向量表。isrirq從中斷控制器處獲取中斷源資訊,然後再從二級中斷向量表中的對應位址單元得到異常中斷處理程式的入口位址,完成異常響應的跳轉。二級中斷向量表一般位於 handlefiq的後面,也就是以_isr_startaddress+0x20為起始位址,這裡定義了s3c2410處理器所有中斷源的相關中斷處理處理程式入口。這種方法的好處是使用者程式在執行過程中能夠動態改變異常向量。

2.3   中斷函式設計

為了方便高階語言設計中斷處理函式,標準的arm指令編譯器提供了乙個用來宣告中斷處理函式的關鍵字-irq,使用此關鍵字宣告的函式可以被編譯器識別為中斷處理函式。編譯後的**在處理異常事件前儲存現場資訊,處理異常事件後對現場資訊進行恢復。中斷函式設計如下:

static void __irq eint3int(void)

在初始化程式,引用**pisr_eint3=(u32)eint3int,即可定義位址_isr_startaddress+0x2c內容是eint3int的位址,外部中斷3產生請求時即可呼叫中斷處理函式eint3int。

3.外中斷初始化程式設計

s3c2410x 的中斷控制暫存器能接收來自56個中斷源的請求。內部的外圍模組和外部管腳產生的多個中斷請求通過中斷控制器衝裁後,向arm920t核發出fiq或者 irq中斷。arm核心只有2個外部中斷輸入訊號nirq和nfiq,在具體嵌入式系統中,需要用中斷控制器管理多個外部中斷源,選擇其中乙個中斷,通過 nirq或nfiq向arm核心發出中斷請求,如圖2所示。

圖2 fiq/irq中斷處理過程

arm920t核心可以識別正常中斷請求和快速中斷請求兩種型別的外部中斷,中斷的行為模式由中斷控制器來設定。s3c2410x的中斷控制器包括6類暫存器:中斷源狀態暫存器、中斷模式暫存器、中斷遮蔽暫存器、優先順序暫存器、中斷狀態暫存器,以及中斷偏移暫存器。

在初始化程式中,需要選擇相應管腳的功能,在此定義gpf3為eint3模式,通過外部中斷控制暫存器extint0設定eint3是下降沿觸發方式,通過設定中斷源懸掛暫存器srcpnd、中斷懸掛暫存器intpnd和中斷遮蔽暫存器intmsk開啟eint3。中斷模式暫存器和中斷優先順序暫存器採用系統預設方式。具體**實現如下:

void eint_init(void)

如果採用eint4~eint23之間的中斷源,還需要設定外部中斷懸掛暫存器eintpend和外部中斷掩碼暫存器eintmask的相關位。

在c語言的main()程式中呼叫eint_init()函式,即可完成中斷處理的初始化操作。操作流程如圖3所示。

若外部下降沿訊號接到gpf3管腳,就可以呼叫eint3int中斷處理函式。

5.結論

本文作者創新點在於採用的異常處理程式設計方式靈活可靠,可以在系統執行期間動態修改中斷向量表,利用c語言也可實現中斷處理函式的動態配置。在所設計的鍵盤處理程式中採用該方法,取得了很好地效果,該方法具有很強的通用性。

ARM的啟動和中斷向量表

對於s3c2440而言,啟動的方式有兩種,一是nor flash方式啟動,二是nand flash方式啟動。nor flash的位址範圍如下 0x0000.0000 0x0800.0000 2m nor flash 片內的bootsram位址被置為 0x4000.0000 0x4000.dfff 4...

向量中斷和非向量中斷

向量中斷和非向量中斷 shi 869160的專欄 部落格頻道 csdn.net 向量中斷 非向量中斷 向量中斷與非向量中斷的區別 向量中斷控制器vic具有32個中斷請求輸入,可將其程式設計分為3類,fiq,向量irq和非向量irq。fiq fast interrpt request 快速中斷請求要求...

向量中斷和非向量中斷

向量中斷與非向量中斷的區別 推薦向量中斷就是不同的中斷有不同的入口位址,非向量中斷就只有乙個入口位址,進去了再判斷中斷標誌來識別具體是哪個中斷。向量中斷實時性好,非向量中斷簡單 向量中斷控制器vic具有32個中斷請求輸入,可將其程式設計分為3類,fiq,向量irq和非向量irq。fiq fast i...