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