Exynos4412 中断驱动开发(二)—— 中断处理流程分析
?前面已經學習了中斷的注冊過程,下面由一張流程圖來看一下當中斷發生時的處理流程:
中斷發生之后處理流程
a -- 具體的CPU architecture相關模塊進行現場保護,然后調用machine driver執行對應的中斷處理handler;
b -- machine driver對應中斷處理handler會根據硬件的信息獲取HW interrupt ?id,然后通過irq domain模塊翻譯成irq number;
c -- 調用該IRQ number對應 hign level irq ?event handler,在這個hign level的handler中,會通過和中斷控制器交互,進行中斷處理的flow 控制(中斷的嵌套、搶占),最終會遍歷我們注冊的IRQ action list,調用對應處理函數;
d -- CPU architeccture相關模塊進行現場的恢復;
具體分析之前先看幾個基礎概念:
一、?中斷硬件框架
? ? ? ? 中斷的主動通知特性需要硬件設施支持。在數字邏輯電路層面,外部設備和處理器之間有一條專門的中斷信號線(Interrupt Line),用于連接外設與CPU的中斷引腳(Interrupt Pin)。當外部設備發生狀態改變時,可以通過這條信號線向處理器發出一個中斷請求(Interrupt Request,IRQ),其中外部設備通常被稱作中斷源(Interrupt Source)。
? ? ? ? 處理器一般只有兩根左右的中斷引腳(Cortex A9 中的 IRQ、FIQ),而管理的外設卻很多。為了解決這個問題,現代設備的中斷信號線并不是與處理器直接相連,而是與一個稱為中斷控制器的設備相連接,后者才跟處理器的中斷引腳連接。中斷控制器一般可以通過處理器進行編程配置,在Cortex A9 中稱為通用中斷控制器GIC(Gerneric Interrupt Controller)。下圖是一個典型的中斷硬件連接的系統框架圖:
? ? ? 這里的中斷控制器是可編程中斷控制器PIC(Programmable Interrupt Controller)。上圖中,PIC的輸出中斷信號線連接到處理器的INT引腳上,這是處理器專門用來接收中斷信號的pin腳。外部設備的中斷線連接到PIC的pin引腳上,這是PIC用來接收外設中斷的pin腳。比如第一個設備的中斷線通過P0連到PIC上。在實際的硬件平臺上,PIC有的在CPU外部,比如x86平臺的8259中斷控制器;有的被封裝到CPU的內部,這廣泛見于嵌入式領域。一顆SoC芯片內部集成了處理器和各種外部設備的控制器,其中包括PIC。
? ? ?IRQ相關信息管理的關鍵點是一個全局數組,每個數組項對應一個IRQ編號,軟件中斷號irq就是這個數組的索引,irq將一對一或多對一(共享)映射到硬件中斷源編號。不同的操作系統相關數據結構的實現和映射策略實現可能有差別。
? ? ?對于Exynos4412 硬件操作過程簡單說一下:
a -- 當外設檢測到中斷之后,就會通過interrupt request line上的電平或者邊沿通知到該外設連接到的那個中斷控制器,中斷控制器就會在多個cpu中選一個,并且把該中斷同IRQ分發給cpu
b -- 修改CPSR, 模式
c -- 保存發生中斷那一點的CPSR值 ?pc值
d -- mask IRQ exeption。
e -- 設定pc的值為 IRQ vector,一旦跳到中斷向量表,后面就是軟件行為了 ?
二、 中斷向量表
? ? ? ? ?中斷向量表其實是處理器內部的概念,因為處理器除了會被外部設備中斷外,其內部也可能產生異常等事件,例如在MIPS中,中斷只是異常的一種。當這些事件發生時,CPU必須暫停手頭上的工作,轉而去處理中斷或異常,因此處理器需要知道到哪里去獲得這些中斷或異常的處理函數的目標地址。中斷向量表就是用來解決這個問題,其中每一項都是一個中斷或異常處理函數的入口地址,具體來說4個字節的函數指針將指向一段匯編微碼(intConnectCode)執行跳轉。
? ? ?外部設備的中斷常常對應向量表中的某一項,這是通用框架的外部中斷處理函數入口,因此在進入通用的中斷處理函數之后,系統必須知道正在處理的中斷是哪一個設備產生的,而這正是由軟件中斷號irq定的決。中斷向量表的內容是由操作系統在初始化階段來填寫,對于外部中斷,操作系統負責實現一個通用的外部中斷處理函數,然后把這個函數的入口地址放到中斷向量表中的對應位置。用戶注冊設備驅動ISR,實際上就是掛接到中斷向量表中,覆蓋某一項的默認處理實現特化。
? ? Exynos4412 的中斷向量表在linux-3.14-fs4412\arch\arm\kernel\entry-armv.S
三、中斷流程分析
1、當中斷發生時會跳轉到中斷向量表處,就是上面那張表;
2、匯編處理部分如下:
table16個入口,只有2項有效,對應user mode、svc mode
代碼走到這個地方 已經svc模式
這里有兩個問題
1、handle_arch_irq 從哪來?
gic_init_bases ?—> set_handle_irq(gic_handle_irq)—>??handle_arch_irq = handle_irq;
handle_arch_irq 實際執行的是gic_handle_irq
| gic_handle_irq?—>?handle_IRQ?—>?generic_handle_irq()—>?generic_handle_irq_desc—>desc?—>handle_irq(irq,?desc); |
2、desc->handle_irq從哪來?
| s3c_irq_type —>irq_set_handler(data->irq,?handle_level_irq); —>?__irq_set_handler —> __irq_set_handler-----?desc->handle_irq?=?handle; handle_level_irq() handle_irq_event —>?handle_irq_event_percpu —>res?=?action->handler(irq,?action->dev_id);真正調用到我們注冊的中斷處理函數 |
總結
以上是生活随笔為你收集整理的Exynos4412 中断驱动开发(二)—— 中断处理流程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php ttc转ttf 在线,iPad字
- 下一篇: PCB中加入logo