嵌入式知識-ARM裸機-學習筆記(7):SoC系統中斷與按鍵觸發外部中斷

嵌入式知識-ARM裸機-學習筆記(7):SoC系統中斷與按鍵觸發外部中斷

一、SoC中斷體系

1. 中斷的基本概念

什麼是中斷?
中斷的發明是用來解決宏觀上的並行需要的。 宏觀就是從整體上來看,並行就是能夠完成多件事情。微觀就是從每件事情來看,也就是指的真正的並行,精確到每一秒甚至每一刻,多個事情都是在同時進行的。宏觀上面的並行並不等於圍觀的並行,有時候宏觀上是並行的,微觀上是串行的。
舉個例子:一個人在看電影,快遞來了暫停電影跑去收快遞,收完快遞繼續回來看電影,這個例子就是宏觀上的並行和微觀上的串行。例子中一個人等同於SoC中1個CPU(也就是單核CPU),從宏觀角度來看,這個人即完成了看電影又完成了取快遞,也就是實現了兩個任務(並行)。但是從微觀角度來,這個人看電影就不能收快遞,收快遞就不能看電影(也就是說不能真正的並行,而是串行)。單核心CPU在微觀角度是串行的,但是因爲CPU很快,所以在宏觀看來可以並行。

中斷過程分析
一個程序在執行常規時,可能會因爲一箇中斷源的產生而去處理中斷,處理完之後再回到原始的狀態繼續執行程序。
對應到上面的例子:上例中大部分時間在看電影,中間少量時間去收快遞,那麼類比於CPU來說,看電影就應該是CPU的常規任務,而收快遞則應該是中斷例程。也就是說CPU平時一直在進行看電影任務,等快遞來了(中斷髮生了)快遞員(中斷源)會打電話叫人去收快遞(中斷源會觸發中斷通知CPU去處理中斷),人收到電話(CPU收到中斷信號)後會暫定電影(CPU保存常規任務的現場)跑去收快遞(CPU去執行中斷處理程序ISR處理中斷),收完快遞(執行完ISR)回來繼續看電影(CPU恢復常規任務的現場,繼續執行常規任務)。
注:ISR(Interrupt Service Routines)中斷服務程序,也就是發生中斷後該執行的程序。

異常向量表
異常向量表是CPU中某些特定地址的特定定義。當中斷髮生的時候,中斷要想辦法通知CPU去處理中斷,怎麼做到?這就要靠異常向量表。
在CPU設計時,就事先定義了CPU中一些特定地址作爲特定異常的入口地址。例如定義0x00000000地址爲復位異常向量地址,則發生復位異常時CPU會自動跳轉到0x00000000地址去執行指令。
以上講的是CPU硬件設計時對異常向量表的支持,但是需要軟件的支持。硬件已經決定了發生什麼異常CPU自動跳轉PC到哪個地址去執行,軟件需要做的就是把處理這個異常的代碼的首地址填入這個異常向量地址。

異常和中斷的區別和聯繫
針對SoC來說,發生復位、軟中斷、中斷、快速中斷、取指令異常、數據異常等,我們都統一叫異常。所以說:中斷其實是異常的一種
異常的定義就是突發事件,打斷了CPU的正常常規業務,CPU不得不跳轉到異常向量表中去執行異常處理程序;中斷是異常的一種,一般特指SoC內的內部外設產生的打斷SoC常規業務,或者外部中斷(SoC的GPIO引腳傳回來的中斷)。

爲什麼中斷要在彙編中進行?
中斷處理要注意保護現場(中斷從SVC模式來,則保存SVC模式下的必要寄存器的值)和恢復現場(中斷處理完成後,準備返回SVC模式前,要將保存的SVC模式下的必要寄存器的值恢復回去,不然到了SVC模式後寄存器的值亂了,SVC模式下原來正在進行的常規任務就被弄亂了)。
保存現場包括:第一:設置IRQ棧;第二,保存LR;第三,保存R0~R12
爲什麼要保存LR寄存器?要考慮中斷ISR執行完後如何返回SVC模式下去接着執行原來的代碼。中斷返回其實取決於我們進入中斷時如何保存現場。中斷返回時關鍵的2個寄存器就是PC和CPSR。所以我們在進入IRQ模式時,應該將SVC模式下的下一句指令的地址(中斷返回地址)和CPSR保存起來,將來恢復時纔可以將中斷返回地址給PC,將保存的CPSR給CPSR中斷返回地址就保存在LR中,而CPSR(自動)保存在(IRQ模式下的)SPSR中。
總結:
(1)保現場關鍵是保存:中斷處理程序的返回地址,r0-r12(cpsr是自動保存的)。
(2)恢復現場主要是恢復:r0-r12,pc,cpsr。

2. 中斷的基本過程

中斷處理一般分爲兩個階段。

階段一:異常向量表階段
第一個階段之所以能夠進行,主要依賴於CPU設計時提供的異常向量表機制。第一個階段的主要任務是從異常發生到響應異常並且保存/恢復現場、跳轉到真正的異常處理程序處。
階段二:處理中斷階段
第二個階段的目的是識別多箇中斷源中究竟哪一個發生了中斷,然後調用相應的中斷處理程序來處理這個中斷。
小階段1:查詢中斷狀態寄存器來確定在哪裏發生了中斷。
小階段2:通過ISR函數指針來執行對應的中斷響應。

二、S5PV210中斷代碼詳解

1. 中斷處理時要用到的寄存器

(1)VICINTENABLE和VICINTENCLEAR
在這裏插入圖片描述
VICINTENABLE 對應interrupt enable,負責相應的中斷的使能,當我們想使能(意思就是啓用這個中斷,意思就是當硬件產生中斷時CPU能接收的到)某個中斷時,只要在這個中斷編號對應的VICnINTENABLE的相應bit位寫1即可(注意這個位寫1其他位寫0對其他位沒有影響)。
VICINTENCLEAR對應interrupt enable clear,負責相應的中斷的禁止,如果我們想禁止某個中斷源時,只要向VICnINTENCLEAR中相應的位寫1即可。

(2)VICINTSELECT
在這裏插入圖片描述
設置各個中斷的模式爲irq還是fiq,一般都設置成irq。
IRQ和FIQ究竟有何區別?210中支持2種中斷,irq和fiq。irq是普通中斷,fiq是快速中斷。快速中斷提供一種更快響應處理的中斷通道,用於對實時性要求很高的中斷源。fiq在CPU設計時預先提供了一些機制保證fiq可以被快速處理,從而保證實時性。fiq的限制就是隻能有一箇中斷源被設置爲fiq,其他都是irq。
CPU如何保證fiq比irq快?有2個原因:第一,fiq模式有專用的r8r12,因此在fiq的isr中可以直接使用r8r12而不用保存,這就能節省時間;第二,異常向量表中fiq是最後一個異常向量入口。因此fiq的isr不需要跳轉,可以直接寫在原地,這樣就比其他異常少跳轉一次,省了些時間。

(3)VICIRQSTATUS和VICFIQSTATUS
在這裏插入圖片描述
中斷狀態寄存器,是隻讀的。當發生了中斷時,硬件會自動將該寄存器的對應位置爲1,表示中斷髮生了。軟件在處理中斷第二階段的第一階段,就是靠查詢這個寄存器來得到中斷編號的。

(4)VICVECTPRIORITY0~VICVECTPRIORITY31
在這裏插入圖片描述
中斷優先級設置寄存器,設置多箇中斷同時發生時先處理誰後處理誰的問題。一般來說高優先級的中斷可以打斷低優先級的中斷,從而嵌套處理中斷。當然了有些硬件/軟件可以設置不支持中斷嵌套。

(5)VICVECTADDR0~VICVECTADDR31、VICADDR
在這裏插入圖片描述
在這裏插入圖片描述
這幾個寄存器和210中斷處理第二階段的第二階段有關。
VICnVECTADDR0到31這32個寄存器分別用來存放真正的各個中斷對應的isr的函數地址。相當於每一箇中斷源都有一個VECTADDR寄存器,程序員在設置中斷的時候,把這個中斷的isr地址直接放入這個中斷對應的VECTADDR寄存器即可。
S5PV210中因爲支持的中斷源很多,所以直接設計了4個中斷寄存器(也就是VICVECTADDR),每個32位,每位對應一箇中斷源。(理論上210最多支持128箇中斷,實際支持不足128個,有些位是空的);210沒有子中斷寄存器,每個中斷源都是並列的。當中斷髮生時,在irq_handler中依次去查詢4箇中斷源寄存器,看哪一個的哪一位被置1,則這個位對應的寄存器就發生了中斷,即找到了中斷編號。

VICnADDR這個寄存器是隻需要讀的,它裏面的內容是由硬件自動設置的。當發生了相應中斷時,硬件會自動識別中斷編號,並且會自動找到這個中斷的VECTADDR寄存器,然後將其讀出複製到VICnADDR中,供我們使用 。 這樣的設計避免了軟件查找中斷源和isr,節省了時間,提高了210的中斷響應速度。
210開拓了一種全新的尋找ISR的機制:210提供了很多寄存器來解決每個中斷源對應ISR的尋找問題,當發生相應中斷時,硬件會自動的將相應ISR推入一定的寄存器中(也就是VICADDR),我們軟件只要去這個寄存器中執行函數就行了。

2. 中斷處理函數解析

(1)int.c文件
綁定中斷異常向量表
在這裏插入圖片描述
初始化中斷控制寄存器
在這裏插入圖片描述
綁定ISR到VICnVECTADDR寄存器

在這裏插入圖片描述
使能中斷
在這裏插入圖片描述
禁止中斷的原理與使能中斷的原理相同,只是給VICINTENABLE寄存器寫數據變爲了給VICINTENCLEAR寫寄存器。

中斷處理函數
在這裏插入圖片描述
這裏需要搞清楚2個寄存器的區別:VICnVECTADDR和VICnADDR
VICVECTADDR寄存器一共有4×32個,每個中斷源都有一個VECTADDR寄存器,我們應該將自己爲這個中斷源寫的ISR地址丟到這個中斷源對應的VECTADDR寄存器中即可。
當發生中斷時,硬件會自動把相應中斷源的ISR地址從VICnVECTADDR寄存器中推入VICnADDR寄存器中,所以我們第二階段的第二階段isr_handler中,只需要到相應的VICnADDR中去拿出ISR地址,調用執行即可。
這裏綁定ISR地址到VICnVECTADDR和中斷髮生時第二階段的第二階段如何獲取ISR地址,這兩步是相關的。 這兩個的結合技術,就是我們一直在說的210的硬件自動尋找ISR的機制。

handler是真正的中斷處理程序,這裏只考慮中斷處理,不考慮保護現場/恢復現場。
handle中做現場保護。

(2)int.h文件
在這裏插入圖片描述
(3)start.S文件
在這裏插入圖片描述

整個中斷的流程梳理:
整個中斷的工作分爲2部分:
第一部分是我們爲中斷響應而做的預備工作:
1. 初始化中斷控制器
2. 綁定寫好的isr到中斷控制器
3. 相應中斷的所有條件使能
第二部分是當硬件產生中斷後如何自動執行isr:
1. 第一步,經過異常向量表跳轉入IRQ/FIQ的入口
2. 第二步,做中斷現場保護(在start.S中),然後跳入isr_handler(第二階段)
3. 第三步,在isr_handler中先去搞清楚是哪個VIC中斷了,然後直接去這個VIC的ADDR寄存器中取isr來執行即可。
4. 第四步,isr執行完,中斷現場恢復,直接返回繼續做常規任務。

二、S5PV210外部中斷過程詳解

1. 外部中斷

SoC支持的中斷類型中有一類叫外部中斷。內部中斷就是指的中斷源來自於SoC內部(一般是內部外設),譬如串口、定時器等部件產生的中斷;外部中斷是SoC外部的設備,通過外部中斷對應的GPIO引腳產生的中斷。
按鍵在SoC中就使用外部中斷來實現。具體實現方法是:將按鍵電路接在外部中斷的GPIO上,然後將GPIO配置爲外部中斷模式。 此時人通過按按鍵改變按鍵電路的電壓高低,這個電壓高低會觸發GPIO對應的外部中斷,通過引腳傳進去給CPU處理。

本實驗採用S5PV210板卡上的按鍵來觸發外部中斷,選用板卡上的LEFT、DOWN、RIGHT按鍵作爲觸發源。通過調試可得,該3個按鍵對應的寄存器爲GPH0_2、GPH0_3、GPH2_1。

2. 配置按鍵爲外部中斷觸發模式

首先通過GPIO來初始化外部按鍵,包括GPIO模式設置,中斷觸發模式設置,中斷允許,清掛起:
在這裏插入圖片描述
編寫ISR程序:
在這裏插入圖片描述

3. 中斷髮生以及處理的過程

第一步:產生中斷
當我們按下按鍵時,對應的GPIO口的電平會發生變化,根據原理圖可得,當按下時信號電平又高變低,相當於產生了一個下降沿。此時GPIO口的模式已經配置爲EXT模式(外部中斷),並且中斷觸發模式也設置爲了下降沿觸發,這時CPU則會檢測到一箇中斷信號。假設我們按下的按鍵時LEFT,對應的GPIO接口爲GPHO_2,因此CPU則會知道這個GPIO接口產生了一個下降沿。

第二步:查找異常向量表
在CPU發生中斷後,由於設置爲了IRQ模式,因此CPU會自動執行IRQ模式下的一系列操作,包括設置棧,保存LR、R0-R12、CPSR(相當於保存當前執行進度)。
在這裏插入圖片描述
第三步:查找對應中斷的VIC
在這裏插入圖片描述
由於之前已經將中斷位置與中斷物理標號進行了綁定,因此CPU會根據中斷的物理編號去判斷是哪個VIC上發生了中斷,並使能該VIC。由於開始已經將ISR函數的地址與對應的VERTADDR進行了綁定,當發生相應中斷時,硬件會自動的將相應ISR推入到VICADDR寄存器中,我們軟件只要去這個寄存器中執行函數就行了。
第四步:執行中斷處理程序
在這裏插入圖片描述
通過VICADDR寄存器,CPU訪問到了ISR函數,然後執行對應的中斷處理程序。執行完程序之後,恢復現場,使得程序繼續正常運行,並清理掉掛起,以防對下次發生中斷時造成影響。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章