簡要複習一下ARM9中斷控制器的控制過程:linux
1.首先能識別觸發的中斷(對應中斷源必須打開,而後查詢當前中斷狀態寄存器),硬件會操控PC跳到中斷向量入口(IRQ_HANDLE,硬件控制的只要是IRQ中斷類型就會進入),在中斷跳轉函數裏面保存現場(保存R0等等工做寄存器)--跳到服務函數(裏面進行中斷源判斷和處理)---恢復現場,基本流程是這樣。編程
2.中斷的觸發:高低電平,上升降低沿等等,具體的設置寄存器實現。函數
3.中斷可否傳到CPU?觸發之後還要經過許多開關(寄存器設置使能與否)確保到達CPU,這樣CPU才能識別(有的中斷源是不須要的),有些中斷是二級中斷,須要開關比較多,注意芯片手冊說明學習
4.網站
好比咱們要觸發的是INT_TC這個二級中斷信號。好,那麼咱們要打開的開關是什麼呢?在二級中斷信號裏,INTSUBMSK是二級中斷信號的開關,咱們要在裏面找到INT_TC這個位並設置爲1便可。二級中斷還得傳到一級中控器處理,那麼咱們先找出INT_TC是屬於哪一個一級中斷信號的,看錶裏的紫色框起來的是二級屬於同一個一級信號的,一級信號處理那個也有個紫色框,INT_ADC就是咱們要找到的對應一級信號。而它也有對應的開關,那麼就是INTMSK這個控制器。咱們把INTMSK裏的INT_ADC位設置爲1就算成功了。spa
代碼也就是 blog
INTSUBMSK |= ( 0x1 << 9);//由於INT_TC在INTSUBMSK裏的第9位,注意從0開始接口
INTMSK |= (0x1 << 31); //INT_ADC在INTMSK裏的第31位。文檔
其餘的相似外部中斷也是這樣操做。只是一級中斷的能夠直接從一級中控器處理,那麼就只設置一級中控器的相應開關便可。也就是說,咱們要用到的設備接口,咱們就把相應的開關打開就能夠了,其餘的讓ARM來處理就能夠了。class
5.EIN4_7屬於一級中斷源,可是該中斷源包含EIN4\EIN5\EIN6\EIN7四個子中斷源。
SRCPND源掛起寄存器。
該寄存器在中斷源發出請求時候,處理器就會自動置位該寄存器的相應的位爲1.
注意:根據三星文檔知道,該位不受寄存器影響,這個寄存器是屏蔽寄存器。在則在執行服務程序時候,該位不準進行清除,不然會致使連續中斷。清除方法是往該位寫入1。
INTMOD中斷模式寄存器
該寄存器決定中斷源爲FIQ中斷仍是IRQ中斷。
注意:根據三星文檔,INTPND寄存器和INTOFFSET寄存器只對IRQ模式有效
INTMSK中斷屏蔽寄存器
決定是否屏蔽某中斷源
注意:沒有
PRIORITY優先級寄存器
決定中斷源優先級。
INTPND中斷服務程序標誌位
根據文檔說,在中斷源沒被屏蔽,而且在等待中斷服務,優先級也是最最高的置1.啥意思,就是該寄存器對應位置1,表示CPU已經響應該對應的中斷請求。
注意:和SRCPND同樣,在中斷服務程序時候要清除該對應位。
INTOFFSET寄存器
該寄存器和INTPND配合使用的。標明INTPND寄存器裏對應IRQ中斷反映在INTOFFSET寄存器的值
注意:也須要清除位
SUBSRCPND寄存器
該寄存器與.SRCPND寄存器配合使用,在子中斷源發出請求時候,處理器就會自動置位該寄存器的相應的位爲1.
INTSUBMSK寄存器
該寄存器和INTMSK寄存器同樣,只不過是相對於子中斷而言而已。
6.借用別人網站的圖
其中深黑色的就是編程要用的寄存器,而淺黑色的寄存器時CPU根據咱們配置的寄存器產生的標誌位寄存器。
7.最後我感受和51仍是比較相似的,設置引腳爲外部中斷(有的是內部中斷),使能,肯定優先級,識別到觸發,保存現場,處理,恢復現場。嵌入式linux的程序須要和彙編一塊兒組織,目前不是特別熟悉,學習ing~