1.中斷概述
所謂查詢方式是指,cpu不到查詢外設的狀態,如果外設準備就緒則開始進行資料傳輸;如果外設還沒有準備好,cpu將進入迴圈等待狀態。很顯然這樣浪費了大量的cpu時間,降低了cpu的利用率。
所謂中斷方式是指,當外設準備好與cpu進行資料傳輸時,外設首先向cpu發出中斷請求,cpu接收到中斷請求並在一定條件下,暫時停止原來的程式並執行中斷服務處理程式,執行完畢以後再返回原來的程式繼續執行。由此可見,採用中斷方式避免了cpu把大量的時間花費在查詢外設狀態的操作上,從而大大提高了cpu的執行效率。
arm系統 包括兩類中斷:一類是irq中斷,另一類是fiq中斷。irq是普通中斷,fiq是快速中斷,在進行大批量的複製、資料傳輸等工作時,常使用fiq中斷。fiq的優先順序高於irq。
在arm系統中,支援7類異常,包括:復位、未定義指令、軟中斷、預取中止、資料中止、irq和fiq,每種異常對應於不同的處理器模式。一旦發生異常,首先要進行模式切換,然後程式將轉到該異常對應的固定儲存位址執行。這個固定的位址稱為異常向量。異常向量中儲存的通常為異常處理程式的位址。arm的異常向量如下:
異常 模式 正常位址 高向量位址
復位管理 0x00000000 0xffff0000
未定義指令 未定義0x00000004 0xffff 0004
軟中斷 管理 0x00000008 0xffff 0008
預取指中止 中止 0x0000000c 0xffff 000c
資料中止 中止 0x00000010 0xffff0010
irq irq 0x000000180xffff0018
fiq fiq 0x0000001c 0xffff 001c
由此可見,irq中斷和fiq中斷都屬於arm的異常模式。在arm系統中,一旦有中斷發生,不管是外部中斷,還是內部中斷,正在執行的程式都會停下來。接下來通常會按照如下步驟處理中斷:
(1)儲存現場。儲存當前的pc值到r14,儲存當前的程式執行狀態到spsr。
(2)模式切換。根據發生的中斷型別,進入irq模式或fiq模式。
(3)獲取中斷源。以異常向量表儲存在低位址處為例,若是irq中斷,則pc指標跳動0x18處;若是fiq中斷,則跳到0x1c處。irq和fiq的異常向量位址處一般儲存的是中斷服務子程式的位址,所以接下來pc指標跳入中斷服務子程式處理中斷。
(4)中斷處理。
(5)中斷返回,恢復現場。當完成中斷服務子程式後,將spsr中儲存的程式執行狀態恢復到cpsr中,r14中儲存的被中斷程式的位址恢復到pc中,繼續執行被中斷的程式。
2.s3c2410a的中斷控制器
arm920t cpu的中斷可分為fiq和irq。為了使cpu能夠響應中斷,必須首先對程式狀態暫存器(psr)中的f位和i位進行正確設定。如果psr的f位為1,則cpu不會響應來自中斷控制器的fiq中斷;如果psr的i位為1,則cpu不會響應來自中斷控制器的irq中斷。因此,為了使中斷控制器能夠接收中斷請求,必須在啟動**中將psr中的f位和i位設定為0,同時還需要將中斷遮蔽暫存器(intmsk)中的相應位設定為0。
中斷遮蔽暫存器用於指示中斷是否禁止。設定為1表示相應中斷禁止,為0則發生中斷時正常執行中斷服務。如果發生中斷時相應的遮蔽位正好為1,則中斷掛起暫存器中的相應中斷源掛起位將置1。
s3c2410a有2個中斷掛起暫存器:中斷源掛起暫存器(spcpnd)和中斷掛起暫存器(intpnd)。這兩個掛起暫存器用於指示某個中斷請求是否處於掛起狀態。當多個中斷源請求中斷服務時,srcpnd暫存器中的相應位置1,仲裁過程結束後intpnd暫存器中只有1位被自動置1。
s3c2410a中的中斷控制器能夠接收來自56個中斷源的請求。見晶元手冊,由於引腳有限,因此採用了共享中斷技術。由晶元手冊可知s3c2410a共有32個中斷請求訊號。中斷請求的優先順序邏輯是由7個仲裁器組成的,其中包括6個一級仲裁器和1個二級仲裁器。每個仲裁器是否使能由暫存器priority[6:0]決定。每個仲裁器可以處理4~6個中斷源,從中選出優先順序最高的。優先順序順序由暫存器priority[20:7]的相應位決定。
要想使用s3c2410a的中斷控制器,必須對以下列出的暫存器進行正確配置。以下暫存器中的每一位含義參閱晶元手冊。
暫存器位址 描述 復位值
srcpnd0x4a000000 中斷源掛起暫存器,當中斷產生後,相應位置1 0x0
intmod0x4a000004 中斷模式暫存器0=irq模式,1=fiq模式 0x0
intmsk0x4a00 0008 中斷遮蔽暫存器 0=中斷允許,1=中斷蔽0xfffffff
priority0x4a00000c 中斷優先順序控制暫存器,設定中斷優先順序 0x7f
intpnd0x4a000010 中斷掛起暫存器,只是中斷請求的狀態。 0x0
0=該中斷沒有請求 1=該中斷源發出中斷請求
intoffset0x4a000014 中斷偏移暫存器,只是irq中斷源 0x0
subsrcpnd0x4a000018子中斷源掛起暫存器,指示中斷請求的狀態0x0
0=該中斷沒有請求 1=該中斷源發出中斷請求
intsubmsk0x4a00 001c定義哪個中斷源遮蔽 0=中斷服務允許,1=中斷服務屏 0x7ff
所有來自中斷源的中斷請求首先被登記到中斷源掛起暫存器中。在中斷模式暫存器,中斷請求分成兩類:fiq和irq。多個irq中斷的仲裁過程在優先順序暫存器進行。
中斷源掛起暫存器可以看作各種中斷有無請求的狀態標誌暫存器。相應位置1,說明存在該中斷請求;相應位為0,說明該中斷請求產生。
中斷模式暫存器主要用於配置該中斷是irq型中斷,還是fiq型中斷。
3.中斷程式設計例項
介紹乙個通過定時器1中斷控制cpu板上的led1和led2實現輪流閃爍的例項,需要完成的主要工作如下:
(1)對定時器1初始化,並設定定時器的中斷時間為1s,據**參見timer1_init()函式。
void timer1_init(void)
ldrr9,=intoffset
ldrr9,[r9] ;載入intoffset暫存器值到r9
ldrr8,=handleeint0;載入中斷向量表的基位址到r8
addr8,r8,r9,lsl#2;獲得中斷向量
ldrr8,[r8] ;載入中斷服務程式的入口位址到r8
strr8,[sp,#8] ;儲存sp,將其作為新的pc值
ldmfd sp!,;跳轉到新的pc處執行,即跳轉到中斷服務子程式執行
(5)執行中斷服務子程式,該子程式實現將led1和led2燈熄滅或點亮。從現象中看到led1和led2燈閃爍一次,就說明定時器發生了一次中斷。具體實現見函式timer1_isr().
int flag;
void_ _irq timer1_isr(void)else{
rgpgdat=rgpgdat&0xdff|0x100;
flag=0;
rsrcpnd|=bit_timer1;
rintpnd|=bit_timer1;
(6)從中斷中返回,恢復現場,跳轉到被中斷的主程式繼續執行,等待下一次中斷的到來。
ARM中的異常和中斷
arm處理器中主要有7個異常 2個中斷異常 1 復位異常 在以arm為核的微控制器中,常把下列事件作為引起復位的原因。上電復位 在上電後,復位使內部達到預定的狀態,特別是程式跳到初始入口 復位引腳上的復位脈衝 這是由外部其他控制訊號引起的 對系統電源檢測發現過壓或欠壓 時鐘異常復位。arm處理器復位...
ARM中的異常和中斷
arm中的異常和中斷 arm處理器中主要有7個異常 2個中斷異常 1 復位異常 在以arm為核的微控制器中,常把下列事件作為引起復位的原因。上電復位 在上電後,復位使內部達到預定的狀態,特別是程式跳到初始入口 復位引腳上的復位脈衝 這是由外部其他控制訊號引起的 對系統電源檢測發現過壓或欠壓 時鐘異常...
獲取DLL中的函式入口位址
定義返回值為int型的包含兩個int型引數的函式指標型別paddtest typedef int paddtest int,int paddtest func 定義paddtest型別的變數func 獲取dll檔案的模組控制代碼 hmodule hm loadlibrary staticlib db...