ARM中斷筆記

2021-07-03 13:44:14 字數 4555 閱讀 6489

一、arm體系cpu有以下7種工作模式:

1、使用者模式(usr):正常的程式執行模式。不能直接切換到其他模式

2、系統模式(sys):執行作業系統的特權任務。與使用者模式類似,但具有直接切換到其他模式等特權

3、快速中斷模式(fiq):支援高速資料傳輸以及通道處理。fiq異常響應時進入此模式

4、中斷模式(irq):用於通用中斷處理。irq異常響應時進入此模式

5、管理模式(svc):作業系統使用的保護模式。系統復位和軟體中斷時進入此模式

6、資料訪問終止模式(abt):用於支援資料記憶體和儲存器保護。資料或指令預取終止時進入該模式

7、未定義指令終止模式(und):支援硬體協處理器的軟體**。未定義的指令執行時進入該模式

各模式可以通過軟體來進行切換,或則通過發生各類中斷、異常時自動進入相應的模式。

特權模式:除使用者模式外

異常模式:除使用者模式和系統模式外

二、arm體系cpu有以下兩種工作狀態:

1、arm

2、thumb

中斷向量即中斷源的識別標誌,可用來存放中斷服務程式的入口位址或跳轉到中斷服務程式的入口位址。

中斷向量位址是中斷服務例行程式入口位址的位址。

中斷向量位址裡存放著中斷向量,即存放著中斷服務例程的位址

彙編基礎: s***b sp!, //sp=sp-4,sp=pc;先壓pc //sp=sp-4,sp=lr;再壓lr //sp=sp-4,sp=ip;再壓ip //sp=sp-4,sp=fp;再壓fp ldmia sp, //和s***b成對使用, //fp=sp,sp=sp+4;先彈fp //sp=sp,sp=sp+4;先彈sp,此處的彈出不會影響sp,因為ldmia是乙個機器週期執行完的。 //pc=sp,sp=sp+4;先彈pc

眾所周知,arm每種工作模式除r0~r15共16個暫存器外,還有第17個暫存器cpsr,叫做 當前程式狀態暫存器,cpsr中一些位被用於標識各種狀態,一些位被用於標識當前出於什麼工作模式

其中cpsr_c代表的是這32位中的低8位,也就是控制位

當你看到有些程式裡這樣寫

msr cpsr_c 0xd2 //msr是arm彙編中專門用來修改cpsr這樣有特定功能的暫存器的指令

//具體請參考arm彙編手冊和arm體系架構手冊

這樣的語句時,就是在更改這8位的狀態

ldr pc, = main
再設定pc跳轉子函式之前,一定要設定好lr指標,設定好函式的返回位址。

而bl指令會自動設定lr指標,所以不需要顯式的設定lr指標。

1.1.1 中斷優先順序

s3c2440a支援60種中斷,多個硬體可能同時產生中斷請求,由於cpu只能處理乙個中斷,中斷控制器怎麼選擇出乙個最佳的中斷,交給arm核心進行處理呢? 中斷控制器採用優先順序仲裁比較的方式進行選擇,找出優先順序最高的中斷源。中斷控制器將60種中斷源分成7組,如下圖所示,它類似體育賽事裡的比賽方式,所有參賽選手在小組賽pk,選擇出小組賽最優秀選手,然後進入決賽階段和其它小組最優先選擇再pk,最後優勝者就是總冠軍。其中arbiter0~arbiter5為「小組賽」階段,中斷源訊號在各自小組裡進行優先順序仲裁,選擇出最高優先順序中斷訊號,每小組選出的中斷訊號送到arbiter6,也就是決賽階段,選擇出最高優先順序中斷訊號,交給arm核心。

1.中斷分兩大類:內部中斷和外部中斷。

2.外部中斷。24個外部中斷占用gpf0-gpf7(eint0-eint7),gpg0-gpg15(eint8-eint23)。用這些腳做中斷輸入,則必須配置引腳為中斷,並且不要上拉。具體參考datesheet資料手冊。

暫存器:extint0-extint2:三個暫存器設定eint0-eint23的觸發方式。

eintflt0-eintflt3:控制濾波時鐘和濾波寬度。

eintpend:這個是中斷掛起暫存器,清除時要寫1,後面還有幾個是寫1清除。當乙個外部中斷(eint4-eint23)發生後,那麼相應的位會被置1。為什麼沒有eint0-eint3,呵呵,看看srcpnd就知道了,裡面沒有eint4-eint23的位子,所以有了eintpend。

eintmask:這個簡單,是遮蔽中斷用的,也就是說位為1時,此次中斷無效。

3.內部中斷。內部中斷有8個暫存器,下面逐一來看。

暫存器:subsrcpnd:當乙個中斷發生後,那麼相應的位會被置1,表示乙個中斷發生了。

intsubmsk:與上乙個是一夥的,中斷遮蔽暫存器,具體遮蔽什麼,自己看手冊去吧。

intmod:中斷的方式。乙個中斷可以是普通中斷,也可以是快中斷,在這裡設定,但只能有乙個快中斷。

priority :優先順序暫存器,不說了。

srcpnd :當乙個中斷發生後,那麼相應的位會被置1,表示乙個或一類中斷發生了。

intmsk :中斷遮蔽暫存器。

intpnd :中斷發生後,srcpnd中會有bit置1,可能好幾個(因為同時可能發生幾個中斷),這些中斷會由優先順序仲裁器選出乙個最緊迫的,然後吧把intpnd中相應位置1,所以同一時間只有一位是1。也就是說前面的暫存器置1 是表示發生了,只有intpnd置1,cpu才會處理。(這句話相當重要,cpu在某一時刻可能有很多中斷產生,也就是說subsrcpnd或者srcpnd會有很多bit被置位,但是cpu只能處理乙個中斷,所以通過中斷優先順序的設定,可以得到乙個優先順序最高的中斷,cpu對他進行處理,打個比方,就好像世界盃,小組賽中,每個小組都有乙個隊出現,但是最終的冠軍只能是乙個隊,就好比,最後得到cpu處理的只有乙個中斷,道理一樣!!!)

intoffset :用來表示intpnd中哪一位置1了,好讓你查詢,普通中斷跳轉時查詢用。清除intpnd、srcpnd時自動清除。

4.各暫存器關係:

下面看圖說明:

5.中斷過程。

a 如果是不帶子中斷的內部中斷:發生後srcpnd相應位置1,如果沒有被intmsk遮蔽,那麼等待進一步處理。

b 如果是帶子中斷的內部中斷:發生後subsrcpnd相應位置1,如果沒有被intsubmsk遮蔽,那麼srcpnd相應位置1,等待進一步處理,幾個subsrcpnd可能對應同乙個srcpnd,對應表如下:

srcpnd subsrcpnd

int_uart0 int_rxd0,int_txd0,int_err0

int_uart1 int_rxd1,int_txd1,int_err1

int_uart2 int_rxd2,int_txd2,int_err2

int_adc int_adc_s, int_tc

int_cam int_cam_c, int_cam_p

int_wdt_ac97 int_wdt, int_ac97

c 如果是外部中斷:eint0-eint3發生後srcpnd相應位置1,如果沒有被intmsk遮蔽,那麼等待進一步處理。eint4-eint23發生後eintpend相應位置1,如果沒有被eintmask遮蔽,那麼srcpnd相應位eint4-7 或eint8-23置1,如果沒有被intmsk遮蔽,等待進一步處理,幾個eintpend對應同乙個srcpnd,對應表如下:

srcpnd eintpend

eint0 eint0

eint1 eint1

eint2 eint2

eint3 eint3

eint4-7 eint4-eint4

eint8-23 eint8-eint23

三種中斷都等待進一步處理了。接下來從srcpnd往下看,看intmsk。如果中斷被遮蔽了,就不用說了(注意:快中斷也能被遮蔽)。如果沒有被遮蔽,那麼會進一步到intmod。如果是快中斷,那麼直接出來,進入fiq(即cpu進入快中斷模式處理)。如果是普通中斷,那麼srcpnd可以有多為置1(fiq只能有乙個),這時就會經過priority選出乙個優先順序高的,然後把根據選出的中斷把intpnd相應位置1(注意:只能選出乙個),進入irq,讓cpu處理。

6.中斷的開啟。

a.如果是不帶子中斷的內部中斷,只需設定intmsk,讓它不遮蔽中斷就可以了。

b 如果是帶子中斷的內部中斷,需設定intsubmsk和intmsk,讓它門不遮蔽中斷就可以了。

c 如果是外部中斷,對於eint8-23需要設定eintmask和intmsk。對於eint0-eint3只需設定intmsk。

7.中斷的清除。

a.如果是不帶子中斷的內部中斷,只需清除srcpnd,注意清除需位置1。

b 如果是帶子中斷的內部中斷,需清除srcpnd和subsrcpnd,注意先清除subsrcpnd,再清除srcpnd。因為,如果你先清除srcpnd的話,然後在清除subsrcpnd的過程中,srcpnd會以為又有中斷發生,又會置1。也就是說一次中斷會響應兩次。所以必須先掐斷源頭。

c 如果是外部中斷,對於eint8-23需要清除eintpend和srcpnd(同樣注意順序)。對於eint0-eint3只需清除srcpnd。

ARM中斷學習筆記(一)

從週三開始到今天學了三天以後。記錄一下學到的東西,順便鞏固和整理。一。首先 學習了什麼是中斷 在中斷出現之前,cpu和外設的通訊中,cpu佔主動地位,需要不斷的去查詢外設是否準備好,只有外設準備好了才能夠進行操作,這段時間內cpu就被空置了,非常浪費資源。中斷的原理是讓外設在通訊中佔主導地位,cpu...

Arm 虛擬中斷

虛擬中斷與物理中斷的對映 1 當kvm向vm注入乙個虛擬中斷時,中斷資訊儲存在lr暫存器中,包含了中斷號 中斷優先順序 中斷狀態 activate pending 等資訊 2 lr裡還有乙個hw標誌位資訊,hw置為1時,lr暫存器中會加入相應的物理終端號資訊,這樣在vm裡deactivate乙個虛擬...

arm中斷保護和恢復 ARM的中斷處理 一

前面的文章介紹了linux的中斷處理機制,而作業系統的中斷處理是和硬體的中斷控制器緊密相關的,本文將以arm這樣乙個具體的處理器為例,講解硬體層面對中斷的支援。arm的中斷控制器被稱為gic generic interrupt controller 最開始的v1版本最多支援8個pe和1020個中斷源...