天天看點

ARM中斷 - ARM核心(五)

ARM核心中斷是ARM異常的一種,用來實作外部資料和外部硬體之間進行通信。核心每次執行完一條指令都會查詢其硬體中斷情況,如果此時硬體硬體中斷信号被拉起來,就會觸發中斷異常,跳轉到異常向量表處理。作為SOC複雜片上系統管理衆多外部硬體裝置,不可能在核心中開發衆多的硬體信号給各個外設。一次在SOC設計時會在ARM核心外增加一道多層輔助的中斷控制網絡,這種中斷網絡針對不同SOC設計或者不同公司是的不同系列産品其中斷IP是不一緻的。前面提到核心轉到中斷向量表進行進行代碼執行,結合複雜的外部硬體控制器網絡(類似GIC),在這部分代碼進行中會讀取中斷控制網絡器中的資料進行複雜的中斷網絡處理。對于核心的中斷異常,很難使用獨立的代碼出發硬體類型中斷讓核心處于中斷異常,都是需要結合外部中斷網絡來完成的。但其實中斷異常核心的異常基本處理流程和其他類型的異常沒有本質差别,核心差别在于内容處理這裡需要擷取SOC上面的中斷控制器來配合完成整個中斷體系的管理。基于如上兩點,我們這裡不專門針對ARM核心的中斷異常進行實驗,而是主要針對外部中斷控制器來完成整體的工作。本篇文章實際上不屬于ARM核心部分内容,更應該是SOC的内容。

本篇主要是針對SOC硬體中斷控制器内容進行講解,講解中斷硬體配置和使用,對于中斷軟體的處理隻是給定了簡單的序列槽列印。關于複雜的軟體進行中斷流程,看Linux的中斷體系架構文章。

1. 中斷體系

在SOC中包含了ARM核心,ARM核心其他的異常模式功能相應預設是打開的,但是ARM核心是否響應外部中斷控制器通給其的硬體中斷信号是需要對ARM的CPSR狀态寄存器中斷使能控制為配置的。正常情況下,對齊配置1為使能外部中斷響應,這個時候整個外部的中斷網絡中的中斷資訊才可能被ARM核心響應。

1.1 中斷硬體架構

中斷是一種特殊的異常模式,用來實作外部器件打斷CPU核心的運作。中斷基本的硬體架構如下:

  • 中斷源。中斷源多種多樣,比如GPIO、定時器、UART、DMA等等。它們都有自己的寄存器,可以進行相關設定:使能中斷、中斷狀态、中斷類型等等。
  • 中斷控制器。各種中斷源發出的中斷信号,彙聚到中斷控制器進行統一管理。可以在中斷控制器中設定各個中斷的優先級。中斷控制器會向CPU發出中斷信号,CPU可以讀取中斷控制器的寄存器,判斷目前處理的是哪個中斷。中斷控制器有多種實作,比如:
    • STM32F103中被稱為NVIC:Nested vectored interrupt controller(嵌套向量中斷控制器)
    • ARM9中一般是晶片廠家自己實作的,沒有統一标準
    • Cortex A7中使用GIC(Generic Interrupt Controller)
  • CPU。CPU每執行完一條指令,都會按照設計的掃描優先級依次判斷一下是否有中斷發生了。CPU也有自己的寄存器,可以設定它來使能/禁止中斷,這是中斷處理的總開關。
    • 對于低端的晶片可能直接是打開狀态,或者某一個内部寄存器
    • 對于高端的ARM晶片通過設定程式狀态寄存器中IRQ使能辨別來打開

1.2 執行個體 - TM32F103

ARM中斷 - ARM核心(五)

對于GPIO中斷,STM32F103又引入了

External interrupt/event controller (EXTI)

。用來設定GPIO的中斷類型并進行GPIO的管理。對于序列槽或者網口相關的額中斷直接連結在NVIC中斷控制器上面進行管理。EXTI可以給NVIC提供16個中斷信号:EXTI0~EXTI15。那麼某個EXTIx,它來自哪些GPIO呢?這需要設定GPIO控制器完成這種映射關系的對應。

1.3 執行個體 - imx6ull

對于imx6ull這種A7類型開發闆外部所有中斷都是統一通過General Interrupt Control來控制管理,如果中斷已經觸發,就将CPU與GIC對應的中斷硬體拉高觸發相關的中斷。當然CPU進行中斷過程中也可以将中斷控制器的屏蔽寄存器打開或者直接去使能中斷觸發,這個時候GIC就沒有辦法像CPU彙報自己中斷處理以後的結果。

ARM中斷 - ARM核心(五)

 需要另外注意的一個點是對于高端的晶片GIC可以針對多核CPU進行管理,也就是說GIC可以配置某種類型的中斷隻發給某個CPU核,同時CPU核之間也可以通過GIC完成互相通信。另外加上CPU内部的一些定時器觸發自身中斷。也即是說高端CPU核一般有三張類型的中斷。

2. 中斷優先級與嵌套

2.1 中斷優先級

中斷優先級的管理都是在中斷控制器(GIC或NVIC)中管理完成完成。在說到中斷之前,我先來定義一下優先級,明白了什麼是優先級,後面的闡述就容易明白了。實際上很多人都是混淆了優先級的含義,是以才覺得糊裡糊塗。中斷的優先級有兩個:查詢優先級和執行優先級。

  •  什麼是查詢優級呢?我們從datasheet或書上看到的預設(IP寄存器不做設定,上電複位後為00H)的優先級:外部中斷0 > 定時/計數器0 > 外部中斷1 > 定時/計數器1 > 串行中斷。或 int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART。或 PX0>PT0>PX1>PT1>PS>......

其實都是查詢優級。首先查詢優先級是不可以更改和設定的,這個是硬體設計中斷控制器這種中斷控制狀态機的時候固定下來的。這是一個中斷優先權排隊的問題。是指多個中斷源同時産生中斷信号時,中斷仲裁器選擇對哪個中斷源優先處理的順序。而這與是否發生中斷服務程式的嵌套毫不相幹。當CPU查詢各個中斷标志位的時候,會依照上述5個查詢優先級順序依次查詢,當數個中斷同時請求的時候,會優先查詢到高優查詢先級的中斷标志位,但并不代表高查詢優先級的中斷可以打斷已經并且正在執行的低查詢優先級的中斷服務。

例如:當計數器0中斷和外部中斷1(按查詢優先級,計數器0中斷>外部中斷1)同時到達時,會進入計時器0的中斷服務函數;但是在外部中斷1的中斷服務函數正在服務的情況下,這時候任何中斷都是打斷不了它的,包括邏輯優先級比它高的外部中斷0計數器0中斷。

  • 中斷的執行優先級就是你對IP寄存器的設定了。在2個優先級的情況下,某位為1,則相應的中斷源為高優先級;為0,則為低優先級。對于ARM系統存在多個優先級,數字越小優先級越高,也即是說0号中斷優先級最高。

關于中斷的優先級有三條原則:

1、CPU同時接收到幾個中斷時,首先響應優先級最高的中斷請求;但如果優先級序列最高的存在多個中斷,這個時候按照查詢優先級(中斷向量表的前後順序)來執行中斷處理程式;

2、正在進行的中斷過程不能被新的同級或低行優優先級的中斷請求所中斷(實際硬體細節是中斷控制器進行判定,它會記錄目前自己發送給CPU的中斷是什麼以及優先級,如果新來的優先級比這個優先級低,中斷控制器就直接攔下來,不會拉中斷消息傳輸引腳告知CPU);

3、正在進行的低行優優先級中斷服務,能被高行優優先級中斷請求中斷;

若:同一執行優先級中的中斷申請不止一個時,則有一個中斷優先權排隊問題。同一執行優先級的中斷優先權排隊,由中斷系統硬體确定的自然優先級形成,優先權自高到低的順序即:

外部中斷0>定時/計數0>外部中斷1>定時/計數1>串行接口

例如:設定IP = 0x10,即設定序列槽中斷為最高優先級,則序列槽中斷可以打斷任何其他的中斷服務函數實作嵌套,且隻有序列槽中斷能打斷其他中斷的服務函數。若序列槽中斷沒有觸發,則其他幾個中斷之間還是保持邏輯優先級,互相之間無法嵌套。

2.2. 中斷嵌套

中斷嵌套是中斷發生的一種情況,這種情況條件是中斷優先級高的中斷在中斷優先級低的中斷處理過程中發生,這個時候中斷控制器會通過硬體接口傳遞資訊給CPU新的中斷發生。中斷嵌套過程中斷控制器工作如前所講是比較簡單的,但是中斷嵌套現場儲存合計恢複過程确實複雜的,這個複雜過程可以CPU自己硬體設計做(M3),也可以軟體完成(A7)。現場儲存過程實際是将CPU内部相關的寄存器儲存到一個不會被改寫的存儲器位置,至于這種存儲器類型根據不同的處理器内容可能不一樣(SDRAM或者ERAM)。實際較大的系統當中中斷嵌套發生的機率是非常大的。中斷現場儲存于恢複相比于函數棧的調用過程資訊儲存兩者極為類似,差别是函數調用過程由于函數形式确定,函數儲存和恢複的現場都是确定的。但是對于中斷發生時機不确定,儲存的資料自然也是盡可能多,進而保證資料不被丢失。中斷過程相比于函數會多儲存過個普通寄存器An,同時還會儲存程式狀态寄存器。

3. 代碼執行個體

繼續閱讀