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