一、前言
中斷是什么? 舉個例子來說,當我們正在工作時,突然電話響了,這時你會把手里的工作先停下來,然后去接電話,當接完電話后,電話里的人安排你馬上做一件事,這時你需要立刻去做這件事,當把這件事做完后你會繼續之前被打斷的工作,這個過程為一次中斷。
在計算機科學中,中斷指計算機CPU獲知某些事,暫停正在執行的程序,轉而去執行處理該事件的程序,當這段程序執行完畢后再繼續執行之前的程序。 整個過程稱為中斷處理,簡稱中斷,而引起這一過程的事件稱為中斷事件。 中斷是計算機實現并發執行的關鍵,也是操作系統工作的根本。 中斷能提高CPU的效率,同時能對突發事件做出實時處理。 實現程序的并行化,實現嵌入式系統進程之間的切換。
后續將從以下圖1中所示的幾個方面對STM32的中斷系統進行基本的解析。
圖1 中斷系統學習框架
二、 基本原理概述
圖2 基本原理概述
1、中斷的作用
(1)速度匹配,提高機器系統效率。 系統中處理機的工作速度遠高于外圍設備的工作速度。 通過中斷可以協調它們之間的工作。 當外圍設備需要與處理機交換信息時,由外圍設備向處理機發出中斷請求,處理機及時響應并作相應處理。 不交換信息時,處理機和外圍設備處于各自獨立的并行工作狀態。
(2)分時操作,維持系統可靠正常工作。 現代計算機中,程序員不能直接干預和操縱機器,必須通過中斷系統向操作系統發出請求,由操作系統來實現人為干預。 主存儲器中往往有多道程序和各自的存儲空間。 在程序運行過程中,如出現越界訪問,有可能引起程序混亂或相互破壞信息。 為避免這類事件的發生,由存儲管理部件進行監測,一旦發生越界訪問,向處理機發出中斷請求,處理機立即采取保護措施。
(3)實時響應,滿足實時處理要求。 在實時系統中,各種監測和控制裝置隨機地向處理機發出中斷請求,處理機隨時響應并進行處理。
(4)提供故障現場處理手段,可靠性高。 處理機中設有各種故障檢測和錯誤診斷的部件,一旦發現故障或錯誤,立即發出中斷請求,進行故障現場記錄和隔離,為進一步處理提供必要的依據。
2、中斷和異常
ARM公司設計了如Cortex-M3或Cortex-M4內核,這個內核就包含了中斷系統框架,ST公司根據該內核,因地制宜的設計了STM32系列產品。
CPU內核中斷和核外外設中斷,其中內核中斷,在官方手冊上,內核中斷叫異常(exception)和核外外設中斷才叫中斷(interrupt),其實是一回事。
ARM Cortex M3內核支持256個中斷,包括16個內核中斷和240個外設中斷,擁有256個中斷優先級別。
Cortex-M4內核支持256個中斷,其中包含了16個內核中斷和240個外部中斷,并且具有256級的可編程中斷設置。
STM32并沒有使用Cortex-M4內核的全部東西,而是只用了它的一部分,中斷數量及中斷優先級也進行裁剪用了一部分。
STM32的每個外設都可以產生中斷,如STM32F407系列一共有98個中斷,包括16個內核中斷和82個可屏蔽中斷,具有16級可編程的中斷優先級。
通常,把CPU內部產生的緊急事件叫做異常。 異常通常是微處理器內部發生的,大多是軟件引起的,比如比如非法指令(除零)、地址訪問越界、特權調用異常等待。 異常是指由于cpu本身故障、程序故障或者請求服務等引起的錯誤,異常屬于不正常現象。
把來自CPU外部的片上外設產生的緊急事件叫做中斷。 中斷是微處理器外部發送的,通過中斷通道送入處理器內部,一般是硬件引起的,比如GPIO引腳電平變化、定時器溢出、串口接收中斷等。 中斷是指系統停止當前正在運行的程序轉而其他服務,可能是程序接收了比自身高優先級的請求,或者是人為設置中斷,中斷是屬于正常現象。
不管是中斷還是異常,異常與中斷都是硬件支持的,微處理器通常都有相應的中斷/異常服務程序,異常和中斷的效果基本一致,都是暫停當前任務,優先執行緊急事件。
圖3 異常和中斷編號表
所有的異常和中斷用一個表管理起來,編號為0~15 的稱為內核異常(需要說明的是,16個編號的內核中斷,但是STM32本身的內核中斷是11個,還有5個是保留的沒用的),而 16 以上的則稱為核外(外部)中斷(相對內核而言,對于不同系列的STM32,大致的編號和數量相同,但是對于高級的,因為片上外設要多一些,所以中斷的數量也會多一些), 這個表就稱為中斷向量表。 這個中斷向量表,這個中斷向量表,本質上可以理解成一個4個字節類型Int的數組,每一個元素就是放的是對應編號的中,外部中斷是我們必須學習掌握的知識,包含線中斷,定時器中斷,I2C,SPI等所有的外設中斷,可配置優先級。
Reset( 復位)、NMI( Non Maskable Interrupt,不可屏蔽中斷)、HardFault( 硬件異常)的優先級是固定的,且優先級是負數,也就是最高的(優先級數字越小,優先級越高)。 剩下的異常或中斷,都是可以通過修改NVIC的寄存器調整優先級( 但不能設置為負數)。 NVIC作為在內核里的外設,也是通過存儲器映射的方式訪問。
3、NVIC中斷控制器
有如此多的中斷信號, CPU如何去控制它呢? 內核有一個專門管理中斷的外設NVIC(嵌套向量中斷控制器),可以實現低延遲的中斷處理和晚到中斷的高效處理,通過優先級控制中斷的嵌套和調度來管理; NVIC是一個總的中斷控制器,無論是來在內核的異常還是外設的外部中斷, 都由NVIC統一進行管理。 NVIC收到外設的中斷請求,會將其中斷請求發送給內核,內核收到NVIC的中斷通知之后,就會去判斷此時哪個中斷發生,然后查找FLASH中斷向量表去獲取相應的中斷處理函數。
它具有以下特征:
(1)支持嵌套和向量中斷;
(2)自動保存和恢復處理器狀態;
(3)動態改變優先級;
(4)簡化的和確定的中斷時間。
帶來的優勢:
(1)響應速度提高;
(2)標準化,統一管理。
圖4 NVIC在芯片上的位置
4、中斷的分類
中斷按事件來源分類,可以分為外部中斷和內部中斷。 中斷事件來自于內核外部的被稱為外部中斷,來自于內核內部的則為內部中斷。
進一步細分,外部中斷還可分為可屏蔽中斷(maskable interrupt)和不可屏蔽中斷(non-maskable interrupt)兩種,而內部中斷按事件是否正常來劃分可分為軟中斷和異常兩種。
外部中斷的中斷事件來源于內核外部,必然是某個硬件產生的,所以外部中斷又被稱為硬件中斷(hardware interrupt)。 計算機的外部設備,如網卡、聲卡、顯卡等都能產生中斷。 外部設備的中斷信號是通過兩根信號線通知CPU的,一根是IRQ,另一根是NMI。 CPU從IRQ收到的中斷信號都是不影響系統運行的,CPU可以選擇屏蔽(通過設置中斷屏蔽寄存器中的IF位),而從NMI中收到的中斷信號則是影響系統運行的嚴重錯誤,不可屏蔽,因為屏蔽的意義不大,系統已經無法運行。
內部中斷來自于內核內部,其中軟中斷是由軟件主動發起的中斷,常被用于系統調用(system call),任務切換(PendSV)等; 而異常則是指令執行期間CPU內部產生的錯誤引起的。 異常也和不可屏蔽中斷區別在于不可屏蔽中斷發生的事件會導致處理器無法運行(如斷電、電源故障等),而異常則是影響系統正常運行的中斷(如除0、越界訪問等)。
三、 中斷管理機制
圖5 中斷管理機制要素
1、中斷向量
由于CPU隨時都可能檢測到中斷信息,也就是說,CPU 隨時都可能執行中斷處理程序,所以中斷處理程序必須一直存儲在內存某段空間之中。 中斷處理程序在內存中的入口地址稱為中斷向量; 而要確定中斷處理程序的入口地址,處理器利用了一種向量表機制:即中斷向量,必須存儲在對應的中斷向量表表項中。 采用向量表處理中斷,處理器會從存儲器的向量表中,自動定位中斷的程序入口。 從發生中斷到中斷的處理中間的時間被縮減。
STM32的內部閃存地址起始于0x8000000,一般情況下,程序文件就從此地址開始寫入。 此外STM32其內部通過“中斷向量表”來響應中斷,程序啟動后,將首先從“中斷向量表”取出復位中斷向量執行復位中斷程序完成啟動。 而這張“中斷向量表”的起始地址是0x8000004,當中斷來臨,STM32的內部硬件機制亦會自動將PC指針定位到“中斷向量表”處,并根據中斷源取出對應的中斷向量執行中斷服務程序。
圖6 中斷向量執行
(1)STM32復位后,會從地址為0x8000004處取出復位中斷向量的地址,并跳轉執行復位中斷服務程序,如圖6中標號①所示。
(2)復位中斷服務程序執行的最終結果是跳轉至C程序的main函數,如圖6中標號②所示,而main函數應該是一個死循環,是一個永不返回的函數。
(3)在main函數執行的過程中,發生了一個中斷請求,此時STM32的硬件機制會將PC指針強制指回中斷向量表處,如圖6中標號③所示。
(4)根據中斷源進入相應的中斷服務程序,如圖6中標號④所示。
(5)中斷服務程序執行完畢后,程序再度返回至main函數中執行,如圖6中標號⑤所示。
2、中斷優先級
中斷優先級通過優先級配置寄存器進行配置,本寄存器寬度為8位,原則上每個中斷可配置編程的優先級為0~255,實際上可編程優先級的實際數量由芯片設計商決定,多數Cortex-M3或Cortex-M4芯片支持的優先級較少,這是因為大量的優先級會增加NVIC的復雜度,而且會增加功耗降低速度,多數情況下,應用程序只需要少量的編程優先級,因此芯片廠商需要基于目標應用的優先級數量設計處理器優先級,優先級的減少是通過去除優先級配置寄存器的低位實現,STM32只用到了中斷優先級寄存器的的高4位。如圖,使用到了bit7到bit4,最多可以配置0~16個中斷優先級:
圖7 4位優先級寄存器
這個4 位數字的位數分可以配成搶占優先級部分和響應優先級部分,因此可以有5組配置選擇:
圖8 中斷優先級描述
優先級數值越小,優先級越高。
搶占優先級,是指打斷其他中斷的屬性,即因為具有這個屬性會出現嵌套中斷,搶占優先級的概念等同于單片機中的常規中斷。 假設有兩中斷先后觸發,已經在執行的中斷搶占優先級如果沒有后觸發的中斷搶占優先級更高,就會先處理搶占優先級高的中斷。 也就是說有較高的搶占優先級的中斷可以打斷搶占優先級較低的中斷。
響應優先級也叫做亞優先級或者子優先級, 響應屬性則應用在搶占屬性相同的情況下,當兩個中斷向量的搶占優先級相同時,如果兩個中斷同時到達,則先處理響應優先級高的中斷。
回到優先級上來。 具有高搶占式優先級的中斷可以在具有低搶占式優先級的中斷處理過程中被響應,即中斷嵌套,或者說高搶占式優先級的中斷可以嵌套在低搶占式優先級的中斷中。 當兩個中斷源的搶占式優先級相同時,這兩個中斷將沒有嵌套關系,當一個中斷到來后,如果正在處理另一個中斷,這個后到來的中斷就要等到前一個中斷處理完之后才能被處理。 如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先級高低來決定先處理哪一個; 如果他們的搶占式優先級和響應優先級都相等,則根據他們在中斷向量表中的排位順序決定先處理哪一個,中斷向量表排在前面的中斷優先級高。
看了上面的介紹后,相信大家都明白了這里面的關系了,總結下就是:搶占式優先級>響應優先級>中斷表中的排位順序。
3、中斷嵌套
中斷嵌套是指中斷系統正在執行一個中斷服務時,有另一個優先級更高的中斷提出中斷請求,這時會暫時終止當前正在執行的級別較低的中斷源的服務程序,去處理級別更高的中斷源,待處理完畢,再返回到被中斷了的中斷服務程序繼續執行的過程。
在STM32中,只有搶占優先級才決定了中斷嵌套。
如下圖所示,搶占優先級高的任務出現后,會打斷搶占優先級低的任務,即所謂的中斷嵌套。 例如:
圖9 中斷嵌套示意圖
搶占優先級為N的中斷任務正在運行,此時,搶占優先級為2的中斷產生,則MCU會將搶占優先級為N的任務暫時停止,先響應執行中斷優先級為2的任務,待該任務完成后,再來完成搶占優先級為N的任務。
若是搶占優先級為2的中斷正在運行,又有新的搶占優先級為2的中斷產生,則新產生的中斷會等待當前中斷任務完成后,再執行新產生的中斷。
若是搶占優先級相同的任務同時產生,則響應優先級高的中斷先執行。 若是搶占優先級,響應優先級均相同的中斷同時產生,則根據該中斷在中斷向量表的順序來執行中斷任務。
四、 中斷處理流程
圖10 中斷處理流程
下圖為中斷處理流程示意圖,可以概括性的將處理流程分為:進入中斷、中斷處理和退出中斷。
圖11 中斷處理示意
進入中斷:
(1)中斷源發出請求,硬件判斷處理器是否允許中斷及該中斷是否被屏蔽,若允許中斷則當前運行的程序被打斷;
(2)處理器將各寄存器的內容壓入堆棧保存,主要是PC, xPSR, R0-R3, R12, LR寄存器;
(3)根據中斷向量號,到中斷向量表中找到中斷服務程序的入口地址跳轉執行。
中斷處理:
(1)執行中斷服務程序;
(2)遵循中斷優先級和中斷嵌套的執行規則。
退出中斷:
(1)將保存在堆棧中的現場信息彈出到原來的寄存器中;
(2)返回被原先被中斷的程序處繼續執行。
五、總結
本篇主要是針對STM32的中斷系統,目前從基本原理,中斷管理機制,中斷處理流程這幾個方面對中斷的基本特性和概念進行了較為詳細的概述,目的是為了在以后STM32的中斷使用中對中斷的理解有較好的幫助,也可以看出NVIC在STM32中起到的作用。 在下一篇將繼續介紹中斷系統基礎知識之寄存器功能原理。
-
ARM
+關注
關注
134文章
9057瀏覽量
366882 -
cpu
+關注
關注
68文章
10829瀏覽量
211196 -
計算機
+關注
關注
19文章
7430瀏覽量
87734 -
STM32
+關注
關注
2266文章
10876瀏覽量
354932 -
中斷系統
+關注
關注
1文章
96瀏覽量
61008
發布評論請先 登錄
相關推薦
評論