關于arm中的中斷處理
1.cpu內(nèi)部的中斷控制器收集外部各個中斷,經(jīng)過一個的處理以后在報給cpu
2.然后cpu保存現(xiàn)場,調(diào)用中斷服務程序(ISR)
3.用ISR去識別相應的中斷,然后調(diào)用相應的中斷處理程序
4.處理完以后就進行清除中斷
5.恢復被中斷的程序
這就是中斷處理的流程,下面是對第一步的過程進行詳細的介紹。
根據(jù)2440手冊上的介紹,把這一部分用一副圖進行描述
request sources:中斷請求源.
這里的中斷請求源被分成了2個不同的類型,一個是有子中斷(with sub-register),一個是沒有子中斷的,從圖中可以得知不同的類型在中斷的處理過程也是不一樣的。
1.with sub-register 的處理過程
SUBSRCPND
這個寄存器的每一位都對應著一個子中斷源,如果出現(xiàn)相應的中斷,則會將相應的位置位為"1",如果要清除這個中斷,則向相應位置"1"就可以(我也很不明白,不過手冊上是這么寫的)
SUBMASK
這個寄存器的作用是如果對應位是1則就屏蔽這個中斷,如果是0的話就允許這個中斷往上去
SRCPND
這個寄存器與SUBSRCPND這個寄存器的作用差不多,不過區(qū)別在于是SUBSRCPND是指示子中斷,而SRCPND則是用來指示某一類的中斷,可以說是一大類的。
MASK
這個也有寄存器的,就是INTMASK 這個寄存器的作用其實和SUMMASK的作用差不多,也是用來屏蔽SRCPND上報的幾個中斷,不過不一樣的是,如果中斷是FIQ的話是不可屏蔽的,RIQ是可以屏蔽的
MODE
這個寄存器是INTMODE,這個寄存器很簡單的,他是用來對應SRCPND中的中斷的,如果某一位置為”1“的話,那就說明這個中斷是FIQ的,那cpu就會立即進入FIQ模式的,不過這個通常是用在緊急的中斷的.從圖中也可以看出來這個關系
Priority(優(yōu)先級)
不可能每一次都只有一個中斷會出現(xiàn),所以對于多中斷出來的時候應該怎么處理....
這就是arm的中斷仲裁器
總共有7個仲裁器,每一個仲裁器都可以處理6個中斷源(REQ0,REQ1,REQ2,REQ3,REQ4,REQ5)
那關于優(yōu)先級又是怎么區(qū)別的?
Each arbiter can handle six interrupt requests based on the one bit arbiter mode control (ARB_MODE) and two
bits of selection control signals (ARB_SEL) as follows:
If ARB_SEL bits are 00b, the priority order is REQ0, REQ1, REQ2, REQ3, REQ4, and REQ5.
If ARB_SEL bits are 01b, the priority order is REQ0, REQ2, REQ3, REQ4, REQ1, and REQ5.
If ARB_SEL bits are 10b, the priority order is REQ0, REQ3, REQ4, REQ1, REQ2, and REQ5.
If ARB_SEL bits are 11b, the priority order is REQ0, REQ4, REQ1, REQ2, REQ3, and REQ5.
Note that REQ0 of an arbiter always has the highest priority, and REQ5 has the lowest one. In addition, by
changing the ARB_SEL bits, we can rotate the priority of REQ1 to REQ4.
Here, if ARB_MODE bit is set to 0, ARB_SEL bits doesn’t change automatically changed, making the arbiter to
operate in the fixed priority mode (note that even in this mode, we can reconfigure the priority by manually
changing the ARB_SEL bits). On the other hand, if ARB_MODE bit is 1, ARB_SEL bits are changed in rotation
fashion, e.g., if REQ1 is serviced, ARB_SEL bits are changed to 01b automatically so as to put REQ1 into the
lowest priority. The detailed rules of ARB_SEL change are as follows:
If REQ0 or REQ5 is serviced, ARB_SEL bits are not changed at all.
If REQ1 is serviced, ARB_SEL bits are changed to 01b.
If REQ2 is serviced, ARB_SEL bits are changed to 10b.
If REQ3 is serviced, ARB_SEL bits are changed to 11b.
If REQ4 is serviced, ARB_SEL bits are changed to 00b.
每一個仲裁器可以處理6個中斷請求,這些仲裁器是基于1位的(ARB_MODE)和2位的(ARB_SEL)
如果ARB_SEL是00,那么優(yōu)先級就是REQ0, REQ1, REQ2, REQ3, REQ4, and REQ5.
下面依次類推
不過我們發(fā)現(xiàn)REQ0 和REQ5是優(yōu)先級最高和最低是不變的。
關鍵是ARB_MODE這個值是有什么用的,關于這個值的主要的作用是優(yōu)先級是否會自動變化,如果ARB_MODE是0的話,那么這個優(yōu)先級的不會自動變化的,優(yōu)先級是你一開始自己要設定要的,如果是1的話,那么這個優(yōu)先級是會自動變化的,這個變化是循環(huán)的,讓ARB_SEL循環(huán)變化的
規(guī)則:
如果是REQ0 或者是REQ5的話,那么ARB_SEL則不變化
如果是REQ1服務,那么ARB_SEL就會變成01,就這樣依次繼續(xù)。對于這個在寄存器PRIORITY這個寄存器中設置。
INTPND 這個是經(jīng)過來了中斷優(yōu)先級仲裁器優(yōu)先級選定過以后的中斷,讓這個寄存器是用來標識這個中斷的,這樣cpu就可以知道有什么中斷了。不過這個寄存器很特殊就是同一個時間它只能一個位為1...
評論