arm中斷程式設計
一.前言
中斷的基本概念:
1.在arm
中最多有32
個中斷請求
2.16
個向量irq
中斷(16
個向量中斷的vic
中斷號已經有系統定義好了。在p208
中可檢視)
(16個向量中斷有16
個優先順序,可動態分配給中斷請求)
3.可產生軟體中斷。
4.中斷的優先順序資源:中斷的優先順序資源就是cpu
的中斷系統。以arm7
體系的cpu
為例,最多可以有32
個中斷資源。對於每個具體的中斷源可以將其設定為
fiq,使其具有最高優先順序,但fiq
最好是分配給唯一的中斷源,否則就失去意義;也可以設定為向量irq,
使其具有中等優先順序,但向量irq
的總數不能超過16
個,這些中斷源優先順序的高低按向量編號從0
(最高)到15
(最低)排序;如果中斷源的個數超過17
個,則剩餘的中斷源只能設定為非向量irq,
其優先順序最低。作業系統本身必須使用乙個定時器中斷源來作為系統節拍中斷,它是作業系統工作的基礎。
二vic向量中斷控制器
1.向量中斷控制器(vic
)具有32
個中斷請求輸入
a.可以將其分為3
類:fiq,
向量irq
中斷和非向量irq.
b.快速中斷請求(fiq
)要求具有最高優先順序。當如果只有乙個中斷被分配為fiq
時,可現實最短的fiq
等待時間,因為fiq
服務程式只要簡單地啟動對該中斷處理就可以了。
c.向量irq
中斷具有中等優先順序。該優先順序可分配
32個請求中的16
個。32
個請求中的任意乙個都可以分配到16
個向量irqslot
中的任意乙個,其中slot()
具有最高優先順序,而slot15
則為最低優先順序。
d.非向量irq
中斷的優先順序最低。
2在編寫中斷程式時最常用的暫存器
a.中斷使能暫存器(vicintenable
)(1)
vicintenable
暫存器有32
為:從0~31
給每一位寫1
表示時該為對應的中斷時能,寫入0
表示禁止該位的中斷。(每一位對應的中斷和vic
通道號對應。
eg:vicintenable=1<<6;
表示使uart0
能中斷,因為uart0
對應的中斷號即為6.
b.中斷選擇暫存器vicintselect
(1) vicintselect:
該暫存器有32
位(0~31
)將32
個中斷請求分別分配為fiq
或irq ,
(2)給對應位寫入1
表示給對應的中斷請求分配為fiq
(3)給對應位寫入0
表示給對應的中斷請求分配為irq
c.向量控制暫存器0~15(vicvectcntl0~15)
(1)如果給乙個中斷指定的向量控制暫存器為vicvectl0
則表示該中斷具有最高中斷優先順序。反之,如果給乙個中斷指定的向量控制暫存器為vicvectl15
則表示該中斷具有最低優先順序。
(2)vicvectcntlx(x
指0~15)
該暫存器為6
位。0~4:
用來指定中斷編號
5:為1
表示向量使能
eg;vicvectcntl0=0x20|6(
表示給uart0
分配向量控制暫存器,且它的優先順序是最高的(0
表示最高優先順序)
d.向量位址暫存器(vicvectaddrx
)(1)
當發生乙個irq
中斷時,vic
會將對應的irq
服務程式位址存入該暫存器,irq
中斷入口處的程式可讀暫存器並跳轉到讀出的位址,執行相應的中斷服務程式
(注:該暫存器應該在isr
快結束時執行一次些操作(寫入的值一般為0
)以遍更新優先順序硬體。)
(2)在發生中斷時,給中斷分配中斷位址時應該和給該中斷分配的中斷控制暫存器的號一致
eg: vicvectcntl0=0x20|6;
vicvectaddr0=(uint32)uart0_irq(
自己編寫的終端函式的位址)
注:在編寫向量中斷程式時,必須對他進行初始化。一般的程式過程是:首先:用vicintselect
暫存器對該中斷進行選擇時irq
中斷還是fiq
中斷。其次:用vicvectcntlx
給該中斷分配向量終端控制暫存器(其中x
的值越小,中斷優先順序越高。
再次:用vicvectaddrx
最後:用vicintenable
使該中斷使能:
程式事例:
vicintselect = 0x00000000; //
設定所有中斷為irq
中斷vicvectcntl0 = 0x26; // uart0
中斷分配到irq slot 0
,即優先順序最高
vicvectaddr0 = (int)irq_uart0; //
設定uart0
向量位址
vicintenable = 0x00000040; //
使能uart0
中斷三非向量中斷:
1.常用暫存器:
a中斷使能暫存器(vicintenable
)vicintenable
暫存器有32
為:從0~31
給每一位寫1
表示時該為對應的中斷時能,寫入0
表示禁止該位的中斷。(每一位對應的中斷和vic
通道號對應。
eg:vicintenable=1<<6;
表示使uart0
能中斷,因為uart0
對應的中斷號即為6.
b中斷選擇暫存器vicintselect
(1) vicintselect:
該暫存器有32
位(0~31
)將32
個中斷請求分別分配為fiq
或irq ,
(2)給對應位寫入1
表示給對應的中斷請求分配為fiq
(3)給對應位寫入0
表示給對應的中斷請求分配為irq
注:以上和向量中斷的用法一致,一下是不同點
c.預設向量位址暫存器vicdefvectaddr
該暫存器儲存了非向量irq
中斷服務程式irq
的位址注:在編寫非向量中斷程式時,必須對他進行初始化。一般的程式過程是:
a.首先:用vicintselect
暫存器對該中斷進行選擇時irq
中斷還是fiq
中斷。b.
其次:用vicdefvectaddr
暫存器存放非向量中斷的位址
c.最後:用vicintenable
使該中斷使能
程式事例:
vicintselect = 0x00000000; //
設定所有中斷為irq
中斷vicdefvectaddr0 = (int)irq_uart0; //
設定uart0
非向量中斷的位址
vicintenable = 0x00000040; //
使能uart0
中斷四綜合:乙個程式中既有向量中斷和非向量中斷
eg;假設uart0
和spi0
產生中斷請求,它們被分配為向量irq(uart0
的優先順序高於spi0),
而uarti
和i2c
產生非向量irq,
程式:vicintselect = 0x00000000; //
設定所有中斷為irq
中斷vicvectcntl0=0x26//uart0
通道號為6
優先順序為0
(最高)
vicvectcntl1=0x2a//spi0
通道號為10
優先順序為1
vicvectaddr0=(int)uart0_irq;
vicvectaddr1=(int)spi0_irq;
vicdefaddr=//
儲存非向量uart1
和i2c
終端服務的位址;
vicintenable=0x6c0//spi0,i2c,uart1,uart0
在bit10
,bit9,bit7
和bit6=1
ARM2200下的中斷程式設計一
arm中斷程式設計 一 前言 中斷的基本概念 1.在arm 中最多有32 個中斷請求 2.16 個向量irq 中斷 16 個向量中斷的vic 中斷號已經有系統定義好了。在p208 中可檢視 16個向量中斷有16 個優先順序,可動態分配給中斷請求 3.可產生軟體中斷。4.中斷的優先順序資源 中斷的優先...
arm中斷保護和恢復 ARM的中斷處理 一
前面的文章介紹了linux的中斷處理機制,而作業系統的中斷處理是和硬體的中斷控制器緊密相關的,本文將以arm這樣乙個具體的處理器為例,講解硬體層面對中斷的支援。arm的中斷控制器被稱為gic generic interrupt controller 最開始的v1版本最多支援8個pe和1020個中斷源...
如何在ARM下進行高效的C程式設計?
如何在arm下進行高效的c程式設計?1.對區域性變數 函式引數和返回值要使用signed和unsigned int型別。這樣可以避免型別轉換,而且可高效地使用arm的32位資料操作指令。2.最高效的迴圈體形式是減計數到零 counts down to zero 的do while迴圈。3.展開重要的...