91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

LPC800前生今世 第三章-嵌套式向量中斷控制器

恩智浦MCU加油站 ? 來(lái)源:未知 ? 2023-09-21 11:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌套式向量中斷控制器NVIC: Nested Vectored Interrupt Controller中斷是所有的MCU都必須具備的功能,由于非常重要的地位,ARM公司為所有的處理器核心,都提供了統(tǒng)一的中斷控制器——嵌套式向量中斷控制器(NVIC)。

在現(xiàn)實(shí)的操作中,經(jīng)常會(huì)遇到一個(gè)正常執(zhí)行的程序或任務(wù),需要被臨時(shí)打斷,騰出CPU的時(shí)間去執(zhí)行另外一段事先安排好的程序,處理一些發(fā)生時(shí)間不確定的事件。注意,需要處理的事件不是意外事件,是已經(jīng)預(yù)見(jiàn)到要發(fā)生的事件,而且也安排好了(事先安排好的程序)如何處理這樣的事件,只是不知道事件究竟會(huì)在什么時(shí)候發(fā)生;例如,你上網(wǎng)買了一樣?xùn)|西,你知道快遞會(huì)今天送上門,但不知道快遞員具體是幾點(diǎn)幾分送到。這樣的事件可以是外部通信接口接收到數(shù)據(jù),也可以是某個(gè)按鍵被按動(dòng),還可以是供電電源發(fā)生故障等。

中斷就是打斷CPU程序順序執(zhí)行,并轉(zhuǎn)去執(zhí)行另一段程序的一種機(jī)制。處理中斷事件的程序,叫做中斷處理程序。在正常運(yùn)行的程序被打斷,轉(zhuǎn)去執(zhí)行中斷處理程序之前,需要保存好程序運(yùn)行的現(xiàn)場(chǎng),在中斷處理程序結(jié)束后,還需要恢復(fù)被中斷的程序現(xiàn)場(chǎng),繼續(xù)原有的運(yùn)行進(jìn)程。

中斷事件一般都是比較緊急的事件,需要盡快處理。例如,若不及時(shí)接受并存儲(chǔ)外部通信接口到達(dá)的數(shù)據(jù),數(shù)據(jù)就有可能丟失;如果電話鈴響,你不盡快接起來(lái),對(duì)方就會(huì)掛掉。對(duì)于中斷事件的處理一般都是比較短暫的,不會(huì)占用太多的CPU時(shí)間。

對(duì)于中斷的處理,需要打斷正常程序的執(zhí)行,所以不能過(guò)多地占用CPU時(shí)間進(jìn)行處理;對(duì)于需要較長(zhǎng)處理時(shí)間的事件,通常都是把對(duì)應(yīng)的數(shù)據(jù)和狀態(tài)存儲(chǔ)下來(lái),隨后再擇機(jī)處理。當(dāng)然這個(gè)原則也有例外,例如一個(gè)電池供電的煙霧報(bào)警器,整個(gè)系統(tǒng)在正常情況下處于超低功耗的待機(jī)狀態(tài),當(dāng)監(jiān)測(cè)到異常時(shí),可以直接在中斷處理程序中進(jìn)行甄別,并在需要時(shí)報(bào)警,當(dāng)異常狀態(tài)解除或被排除時(shí),再返回待機(jī)狀態(tài)。

從事件的產(chǎn)生至中斷處理程序開(kāi)始執(zhí)行,這個(gè)時(shí)間間隔稱為中斷響應(yīng)時(shí)間,這是中斷機(jī)制的一個(gè)十分重要的參數(shù)指標(biāo),尤其是在實(shí)時(shí)處理的系統(tǒng)中,希望這個(gè)間隔是可預(yù)知的,有時(shí)需要它越短越好。設(shè)想一個(gè)電機(jī)控制系統(tǒng),當(dāng)發(fā)生系統(tǒng)過(guò)載時(shí),需要盡可能快地采取措施,讓電機(jī)停轉(zhuǎn)、斷電、剎車制動(dòng)等,否則輕則電機(jī)損壞,重則發(fā)生人身事故。

1.1 LPC800的NVIC中斷控制器特性

LPC800的核心是Cortex-M0+,她的NVIC中斷控制器是ARM隨核心提供的,與CPU核心一體設(shè)計(jì)的;這個(gè)中斷控制器與其它Cortex-M系列的NVIC控制器功能上基本一致,但性能上略有變化,有興趣的讀者可以自己比較一下。

LPC800中集成的NVIC中斷控制器,具有以下特點(diǎn):

緊密耦合的中斷控制器,提供低中斷延遲。

同時(shí)控制系統(tǒng)異常和外設(shè)的中斷。支持32個(gè)中斷向量。

支持4級(jí)中斷優(yōu)先級(jí)和中斷嵌套。

支持SVC(管理員調(diào)用) 指令和PendSV軟件中斷。

支持不可屏蔽中斷。

▲支持用戶指定中斷向量表的地址。

下面分別更詳細(xì)地看看這些特性:

1.1.1 低中斷延遲

中斷延遲是指從接收到中斷信號(hào)至開(kāi)始執(zhí)行中斷處理程序的第一條指令,在最好的情況下所需要的時(shí)間,通常用多少個(gè)CPU時(shí)鐘周期來(lái)衡量中斷延遲時(shí)間。

對(duì)于LPC800使用的Cortex-M0+核心來(lái)說(shuō),中斷延遲的最短時(shí)間是15個(gè)CPU時(shí)鐘周期;在30MHz的主頻下,這只相當(dāng)于0.5μs的時(shí)間。

對(duì)于MCU的應(yīng)用來(lái)說(shuō),往往是需要中斷的延遲越小越好;但如果具體到不同的應(yīng)用場(chǎng)景、不同的軟件架構(gòu),還要綜合考慮其它部件的性能和響應(yīng)速度。

下圖是一個(gè)典型的中斷請(qǐng)求、中斷響應(yīng)的示意圖。

ca2c838e-5831-11ee-939d-92fbcf53809c.png圖1.中斷請(qǐng)求和響應(yīng)示意圖

當(dāng)外部設(shè)備發(fā)出中斷請(qǐng)求,NVIC控制器檢測(cè)到這個(gè)請(qǐng)求后,經(jīng)過(guò)同步和仲裁開(kāi)始進(jìn)入中斷響應(yīng)??刂破魇紫仁怯捎布ㄟ^(guò)堆棧保護(hù)程序現(xiàn)場(chǎng)(圖中的PUSH),然后調(diào)用這個(gè)中斷對(duì)應(yīng)的中斷處理程序(ISR – Interrupt Service Routine)。ISR處理完該中斷請(qǐng)求后,執(zhí)行返回指令退出中斷處理,此時(shí)NVIC控制器再把堆棧中保存的程序現(xiàn)場(chǎng)恢復(fù)到CPU中,最后回到被中斷的程序繼續(xù)執(zhí)行。

1.1.2 系統(tǒng)異常和外設(shè)中斷

在早期8位MCU時(shí),基本只有外設(shè)中斷的概念,還沒(méi)有完整的系統(tǒng)異常的概念,隨著MCU越來(lái)越復(fù)雜,功能不斷地增強(qiáng),在32位MCU中出現(xiàn)了一系列的系統(tǒng)異常中斷源。

所謂系統(tǒng)異常,可以理解成一種特殊的中斷,它的中斷源來(lái)自CPU本身或系統(tǒng)設(shè)備,例如SysTick。

目前Cortex-M0+中定義了6個(gè)系統(tǒng)異常中斷。

▲系統(tǒng)復(fù)位:這是我們通常說(shuō)的Reset。除了上電復(fù)位外,還有很多條件可以產(chǎn)生復(fù)位,包括:復(fù)位引腳被拉低,看門狗計(jì)時(shí)器到時(shí),檢測(cè)到低電壓,和ARM核心提供的軟件復(fù)位請(qǐng)求等。

▲不可屏蔽中斷:對(duì)于一般的中斷請(qǐng)求,軟件可以根據(jù)具體情況確定是否需要響應(yīng)。對(duì)于不可屏蔽中斷,軟件沒(méi)有選擇的余地,必須設(shè)置相應(yīng)的處理程序,在發(fā)生對(duì)應(yīng)事件時(shí)進(jìn)行響應(yīng)。一般不可屏蔽中斷都是非常緊急的事件,如果被屏蔽而得不到響應(yīng),會(huì)產(chǎn)生嚴(yán)重后果。例如系統(tǒng)掉電,軟件必須盡快保存重要數(shù)據(jù);再例如系統(tǒng)檢測(cè)到失火,軟件必須啟動(dòng)滅火流程等。

▲硬件失效(Hard Fault):所有不能恢復(fù)的系統(tǒng)錯(cuò)誤,都會(huì)產(chǎn)生這個(gè)中斷。這是很多人經(jīng)常遇到的系統(tǒng)異常,導(dǎo)致硬件失效中斷的原因很多,最多的狀況是訪問(wèn)了沒(méi)有存儲(chǔ)器或外設(shè)寄存器的地址空間。其它的原因還包括,執(zhí)行了非法的指令碼(當(dāng)程序跑亂后就會(huì)經(jīng)常出現(xiàn)這種情況);當(dāng)訪問(wèn)未對(duì)齊的數(shù)據(jù)時(shí);還有就是系統(tǒng)受到嚴(yán)重干擾導(dǎo)致內(nèi)部信號(hào)紊亂時(shí),等等。

▲系統(tǒng)調(diào)用(Supervisor call- SVC):在Cortex-M的指令系統(tǒng)中有一條指令SVCall,執(zhí)行這條指令后會(huì)引起SVC異常中斷,同時(shí)CPU進(jìn)入Supervisor狀態(tài)。SVCall指令是用于在有操作系統(tǒng)并具有系統(tǒng)態(tài)和用戶態(tài)的劃分時(shí)使用,在這種環(huán)境下CPU會(huì)限制一般用戶程序的某些訪問(wèn)權(quán)限(例如不能訪問(wèn)有些地址等)。當(dāng)程序需要訪問(wèn)特權(quán)時(shí),執(zhí)行SVCall指令進(jìn)入系統(tǒng)態(tài)并獲得相應(yīng)的權(quán)限。在LPC800這樣的小系統(tǒng)中,不會(huì)用到這個(gè)異常中斷。

▲預(yù)約系統(tǒng)服務(wù)(PendSV):和上述SVCall一樣,PendSV同樣是需要得到系統(tǒng)服務(wù),但不同的是PendSV是通過(guò)設(shè)置一個(gè)系統(tǒng)狀態(tài)位,當(dāng)CPU處理完其它高優(yōu)先級(jí)的中斷,再來(lái)響應(yīng)PendSV的中斷請(qǐng)求。很多文檔直譯PendSV為“掛起異常”,但我覺(jué)得用“預(yù)約”更加貼切。在LPC800中,一般用戶也用不到這個(gè)中斷。

▲SystemTick:這是對(duì)應(yīng)CPU內(nèi)部的SystemTick定時(shí)器中斷。SystemTick是所有Cortex-M都擁有的一個(gè)基本定時(shí)器,它為整個(gè)系統(tǒng)尤其是操作系統(tǒng)提供一個(gè)時(shí)間基準(zhǔn)。本書將在第17章 詳細(xì)介紹SysTick的用法。

在上述系統(tǒng)異常之外,LPC800還支持另外32個(gè)外設(shè)中斷,下表列出了這些中斷來(lái)源。

ca35a3d8-5831-11ee-939d-92fbcf53809c.pngca4223e2-5831-11ee-939d-92fbcf53809c.png表1.外設(shè)中斷源列表

這些中斷向量只出現(xiàn)在LPC804中,LPC802沒(méi)有這些中斷向量。由于LPC84x的中斷源數(shù)量多于Cortex-M0+的NVIC所支持的外部中斷數(shù)目,有些中斷源共用了同一個(gè)中斷請(qǐng)求信號(hào),例如序號(hào)11、29、30和31的中斷都是復(fù)用的,軟件需要通過(guò)相應(yīng)的外設(shè)寄存器判斷真正的中斷源和原因。

1.1.3 中斷向量

“中斷是打斷CPU程序順序執(zhí)行,并轉(zhuǎn)去執(zhí)行另一段程序的一種機(jī)制”,當(dāng)中斷發(fā)生時(shí),CPU需要知道中斷處理程序的地址并轉(zhuǎn)去執(zhí)行相應(yīng)的處理。

在所有的CPU里面,都是為每一個(gè)中斷源安排了一個(gè)固定的地址,當(dāng)發(fā)生對(duì)應(yīng)的中斷時(shí),CPU通過(guò)這個(gè)固定地址進(jìn)入中斷處理程序,進(jìn)入的機(jī)制有兩種。一種機(jī)制是發(fā)生中斷時(shí),CPU直接從那個(gè)地址取出中斷處理程序的指令并從這個(gè)地址開(kāi)始順序執(zhí)行,8051就是采用的這種進(jìn)入機(jī)制。

另一種機(jī)制是,CPU從那個(gè)固定地址取出中斷處理程序的開(kāi)始地址,即所說(shuō)的“中斷向量”,然后從這個(gè)開(kāi)始地址順序取出指令并執(zhí)行,LPC800內(nèi)置的Cortex-M0+就是采用這種機(jī)制。所有中斷源的處理程序開(kāi)始地址,集中放在一個(gè)固定的區(qū)域,被稱為中斷向量表。

在8051里,設(shè)計(jì)者為每個(gè)中斷源預(yù)留了固定8個(gè)字節(jié)的地址空間。這樣設(shè)計(jì)的好處是,如果用戶的中斷處理程序很短,能夠安排在8個(gè)字節(jié)內(nèi)完成,則處理效率很高,中斷響應(yīng)的時(shí)間也非常短。

隨著CPU的功能越來(lái)越豐富,處理的內(nèi)容越來(lái)越多,幾乎不會(huì)再有那種超短的中斷處理程序,因此目前幾乎所有的CPU都只為每個(gè)中斷源預(yù)留一個(gè)中斷向量的地址空間,只存放中斷程序的入口地址。這樣做可以最大限度地減少CPU預(yù)留的地址空間長(zhǎng)度,同時(shí)還為重定位中斷向量表提供了方便。

在LPC800中,CPU預(yù)留了地址空間0x0000 0000 ~ 0x000000BF作為異常與中斷的向量表,下表是LPC82x的中斷向量表的內(nèi)容安排。

ca4fbeda-5831-11ee-939d-92fbcf53809c.pngca5e0f8a-5831-11ee-939d-92fbcf53809c.pngca889688-5831-11ee-939d-92fbcf53809c.png

表2.LPC82x中斷源向量表內(nèi)容分配一般的用戶基本不需要關(guān)心這個(gè)表的內(nèi)容,因?yàn)樵诮o出的啟動(dòng)文件中已經(jīng)幫你填好里面的內(nèi)容。

1.1.4 中斷優(yōu)先級(jí)和中斷嵌套

當(dāng)出現(xiàn)多個(gè)中斷事件時(shí),就需要有優(yōu)先級(jí)的概念,CPU依據(jù)優(yōu)先級(jí)確定如何響應(yīng)多個(gè)同時(shí)出現(xiàn)的中斷。

在LPC800中的中斷優(yōu)先級(jí)是指,一個(gè)高優(yōu)先級(jí)的中斷可以打斷CPU正在處理的一個(gè)低優(yōu)先級(jí)中斷。這就是中斷嵌套的概念,即一個(gè)高優(yōu)先級(jí)的中斷處理程序嵌在另一個(gè)低優(yōu)先級(jí)中斷處理程序中。

caacc896-5831-11ee-939d-92fbcf53809c.png

圖2.中斷嵌套示意圖

從上面示意圖可以看到,優(yōu)先級(jí)較低的IRQ2打斷了CPU當(dāng)前的處理,CPU進(jìn)入相應(yīng)的處理程序ISR2,在ISR2處理還沒(méi)有結(jié)束時(shí),又發(fā)生了較高優(yōu)先級(jí)的IRQ1中斷,此時(shí)CPU轉(zhuǎn)去執(zhí)行IRQ1的中斷處理程序ISR1,當(dāng)ISR1結(jié)束返回后,CPU繼續(xù)執(zhí)行ISR2并最終返回到被打斷的處理程序中(圖中藍(lán)色部分)。

對(duì)于多個(gè)相同優(yōu)先級(jí)的中斷事件,如果它們的出現(xiàn)有先后順序,則CPU按照先來(lái)先到的原則順序處理,不會(huì)發(fā)生嵌套。如果它們同時(shí)出現(xiàn),則CPU按照中斷編號(hào)的數(shù)值大小順序處理,編號(hào)小的中斷會(huì)先被處理,也不會(huì)發(fā)生嵌套,表3的第4列給出了每個(gè)中斷的編號(hào)。

表3的第5列給出每個(gè)中斷源或異常中斷源的優(yōu)先級(jí),除了少數(shù)異常中斷的優(yōu)先級(jí)是固定的以外,其它中斷源的優(yōu)先級(jí)都是軟件可配置的。

在LPC800中,可配置的優(yōu)先級(jí)有四級(jí),用0~3表示,0為最高優(yōu)先級(jí)。

在ARM CMSIS庫(kù)里,有兩個(gè)函數(shù)與中斷優(yōu)先級(jí)相關(guān),用戶可直接調(diào)用設(shè)置中斷優(yōu)先級(jí)或查詢某個(gè)中斷源的中斷優(yōu)先級(jí):

void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority);// 設(shè)置中斷優(yōu)先級(jí)
uint32_t NVIC_GetPriority(IRQn_Type IRQn);// 讀取中斷優(yōu)先級(jí)

使用表1的第4列“編號(hào)”作為NVIC_SetPriority和NVIC_GetPriority函數(shù)的第一個(gè)參數(shù),指定需要操作的中斷源;NVIC_GetPriority的第二個(gè)參數(shù)是需要設(shè)定的優(yōu)先級(jí),只能取數(shù)值0~3,任何大于3的數(shù)值都可能導(dǎo)致不可知的結(jié)果。

1.1.5 中斷優(yōu)先級(jí)和嵌套的演示例程

下面以一個(gè)例程演示中斷嵌套的現(xiàn)象和效果。

本節(jié)介紹的例程源代碼,位于附屬代碼目錄的Projects/Cookbook_NVIC_GPIO子目錄下。除特別說(shuō)明,所有的代碼段都出自源文件Cookbook_NVIC_GPIO.c。關(guān)于附屬代碼目錄的說(shuō)明,請(qǐng)參見(jiàn)第4章 :本書中的例程和項(xiàng)目文件。

在這個(gè)例程中,使用了板上的兩個(gè)按鍵S2、S4和兩個(gè)LED:D7、D8。下面是此例程所用的LPC824-Lite開(kāi)發(fā)板的部分線路圖:

caca8868-5831-11ee-939d-92fbcf53809c.png圖3.中斷嵌套例程部分線路圖

在程序中,S4標(biāo)示為KEY_USER,對(duì)應(yīng)引腳中斷0;S2標(biāo)示為KEY_ISP,對(duì)應(yīng)引腳中斷1。按鍵對(duì)應(yīng)的信號(hào)上升沿和下降沿都會(huì)產(chǎn)生中斷:

■當(dāng)進(jìn)入KEY_USER的引腳中斷0的處理程序時(shí),點(diǎn)亮LED0(P0_7),退出處理程序時(shí)熄滅LED0。

■當(dāng)進(jìn)入KEY_ISP的引腳中斷1的處理程序時(shí),點(diǎn)亮LED1(P0_13),退出處理程序時(shí)熄滅LED1。

在例程的中斷處理程序中特意設(shè)置了2秒的等待,這樣可以清楚地模擬中斷嵌套的過(guò)程。

代碼片段1. 引腳中斷0的中斷處理程序

cad9014a-5831-11ee-939d-92fbcf53809c.png

這段代碼非常簡(jiǎn)單,讀者可以自行完成引腳中斷1的中斷處理程序。

下面是主程序中的片斷,包含對(duì)GPIO和中斷的初始化部分。

代碼片段2. 主程序中初始化GPIO和中斷

caf2c7a6-5831-11ee-939d-92fbcf53809c.png

關(guān)于GPIO和引腳中斷的部分,將在后面章節(jié)介紹。

代碼片段2初始化好各個(gè)部分后,主程序即進(jìn)入一個(gè)死循環(huán),隨后每次按下按鍵將會(huì)進(jìn)入代碼片段1對(duì)應(yīng)的中斷處理程序。

按照下述步驟進(jìn)行操作,就可以體會(huì)到中斷優(yōu)先級(jí)的效用:

cb114f00-5831-11ee-939d-92fbcf53809c.pngcb2e7e5e-5831-11ee-939d-92fbcf53809c.png

下面這個(gè)圖更加直觀地展示了按鍵按下的順序和中斷處理的順序。

cb428480-5831-11ee-939d-92fbcf53809c.png圖4.中斷優(yōu)先級(jí)演示程序時(shí)序圖

1.2 NVIC的幾個(gè)基本概念解讀

在這一節(jié)介紹一些NVIC特有的概念和含義,對(duì)于不需要關(guān)心中斷響應(yīng)細(xì)節(jié)或沒(méi)有高實(shí)時(shí)性要求的讀者,可以略過(guò)此部分內(nèi)容。

1.2.1中斷的尾部鏈接(Tail-chaining)

該特性的一個(gè)形象的叫法是“咬尾中斷”。這不是一種新的中斷形式,所有中斷都有此特性。

我們知道CPU響應(yīng)中斷時(shí),在進(jìn)入中斷處理程序之前,需要保存當(dāng)前運(yùn)行任務(wù)的執(zhí)行現(xiàn)場(chǎng),即CPU的一些內(nèi)部寄存器。目前絕大多數(shù)CPU(也包括ARM的所有內(nèi)核)都是把執(zhí)行現(xiàn)場(chǎng)保存在堆棧中,進(jìn)入中斷處理程序之前執(zhí)行PUSH操作,然后在退出中斷處理程序的時(shí)候,執(zhí)行POP操作再返回被中斷的任務(wù)。

從上一節(jié)的圖14所展示的場(chǎng)景看,從步驟5.1進(jìn)入步驟5.2時(shí),即一個(gè)中斷處理程序的結(jié)束緊接著另一個(gè)中斷處理程序的開(kāi)始。CPU需要恢復(fù)進(jìn)入S4中斷處理前的現(xiàn)場(chǎng),然后緊接著再保存同一個(gè)現(xiàn)場(chǎng)并進(jìn)入S2 的處理程序,S2處理結(jié)束后再次恢復(fù)原有的現(xiàn)場(chǎng)。

很顯然,CPU在從S4處理程序進(jìn)入S2 處理程序之間的恢復(fù)現(xiàn)場(chǎng)+保存現(xiàn)場(chǎng)的動(dòng)作是多余的,這段時(shí)間被浪費(fèi)了。中斷的尾部鏈接是ARM的NVIC使用的技術(shù),可以有效地減少這種情況的操作時(shí)間。

由于沒(méi)有找到關(guān)于Cortex-M0+的時(shí)序圖,下面以ARM發(fā)布的Cortex-M3時(shí)序圖說(shuō)明尾部鏈接的實(shí)現(xiàn),除了顯示的時(shí)間周期上可能有所出入,但原理是一樣的。

cb5b5758-5831-11ee-939d-92fbcf53809c.png圖5.中斷的尾部鏈接示意圖

圖5上半部分展示了ARM7TDMI的傳統(tǒng)中斷處理方式,在ISR1結(jié)束后,進(jìn)入ISR2 之前,需要一組POP和另一組PUSH操作。圖的下半部分是Cortex-M中NVIC的處理方式,在兩個(gè)中斷處理程序之間,省卻了對(duì)CPU現(xiàn)場(chǎng)的處理。

途中標(biāo)明“尾部鏈接”的這段時(shí)間,CPU需要判斷是否有掛起未處理的中斷請(qǐng)求,并根據(jù)優(yōu)先級(jí)獲取需要處理的中斷的入口向量,再跳轉(zhuǎn)到新的處理程序中。因此,這個(gè)時(shí)間是省不掉的。

1.2.2 晚到的高優(yōu)先級(jí)中斷處理(Late arrival preemption)

前面已經(jīng)介紹了中斷優(yōu)先級(jí)的概念,即高優(yōu)先級(jí)的中斷處理程序會(huì)打斷低優(yōu)先級(jí)的中斷處理。

當(dāng)某個(gè)中斷事件A來(lái)臨時(shí),CPU會(huì)保存當(dāng)前執(zhí)行現(xiàn)場(chǎng)后進(jìn)入該事件的處理程序,如果在執(zhí)行保存現(xiàn)場(chǎng)的操作時(shí),還未進(jìn)入到中斷處理程序A前,恰好有另一個(gè)高優(yōu)先級(jí)的中斷事件B到達(dá),此時(shí)為了節(jié)省再次保存現(xiàn)場(chǎng)的操作時(shí)間,NVIC會(huì)直接跳轉(zhuǎn)到這個(gè)高優(yōu)先級(jí)的中斷處理程序B中,而暫時(shí)掛起早到的那個(gè)低優(yōu)先級(jí)的中斷A。

cb74b4b4-5831-11ee-939d-92fbcf53809c.png圖6.晚到的高優(yōu)先級(jí)中斷處理示意圖

如果中斷事件B到達(dá)時(shí),CPU已經(jīng)進(jìn)入了中斷處理程序A,則不適用于上述操作流程。

1.2.3 終止退棧 (Pop preemption)

當(dāng)CPU處理某個(gè)中斷事件結(jié)束時(shí),如果另一個(gè)中斷事件正在等待處理,則3.2.1介紹的尾部鏈接機(jī)制可以有效地加快進(jìn)入下一個(gè)中斷處理程序的進(jìn)程。

如果CPU結(jié)束處理某個(gè)中斷事件并已經(jīng)開(kāi)始執(zhí)行恢復(fù)現(xiàn)場(chǎng)的操作,此時(shí)另一個(gè)中斷事件剛好到達(dá),傳統(tǒng)的處理方式是,完成恢復(fù)現(xiàn)場(chǎng)的操作后馬上再執(zhí)行一次新的保存現(xiàn)場(chǎng)的操作?!敖K止退棧處理”的機(jī)制可以有效地減少該種情形的處理時(shí)間,避免多余的恢復(fù)現(xiàn)場(chǎng)再保存現(xiàn)場(chǎng)的壓棧和退棧操作,從而加快中斷處理的響應(yīng)速度。

cb8fb66a-5831-11ee-939d-92fbcf53809c.png圖7.終止退棧處理示意圖

上圖中可以清楚地看出傳統(tǒng)的處理方式,和Cortex-M改進(jìn)后的處理方式的區(qū)別,結(jié)合尾部鏈接的機(jī)制,實(shí)現(xiàn)了中斷的快速響應(yīng),增強(qiáng)了系統(tǒng)的實(shí)時(shí)性。

1.3.LPC800的NVIC使用

1.3.1 NVIC 控制寄存器

LPC800的NVIC(嵌套中斷控制器)支持32路中斷輸入源。NVIC共有5個(gè)寄存器(組),每個(gè)中斷輸入源對(duì)應(yīng)其中的一組寄存器位。

表2.NVIC控制寄存器列表

序號(hào)

寄存器

功能

說(shuō)明

1

ISER0

設(shè)置中斷使能

每個(gè)中斷輸入源對(duì)應(yīng)1位。讀出’1’表示中斷已經(jīng)使能。

寫入’1’ 使能中斷,寫入’0’無(wú)效果。

2

ICER0

清除中斷使能

每個(gè)中斷輸入源對(duì)應(yīng)1位。讀出’1’表示中斷已經(jīng)使能。

寫入’1’表示清除中斷使能,寫入’0’無(wú)效果。

3

ISPR0

設(shè)置中斷掛起

每個(gè)中斷輸入源對(duì)應(yīng)1位。讀出’1’表示中斷已經(jīng)掛起。

寫入’1’表示設(shè)置中斷的掛起狀態(tài),寫入’0’無(wú)效果。

4

ICPR0

清除中斷掛起

每個(gè)中斷輸入源對(duì)應(yīng)1位。讀出’1’表示中斷已經(jīng)掛起。

寫入’1’表示清除中斷的掛起狀態(tài),寫入’0’無(wú)效果。

5

IPR0~7

設(shè)置中斷優(yōu)先級(jí)

這里總共有8個(gè)32位的寄存器,每個(gè)中斷輸入源對(duì)應(yīng)其中的8位,但其中只有2位有效。

上表中前面4個(gè)寄存器都是32位寄存器,參照表2的序號(hào),序號(hào)0的SPI0_IRQ對(duì)應(yīng)這些寄存器的第0位,依次類推。

IPR0~7這8個(gè)寄存器,共有32個(gè)8位的字節(jié),地址最小的第0個(gè)字節(jié)對(duì)應(yīng)SPI0_IRQ,依次類推。

1.3.2 中斷的使能和掛起

使能某個(gè)中斷,是指允許某個(gè)中斷源所產(chǎn)生的中斷信號(hào)觸發(fā)中斷,并導(dǎo)致調(diào)用中斷處理程序。

在LPC800中配置中斷需要有至少兩個(gè)部分。首先是在能夠產(chǎn)生中斷的外設(shè)中,配置相應(yīng)寄存器,使其能在指定的條件下產(chǎn)生中斷信號(hào);例如如果希望在UART接收到數(shù)據(jù)時(shí)產(chǎn)生中斷,則必須配置UART模塊中相應(yīng)的寄存器。其次是在NVIC中斷控制器中打開(kāi)該中斷信號(hào)的傳輸通道,并最終觸發(fā)中斷,這就是常說(shuō)的使能中斷。

當(dāng)一個(gè)使能的中斷對(duì)應(yīng)的中斷源,產(chǎn)生了中斷信號(hào)(例如前述的UART接收到數(shù)據(jù)),則NVIC內(nèi)部的中斷掛起狀態(tài)位就會(huì)被置’1’,讀出ISPR0或ICPR0寄存器就可以看到這一位。當(dāng)CPU響應(yīng)該中斷請(qǐng)求進(jìn)入中斷處理程序后,NVIC會(huì)自動(dòng)地清除這個(gè)中斷掛起狀態(tài)位。

中斷掛起狀態(tài)位表示某個(gè)中斷請(qǐng)求是否已經(jīng)被響應(yīng),用戶程序可以利用這一位,在沒(méi)有進(jìn)入它的中斷處理程序之前查詢對(duì)應(yīng)的狀況。特殊情況下,也可以主動(dòng)地使用ICPR0寄存器清除這個(gè)掛起狀態(tài),這樣該中斷的處理程序?qū)⒉粫?huì)被調(diào)用;例如,在一個(gè)較高優(yōu)先級(jí)的中斷A處理程序中,主動(dòng)地判斷某個(gè)較低優(yōu)先級(jí)的中斷B,并直接處理這個(gè)請(qǐng)求,實(shí)現(xiàn)更快地處理那個(gè)低優(yōu)先級(jí)的中斷B事件,當(dāng)然處理完后要主動(dòng)地清除這個(gè)掛起狀態(tài),否則還會(huì)再進(jìn)入中斷B對(duì)應(yīng)的處理程序中。

1.3.3 操作NVIC 控制寄存器

用戶可以直接操作以上寄存器設(shè)置NVIC,ARM在CMSIS函數(shù)包里也提供了一些簡(jiǎn)單的函數(shù)。

cbb25f4e-5831-11ee-939d-92fbcf53809c.png

(1) NVIC_GetPendingIRQ和NVIC_GetPriority可以使用表3第4列“編號(hào)”中的負(fù)數(shù)作為輸入?yún)?shù),例如使用-1表示讀取SysTick的掛起狀態(tài)或中斷優(yōu)先級(jí)。

(2) NVIC_SetPriority可以使用表3第4列“編號(hào)”中對(duì)應(yīng)SVCall、PendSV和SysTick的負(fù)數(shù)作為輸入?yún)?shù)設(shè)置它們的中斷優(yōu)先級(jí)。

1.3.4 中斷向量表和中斷處理程序的入口

常用的IAR或Keil集成開(kāi)發(fā)環(huán)境中,都提供了一個(gè)啟動(dòng)文件,啟動(dòng)文件中給出了默認(rèn)的中斷向量表。

在IAR集成開(kāi)發(fā)環(huán)境中,啟動(dòng)文件的名字是:IAR_cstartup_M.s

在Keil集成開(kāi)發(fā)環(huán)境中,啟動(dòng)文件的名字是:Keil_startup_LPC8xx.s

在中斷向量表中,對(duì)應(yīng)每一個(gè)中斷或異常的位置都默認(rèn)設(shè)置了一個(gè)向量,它們都指向同一個(gè)位置,在這個(gè)位置上只有一條自我循環(huán)的指令,形成一個(gè)死循環(huán)。用戶如果使能了某個(gè)中斷或異常,要在發(fā)生中斷事件時(shí)跳到自己的中斷處理程序,則需要替換中斷向量表中向量指向自己的中斷處理程序,或者簡(jiǎn)單的做法是使用與默認(rèn)的向量相同的名字,編譯器會(huì)幫你替換向量。

下表列出了所有默認(rèn)的中斷向量的名稱,供讀者參考。

cbe0bf6a-5831-11ee-939d-92fbcf53809c.pngcbf32a4c-5831-11ee-939d-92fbcf53809c.pngcc0d188a-5831-11ee-939d-92fbcf53809c.png表4.LPC82x中斷源向量默認(rèn)名稱

當(dāng)出現(xiàn)了你期望的中斷,但沒(méi)有跳轉(zhuǎn)到你自己的中斷處理程序時(shí),除了檢查中斷源的配置以外,也需要檢查中斷處理程序的名稱是否拼寫對(duì)了,否則CPU會(huì)在發(fā)生中斷時(shí),跳到默認(rèn)的死循環(huán)中,造成死機(jī)的現(xiàn)象。

1.3.5 HardFault的處理

HardFault是大家經(jīng)常遇到的問(wèn)題,所有不能恢復(fù)的系統(tǒng)錯(cuò)誤,都會(huì)產(chǎn)生這個(gè)異常中斷。

建議用戶自己為HardFault寫一個(gè)簡(jiǎn)單的中斷處理程序,在其中通過(guò)輸出某種調(diào)試信息或點(diǎn)亮某個(gè)LED的方式,讓自己可以很清楚地知道出現(xiàn)了HardFault。這個(gè)處理程序結(jié)尾可以進(jìn)入死循環(huán)而不必返回。

當(dāng)出現(xiàn)Hard Fault異常中斷后,用戶可以在這個(gè)處理程序中設(shè)置一個(gè)斷點(diǎn),當(dāng)程序再次運(yùn)行停到這個(gè)斷點(diǎn)時(shí),即可通過(guò)集成開(kāi)發(fā)環(huán)境(IDE)的函數(shù)調(diào)用窗口,回溯到觸發(fā)這個(gè)異常中斷的指令語(yǔ)句,可以很輕松地發(fā)現(xiàn)錯(cuò)誤所在。

當(dāng)然,對(duì)于復(fù)雜的應(yīng)用,開(kāi)發(fā)人員也可以在Hard Fault中調(diào)出堆棧中的內(nèi)容,與一些重要的變量一起打包作為系統(tǒng)狀態(tài)以日志文件的形式保存下來(lái),供隨后分析故障時(shí)使用。在PC的很多應(yīng)用軟件中我們也看到過(guò)類似的機(jī)制,當(dāng)軟件由于某種原因崩潰時(shí),通常會(huì)彈出一個(gè)窗口詢問(wèn)是否需要給原廠發(fā)送診斷日志,以便日后提高軟件質(zhì)量。

END

更多恩智浦AI-IoT市場(chǎng)和產(chǎn)品信息,邀您同時(shí)關(guān)注“NXP客?!蔽⑿殴娞?hào)

cc23e664-5831-11ee-939d-92fbcf53809c.jpg ? ? ?

NXP客棧


恩智浦致力于打造安全的連接和基礎(chǔ)設(shè)施解決方案,為智慧生活保駕護(hù)航。

長(zhǎng)按二維碼,關(guān)注我們

恩智浦MCU加油站


這是由恩智浦官方運(yùn)營(yíng)的公眾號(hào),著重為您推薦恩智浦MCU的產(chǎn)品信息、開(kāi)發(fā)技巧、教程文檔、培訓(xùn)課程等內(nèi)容。

cc3b9c46-5831-11ee-939d-92fbcf53809c.jpg ?

長(zhǎng)按二維碼,關(guān)注我們


原文標(biāo)題:LPC800前生今世 第三章-嵌套式向量中斷控制器

文章出處:【微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18938

    瀏覽量

    398677
  • 恩智浦
    +關(guān)注

    關(guān)注

    14

    文章

    6099

    瀏覽量

    147866

原文標(biāo)題:LPC800前生今世 第三章-嵌套式向量中斷控制器

文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    CW32F030中斷解析

    中斷 1 概述 ARM? Cortex?-M0+ 內(nèi)核的嵌套向量中斷控制器 (NVIC),用于管理中斷和異常。NVIC 和處理
    發(fā)表于 01-12 08:41

    LPC800系列MCU:低功耗與高性能的完美結(jié)合

    LPC800系列MCU:低功耗與高性能的完美結(jié)合 在電子工程師的日常工作中,選擇合適的微控制器(MCU)對(duì)于項(xiàng)目的成功至關(guān)重要。今天,我們就來(lái)詳細(xì)探討一下NXP的LPC800系列MCU,看看它有
    的頭像 發(fā)表于 12-24 16:40 ?300次閱讀

    在使用CW32L083系列微控制器時(shí)如何配置中斷向量表?

    在使用CW32L083系列微控制器時(shí),如何配置中斷向量表?
    發(fā)表于 12-15 06:17

    RISC-V怎么實(shí)現(xiàn)核間中斷?核心本地中斷控制器(CLINT)深度解析

    全稱為Core Local Interruptor(核心本地中斷控制器),是 RISC-V 特權(quán)架構(gòu)規(guī)范(Privileged Architecture Specification)中明確定義的內(nèi)建
    的頭像 發(fā)表于 12-13 14:06 ?2444次閱讀
    RISC-V怎么實(shí)現(xiàn)核間<b class='flag-5'>中斷</b>?核心本地<b class='flag-5'>中斷控制器</b>(CLINT)深度解析

    易靈思Sapphire SoC中RISC-V平臺(tái)級(jí)中斷控制器深度解析

    隨著 RISC -V處理在 FPGA 領(lǐng)域的廣泛應(yīng)用,易靈思 FPGA 的 Sapphire RISC-V 內(nèi)核憑借軟硬核的靈活支持,為開(kāi)發(fā)者提供多樣選擇。本文深入探討 Sapphire SoC 中 RISC - V 平臺(tái)級(jí)中斷控制器(PLIC),解析其架構(gòu)與操作機(jī)制
    的頭像 發(fā)表于 11-08 09:35 ?7841次閱讀
    易靈思Sapphire SoC中RISC-V平臺(tái)級(jí)<b class='flag-5'>中斷控制器</b>深度解析

    關(guān)于蜂鳥(niǎo)E203內(nèi)核中斷硬件實(shí)現(xiàn)中斷嵌套的設(shè)計(jì)

    嵌套,都不應(yīng)該響應(yīng)這個(gè)新的中斷請(qǐng)求 要實(shí)現(xiàn)中斷嵌套,需要在中斷控制器中增加一個(gè)新的模塊,用于存儲(chǔ)當(dāng)前被占用的IRQ編號(hào),同時(shí)需要在處理每個(gè)
    發(fā)表于 10-23 07:07

    瑞薩RA系列MCU的中斷過(guò)程介紹

    當(dāng)中斷來(lái)臨的時(shí)候會(huì)最先經(jīng)過(guò)IRQ寄存,IRQ寄存檢測(cè)到中斷的時(shí)候,會(huì)向中央處理嵌套向量
    的頭像 發(fā)表于 09-23 09:45 ?1294次閱讀
    瑞薩RA系列MCU的<b class='flag-5'>中斷</b>過(guò)程介紹

    【「DeepSeek 核心技術(shù)揭秘」閱讀體驗(yàn)】第三章:探索 DeepSeek - V3 技術(shù)架構(gòu)的奧秘

    一、模型架構(gòu) 在閱讀第三章關(guān)于 DeepSeek 的模型架構(gòu)部分時(shí),我仿佛打開(kāi)了一扇通往人工智能核心構(gòu)造的大門。從架構(gòu)圖中,能清晰看到 Transformer 塊、前饋神經(jīng)網(wǎng)絡(luò)、注意力機(jī)制等模塊
    發(fā)表于 07-20 15:07

    求助,關(guān)于CYW920829M2EVK-02使用AIROC藍(lán)牙測(cè)試和調(diào)試工具 1.3 測(cè)試 HCI 指令的問(wèn)題求解

    第三章第五步,執(zhí)行double-在設(shè)備管理中查看檢測(cè)到的端口名稱為\'HCI UART\'而不是文檔 描述 的\'Kitprog3 USB-UART\'、是驅(qū)動(dòng)問(wèn)題導(dǎo)致的 hci通訊異常么?
    發(fā)表于 07-02 06:24

    初級(jí)工程師PCB設(shè)計(jì)技巧(PPT版)

    目錄第一:PCB 概述第二:PCB 設(shè)計(jì)流程及PCB Layout 設(shè)計(jì)第三章: PROTEL 常用操作第四: PCB Layout 技巧 獲取完整文檔資料可下載附件哦?。。?!
    發(fā)表于 06-26 15:50

    第六 外部中斷

    本章介紹W55MH32的IO口作為外部中斷輸入的使用。先闡述了NVIC(嵌套向量中斷控制器) 的結(jié)構(gòu)、寄存、優(yōu)先級(jí)及相關(guān)函數(shù),再說(shuō)明EX
    的頭像 發(fā)表于 05-26 16:27 ?1502次閱讀
    第六<b class='flag-5'>章</b> 外部<b class='flag-5'>中斷</b>

    第三章 開(kāi)發(fā)環(huán)境搭建

    本章介紹了W55MH32開(kāi)發(fā)環(huán)境搭建。常用工具 KEIL MDK功能強(qiáng)大,安裝需注意路徑等要點(diǎn)并安裝芯片包。還講解MDK5使用技巧,如文本美化、語(yǔ)法檢測(cè)、代碼編輯等實(shí)用功能。
    的頭像 發(fā)表于 05-26 09:40 ?1136次閱讀
    <b class='flag-5'>第三章</b> 開(kāi)發(fā)環(huán)境搭建

    第三章 仿真介紹

    本篇文章我們介紹了W55MH32板載的WIZ-Link仿真的使用方法,讓我們一起插上USB線開(kāi)始下載、調(diào)試程序吧!
    的頭像 發(fā)表于 05-21 11:54 ?931次閱讀
    <b class='flag-5'>第三章</b> 仿真<b class='flag-5'>器</b>介紹

    一天一個(gè)嵌入面試知識(shí)(1:中斷處理機(jī)制詳解)

    事件(如定時(shí)溢出)發(fā)送中斷請(qǐng)求(IRQ)。 中斷使能:在NVIC(嵌套向量中斷控制器)中開(kāi)啟對(duì)
    發(fā)表于 03-21 10:18

    第三章 警報(bào)聯(lián)動(dòng)】手把手教你玩轉(zhuǎn)新版正點(diǎn)原子云

    本帖最后由 jf_85110202 于 2025-3-13 14:43 編輯 【第三章 警報(bào)聯(lián)動(dòng)】手把手教你玩轉(zhuǎn)新版正點(diǎn)原子云 新版原子云網(wǎng)址:原子云(點(diǎn)擊登錄原子云) 原子云特色功能:設(shè)置
    發(fā)表于 03-12 16:05