新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于arm中的中斷處理

        關于arm中的中斷處理

        作者: 時間:2016-11-11 來源:網絡 收藏
        中斷處理的流程
        1.cpu內部的中斷控制器收集外部各個中斷,經過一個的處理以后在報給cpu
        2.然后cpu保存現場,調用中斷服務程序(ISR)
        3.用ISR去識別相應的中斷,然后調用相應的中斷處理程序
        4.處理完以后就進行清除中斷
        5.恢復被中斷的程序


        這就是中斷處理的流程,下面是對第一步的過程進行詳細的介紹。
        根據2440手冊上的介紹,把這一部分用一副圖進行描述


        request sources:中斷請求源.
        這里的中斷請求源被分成了2個不同的類型,一個是有子中斷(with sub-register),一個是沒有子中斷的,從圖中可以得知不同的類型在中斷的處理過程也是不一樣的。


        1.with sub-register 的處理過程
        SUBSRCPND
        這個寄存器的每一位都對應著一個子中斷源,如果出現相應的中斷,則會將相應的位置位為"1",如果要清除這個中斷,則向相應位置"1"就可以(我也很不明白,不過手冊上是這么寫的)
        SUBMASK
        這個寄存器的作用是如果對應位是1則就屏蔽這個中斷,如果是0的話就允許這個中斷往上去
        SRCPND
        這個寄存器與SUBSRCPND這個寄存器的作用差不多,不過區別在于是SUBSRCPND是指示子中斷,而SRCPND則是用來指示某一類的中斷,可以說是一大類的。
        MASK
        這個也有寄存器的,就是INTMASK 這個寄存器的作用其實和SUMMASK的作用差不多,也是用來屏蔽SRCPND上報的幾個中斷,不過不一樣的是,如果中斷是FIQ的話是不可屏蔽的,RIQ是可以屏蔽的
        MODE
        這個寄存器是INTMODE,這個寄存器很簡單的,他是用來對應SRCPND中的中斷的,如果某一位置為”1“的話,那就說明這個中斷是FIQ的,那cpu就會立即進入FIQ模式的,不過這個通常是用在緊急的中斷的.從圖中也可以看出來這個關系


        Priority(優先級)
        不可能每一次都只有一個中斷會出現,所以對于多中斷出來的時候應該怎么處理....


        這就是arm的中斷仲裁器
        總共有7個仲裁器,每一個仲裁器都可以處理6個中斷源(REQ0,REQ1,REQ2,REQ3,REQ4,REQ5)
        那關于優先級又是怎么區別的?
        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,那么優先級就是REQ0, REQ1, REQ2, REQ3, REQ4, and REQ5.
        下面依次類推
        不過我們發現REQ0 和REQ5是優先級最高和最低是不變的。
        關鍵是ARB_MODE這個值是有什么用的,關于這個值的主要的作用是優先級是否會自動變化,如果ARB_MODE是0的話,那么這個優先級的不會自動變化的,優先級是你一開始自己要設定要的,如果是1的話,那么這個優先級是會自動變化的,這個變化是循環的,讓ARB_SEL循環變化的
        規則:
        如果是REQ0 或者是REQ5的話,那么ARB_SEL則不變化
        如果是REQ1服務,那么ARB_SEL就會變成01,就這樣依次繼續。對于這個在寄存器PRIORITY這個寄存器中設置。


        INTPND 這個是經過來了中斷優先級仲裁器優先級選定過以后的中斷,讓這個寄存器是用來標識這個中斷的,這樣cpu就可以知道有什么中斷了。不過這個寄存器很特殊就是同一個時間它只能一個位為1...


        關鍵詞: arm中斷處

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 建平县| 增城市| 合水县| 芦溪县| 上杭县| 措勤县| 五大连池市| 浦城县| 砚山县| 竹北市| 牙克石市| 高州市| 大新县| 叶城县| 营口市| 金溪县| 乳山市| 六枝特区| 遂川县| 韶山市| 泗水县| 墨江| 上杭县| 隆德县| 达日县| 雷波县| 新野县| 巴马| 电白县| 区。| 巴彦淖尔市| 昭通市| 五寨县| 章丘市| 娄底市| 子长县| 黔南| 盐池县| 青铜峡市| 城市| 泰兴市|