微機(jī)原理與嵌入式接口技術(shù)課件:中斷技術(shù)_第1頁(yè)
微機(jī)原理與嵌入式接口技術(shù)課件:中斷技術(shù)_第2頁(yè)
微機(jī)原理與嵌入式接口技術(shù)課件:中斷技術(shù)_第3頁(yè)
微機(jī)原理與嵌入式接口技術(shù)課件:中斷技術(shù)_第4頁(yè)
微機(jī)原理與嵌入式接口技術(shù)課件:中斷技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩88頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

中斷技術(shù)5.1中斷系統(tǒng)概述5.2中斷源及其管理5.3中斷優(yōu)先級(jí)5.4中斷服務(wù)程序與中斷向量表5.5中斷的處理過(guò)程5.6中斷延遲及其改善5.7STM32中斷應(yīng)用組習(xí)題5

本章要點(diǎn)

☆中斷的基本概念

☆中斷的處理過(guò)程

☆嵌套向量中斷控制器(NVIC)的功能

☆中斷嵌套、咬尾中斷、晚到異常

5.1中斷系統(tǒng)概述

1.中斷的請(qǐng)求—響應(yīng)工作機(jī)制為保證快速響應(yīng)各種隨機(jī)事件,CUP通常在每條指令執(zhí)行結(jié)束時(shí),都會(huì)查詢(xún)是否有中斷請(qǐng)求,并根據(jù)相應(yīng)的中斷請(qǐng)求編號(hào)調(diào)用預(yù)先編寫(xiě)好的中斷服務(wù)子程序。由于計(jì)算機(jī)運(yùn)行速度非??欤诤暧^上形成了“請(qǐng)求—響應(yīng)”的中斷工作機(jī)制,如圖5.1所示。圖5.1中斷系統(tǒng)功能結(jié)構(gòu)示意圖

2.中斷的管理

在“請(qǐng)求—響應(yīng)”機(jī)制下,必須對(duì)眾多的中斷來(lái)源實(shí)施管理,決定中斷源是否有權(quán)請(qǐng)求以及有效的請(qǐng)求方式。還要考慮到中斷是用來(lái)處理各種隨機(jī)事件,那么這些事件可能先后產(chǎn)生,也可能同時(shí)產(chǎn)生,另外事件的輕重緩急不同,而CUP在同一時(shí)間只能響應(yīng)其中一個(gè)請(qǐng)求,各中斷來(lái)源之間必然存在競(jìng)爭(zhēng)關(guān)系,要依靠?jī)?yōu)先級(jí)管理來(lái)協(xié)調(diào)好這種競(jìng)爭(zhēng)關(guān)系,這是中斷系統(tǒng)需要解決的核心問(wèn)題之一。最后,必須為“請(qǐng)求”尋找到正確的服務(wù)程序地址,使其能得到正確的“響應(yīng)”。

STM32的中斷功能主要由NVIC完成,圖5.2是STM32的EXTI(外部中斷/事件)控制器框圖,在后續(xù)內(nèi)容中將對(duì)STM32外部中斷/事件控制器進(jìn)行詳細(xì)講解。圖5.2外部中斷/事件控制器框圖

5.2中斷源及其管理

5.2.1中斷源的分類(lèi)最初的中斷技術(shù)是作為處理器與外設(shè)交換信息的一種控制方式而提出的,中斷全部來(lái)自外設(shè),稱(chēng)為外部中斷或硬件中斷。

1.硬中斷

硬中斷(外中斷)是由外部電路在CUP引腳上產(chǎn)生的中斷請(qǐng)求。根據(jù)CUP的不同,這樣的請(qǐng)求信號(hào)可以是電平信號(hào),也可以是脈沖信號(hào)。CUP收到這樣的信號(hào),就知道有外部的中斷請(qǐng)求到來(lái),準(zhǔn)備開(kāi)始一個(gè)新的中斷過(guò)程。連接到CUP的硬中斷源可以不止一個(gè),這取決于CUP有多少個(gè)可以接受硬中斷請(qǐng)求的引腳。

作為一款應(yīng)用于高實(shí)時(shí)場(chǎng)合的MCU,STM32的外部中斷(EXTI)資源是十分豐富的,它的每一個(gè)GPIO引腳都可以設(shè)置成一個(gè)中斷源,這也是STM32的強(qiáng)大之處。不過(guò)80個(gè)外部中斷源似乎又太多了,為此STM32引入了中斷線(中斷通道)的概念。如圖5.3所示,STM32的80個(gè)通用I/O端口中斷源連接到CM3內(nèi)核16個(gè)中斷通道上。圖5.3STM32外部中斷通用I/O映像

在STM32中,中斷服務(wù)程序和中斷通道相對(duì)應(yīng),這樣連在同一個(gè)通道上的不同中斷源都會(huì)調(diào)用相同的中斷服務(wù)程序,必須在中斷服務(wù)程序中查詢(xún)中斷源的狀態(tài),明確具體的中斷來(lái)源,以執(zhí)行與該中斷源對(duì)應(yīng)的程序代碼,確保服務(wù)與中斷源的一一對(duì)應(yīng)關(guān)系。

2.軟中斷

軟中斷不是由外部電路產(chǎn)生的,是在CUP執(zhí)行程序過(guò)程中產(chǎn)生的中斷請(qǐng)求。軟中斷可以由一條軟中斷指令產(chǎn)生,也可以是程序運(yùn)行出現(xiàn)某種問(wèn)題而導(dǎo)致的,由于來(lái)自CUP內(nèi)部,也稱(chēng)為內(nèi)部中斷或內(nèi)部異常。

外部中斷和內(nèi)部中斷的區(qū)別在于,外部中斷請(qǐng)求信號(hào)來(lái)自CM3內(nèi)核的外面,來(lái)自各種片上外設(shè)和外擴(kuò)的外設(shè),產(chǎn)生時(shí)刻與CM3的工作時(shí)鐘是異步的,在CM3中它們被稱(chēng)為“中斷”;而內(nèi)部中斷則是因CM3內(nèi)核的活動(dòng)產(chǎn)生的,即在執(zhí)行指令或訪問(wèn)存儲(chǔ)器時(shí)產(chǎn)生的,因此對(duì)CM3來(lái)說(shuō)是同步的,在CM3中它們被稱(chēng)為“異常”。在STM32中,把所有能打斷正常執(zhí)行流的事件都稱(chēng)為異常,不細(xì)致地區(qū)別到底是外部中斷還是內(nèi)部異常。如不加說(shuō)明,則強(qiáng)調(diào)的都是它們對(duì)主程序所體現(xiàn)出來(lái)的中斷性質(zhì)。

5.2.2STM32的中斷源

CM3內(nèi)核共支持256個(gè)中斷/異常源,其中外部中斷最多240個(gè)。系統(tǒng)異常是CM3內(nèi)核支持的基本異常,與具體的芯片無(wú)關(guān),而外部中斷則是與芯片相關(guān)的。芯片廠商會(huì)根據(jù)需要和用途設(shè)計(jì)中斷源數(shù)目(1~240),STM32目前支持的中斷共84個(gè)(16個(gè)內(nèi)部+68個(gè)外部),而同樣內(nèi)核的NXP公司的lPC1700系列支持35個(gè)外部中斷。表5.1列出了STM32的中斷源,表格最后有陰影的部分表示的是外部中斷。

5.2.3STM32中斷源的輸入管理

1.外部中斷的請(qǐng)求與掛起

外部設(shè)備可以電平或脈沖方式發(fā)出中斷請(qǐng)求。電平觸發(fā)的中斷在得到響應(yīng)后,還需要撤銷(xiāo)外部設(shè)備請(qǐng)求電平,這種方式下外部中斷源的電路較復(fù)雜。因而STM32不接收電平觸發(fā)信號(hào)。

對(duì)于STM32的外部中斷來(lái)說(shuō),當(dāng)發(fā)生了選擇的觸發(fā)請(qǐng)求時(shí),圖5.2中的請(qǐng)求掛起寄存器(EXTI_PR)對(duì)應(yīng)位會(huì)置1,完成對(duì)外部中斷掛起功能。還可以對(duì)軟件中斷事件寄存器(EXTI_SWIER)寫(xiě)1,設(shè)置EXTI_PR中相應(yīng)的掛起位,產(chǎn)生一個(gè)軟的外部中斷。在中斷服務(wù)程序中,應(yīng)該通過(guò)對(duì)EXTI_PR的對(duì)應(yīng)位寫(xiě)1,清除中斷源觸發(fā)產(chǎn)生的中斷掛起位,避免CUP重復(fù)響應(yīng)同一個(gè)中斷請(qǐng)求。

2.外部中斷源的屏蔽

中斷系統(tǒng)通過(guò)中斷允許/屏蔽功能決定響應(yīng)哪些中斷請(qǐng)求,或不響應(yīng)哪些請(qǐng)求。一般來(lái)說(shuō),中斷允許/屏蔽功能分多級(jí)實(shí)現(xiàn)。如圖5.2所示,EXTI的中斷屏蔽寄存器(EXTI_IMR)在每個(gè)EXTI的輸入線上,通過(guò)一個(gè)與門(mén)來(lái)控制是否屏蔽某個(gè)具體的外部中斷,決定某個(gè)外部中斷是否能通過(guò)EXTI向CM3內(nèi)核的NVIC發(fā)出中斷請(qǐng)求。

3.NVIC的中斷允許

在圖5.2中,外部中斷信號(hào)經(jīng)過(guò)屏蔽寄存器控制后送到CM3的NVIC。NVIC支持的240個(gè)中斷通道的使能與禁止分別由各自寄存器控制,每個(gè)中斷通道擁有一對(duì)使能/禁止位(2位),這240對(duì)(2位)分布在8對(duì)32位寄存器中,分別是SETENA0~SETENA7和CLRE?NA0~CLRENA7。

4.NVIC的中斷總開(kāi)關(guān)

位于CUP內(nèi)核的允許/屏蔽功能決定是否響應(yīng)所有的外部中斷,如果CUP處于不響應(yīng)外部中斷請(qǐng)求的狀態(tài),就稱(chēng)為關(guān)中斷;如果CUP處于響應(yīng)硬中斷請(qǐng)求的狀態(tài),就稱(chēng)為開(kāi)中斷,相當(dāng)于中斷總開(kāi)關(guān)。與前面直接通過(guò)寄存器的位進(jìn)行中斷屏蔽/允許控制不同,STM32的中斷總開(kāi)關(guān)是通過(guò)設(shè)置PRIMASK、FAULTMASK和BASEPRI寄存器中的當(dāng)前中斷優(yōu)先級(jí)實(shí)現(xiàn)的,當(dāng)前中斷優(yōu)先級(jí)相當(dāng)于是一個(gè)閾值,NVIC將不響應(yīng)這個(gè)閾值以上的中斷。

5.事件與中斷

圖5.2的兩個(gè)虛線箭頭把一個(gè)相同的外部激勵(lì)信號(hào)分為兩路,上面一路信號(hào)向CUP產(chǎn)生中斷請(qǐng)求,而下面一路信號(hào)經(jīng)過(guò)事件屏蔽寄存器后被脈沖發(fā)生器轉(zhuǎn)換成了一個(gè)單脈沖,作為“事件”輸出到芯片中的其他功能模塊。上面的中斷需要CUP參與,需要執(zhí)行軟件中斷服務(wù)程序才能得到預(yù)期的中斷結(jié)果。

外部I/O觸發(fā)A/D轉(zhuǎn)換測(cè)量物品重量為例講述二者區(qū)別。如果使用傳統(tǒng)的中斷通道,需要I/O觸發(fā)產(chǎn)生外部中斷,外部中斷服務(wù)程序啟動(dòng)A/D轉(zhuǎn)換,A/D轉(zhuǎn)換中斷服務(wù)程序提交最后結(jié)果;如果使用事件通道,I/O觸發(fā)產(chǎn)生事件,然后聯(lián)動(dòng)觸發(fā)A/D轉(zhuǎn)換,A/D轉(zhuǎn)換中斷服務(wù)程序提交最后結(jié)果。相比之下,后者不需要軟件參與A/D轉(zhuǎn)換觸發(fā),并且響應(yīng)速度也更快,如用事件觸發(fā)DMA,就可以完全不用軟件參與。

5.3中斷優(yōu)先級(jí)

在實(shí)際系統(tǒng)中,常常遇到多個(gè)中斷源同時(shí)請(qǐng)求中斷的情況,這時(shí)CUP必須確定首先為哪一個(gè)中斷源服務(wù),以及服務(wù)的次序。解決的方法是中斷優(yōu)先排隊(duì),即根據(jù)中斷源請(qǐng)求的輕重緩急,排好中斷處理的優(yōu)先次序即優(yōu)先級(jí),又稱(chēng)優(yōu)先權(quán),先響應(yīng)優(yōu)先級(jí)最高的中斷請(qǐng)求。另外,當(dāng)CUP正在處理某一中斷時(shí),要能響應(yīng)另一個(gè)優(yōu)先級(jí)更高的中斷請(qǐng)求,而屏蔽掉同級(jí)或較低級(jí)的中斷請(qǐng)求,形成中斷嵌套,如圖5.4所示。圖5.4中斷嵌套示意圖

5.3.1中斷優(yōu)先級(jí)的排隊(duì)方法

1.用軟件查詢(xún)方法確定中斷優(yōu)先級(jí)

如圖5.5和圖5.6所示,優(yōu)先級(jí)由查詢(xún)順序決定,先查詢(xún)的中斷源具有最高的優(yōu)先級(jí)。圖5.5軟件查詢(xún)接口電路圖5.6軟件查詢(xún)程序流程

2.硬件優(yōu)先級(jí)排隊(duì)電路

菊花鏈優(yōu)先級(jí)排隊(duì)電路如圖5.7所示。它是利用外設(shè)連接在排隊(duì)電路的物理位置來(lái)決定其中斷優(yōu)先權(quán)的,排在最前面的優(yōu)先級(jí)最高,排在最后面的優(yōu)先級(jí)最低。圖5.8采用比較器實(shí)現(xiàn)的優(yōu)先級(jí)排隊(duì)電路的靈活性更好一些。圖5.7菊花鏈優(yōu)先級(jí)排隊(duì)電路圖5.8比較器優(yōu)先級(jí)排隊(duì)電路

3.專(zhuān)用中斷控制器的優(yōu)先級(jí)排隊(duì)

通用微型計(jì)算機(jī)本身的中斷管理功能較弱,一般采用可編程中斷控制器解決中斷優(yōu)先權(quán)的管理問(wèn)題。如8259A就是一個(gè)專(zhuān)用的可編程的8輸入中斷控制器,在有多個(gè)中斷源的系統(tǒng)中,它協(xié)助CUP實(shí)現(xiàn)對(duì)外部中斷請(qǐng)求的優(yōu)先級(jí)管理。其功能強(qiáng),也很靈活,但使用比較復(fù)雜。

5.3.2CM3中斷源的優(yōu)先級(jí)劃分

中斷優(yōu)先級(jí)的數(shù)值越小,則級(jí)別越高。

CM3中的3種系統(tǒng)異常(復(fù)位、NMI和硬fault)擁有固定為負(fù)數(shù)的優(yōu)先級(jí),因而它們的優(yōu)先級(jí)高于其他所有異常。除此之外,其他異常的優(yōu)先級(jí)都是可編程的,但不可編程為負(fù)數(shù)。

理論上,CM3支持3個(gè)固定的高優(yōu)先級(jí)和多達(dá)256級(jí)的可編程優(yōu)先級(jí),并且支持128級(jí)搶占。但絕大多數(shù)CM3芯片會(huì)精簡(jiǎn)設(shè)計(jì),實(shí)際上支持的優(yōu)先級(jí)數(shù)會(huì)相對(duì)少一些,如8級(jí)、16級(jí)或32級(jí)等。在這種情況下,芯片設(shè)計(jì)者會(huì)裁剪掉優(yōu)先級(jí)寄存器的部分低端有效位,以減少優(yōu)先級(jí)數(shù)。以3位表達(dá)優(yōu)先級(jí)的芯片為例,這也是CM3允許使用的最少優(yōu)先級(jí)位數(shù),其配置寄存器的結(jié)構(gòu)如表5.2所示。

在CM3中,優(yōu)先級(jí)以MSB對(duì)齊,這樣可以簡(jiǎn)化不同器件間的程序移植。例如,運(yùn)行在4位優(yōu)先級(jí)器件上的程序,移植到只支持3位優(yōu)先級(jí)的器件上后,其功能不受影響。但若以LSB對(duì)齊,則會(huì)將MSB丟失,導(dǎo)致優(yōu)先級(jí)翻轉(zhuǎn)。綜上所述,以3位、5位和8位表達(dá)優(yōu)先級(jí),優(yōu)先級(jí)劃分情況如表5.3所示。

5.3.3優(yōu)先級(jí)分組

除支持優(yōu)先級(jí)可編程外,為處理多個(gè)中斷源競(jìng)爭(zhēng)CUP響應(yīng)的問(wèn)題,CM3引入了優(yōu)先級(jí)分組機(jī)制,NVIC的應(yīng)用程序中斷及復(fù)位控制寄存器AIRCR>PRIGROUP[10:8]將IPR按位分成高低兩段,分別是MSB搶占優(yōu)先級(jí)位段和LSB子優(yōu)先級(jí)位段,如表5.4所示。

需要注意,復(fù)位、NMI和硬fault

這三種具有固定優(yōu)先級(jí)的異常,它們無(wú)論何時(shí)發(fā)生,都將立即無(wú)條件搶占任何優(yōu)先級(jí)可編程的普通異常。

以3位[7:5]表達(dá)優(yōu)先級(jí)為例,若將優(yōu)先級(jí)分組寄存器設(shè)置為5,則搶占優(yōu)先級(jí)與子優(yōu)先級(jí)劃分如表5.5所示。

可以得到4級(jí)搶占優(yōu)先級(jí),每個(gè)搶占優(yōu)先級(jí)有2個(gè)子優(yōu)先級(jí)。搶占關(guān)系如圖5.9所示。圖5.9分組后優(yōu)先級(jí)搶占

可以通過(guò)調(diào)用STM32的固件庫(kù)函數(shù)方式設(shè)置前面所提到的NVIC寄存器,完成STM32中斷優(yōu)先級(jí)的設(shè)置。選擇使用哪種優(yōu)先級(jí)分組方式,該函數(shù)的參數(shù)有下列5種:

5.3.4PRIMASK、FAULTMASK和BASEPRI寄存器

在CM3內(nèi)核中,有一個(gè)中斷屏蔽寄存器組,共包括三個(gè)寄存器:PRIMASK、FAULT?MASK

和BASEPRI,它們通過(guò)中斷優(yōu)先級(jí)控制異常的使能和禁止,常被用作中斷系統(tǒng)的總開(kāi)關(guān)。

中斷屏蔽寄存器PRIMASK相當(dāng)于中斷總開(kāi)關(guān),最低位有效。在一些特殊應(yīng)用中,把該位置1,相當(dāng)于把當(dāng)前有效優(yōu)先級(jí)改為0(可編程優(yōu)先級(jí)中的最高優(yōu)先級(jí)),即關(guān)閉所有可屏蔽中斷,只有NMI和硬件fault可以響應(yīng)。在絕大多數(shù)應(yīng)用中,應(yīng)該保持其為0的缺省值,不關(guān)閉中斷??梢酝ㄟ^(guò)_enable_irq

和_disable_irq

實(shí)現(xiàn)總中斷的開(kāi)放和關(guān)閉。

硬fault屏蔽寄存器FAULTMASK

只有最低位有效,當(dāng)其置1時(shí),把當(dāng)前有效優(yōu)先級(jí)改為-1,這樣連硬fault都被屏蔽了,只有NMI才能響應(yīng)。它的缺省值是0,表示沒(méi)有關(guān)異常。FAULTMASK

寄存器在異常退出時(shí)自動(dòng)清0。

在更精巧的設(shè)計(jì)中,可以利用優(yōu)先級(jí)屏蔽寄存器BASEPRI對(duì)中斷屏蔽進(jìn)行更細(xì)膩的控制,只屏蔽優(yōu)先級(jí)低于某一閾值的中斷。BASEPRI最多有9位(由表達(dá)優(yōu)先級(jí)的位數(shù)決定),它定義了被屏蔽優(yōu)先級(jí)的閾值。當(dāng)BASEPRI設(shè)定某個(gè)值后,所有優(yōu)先級(jí)號(hào)大于等于此值的中斷都被關(guān)閉(優(yōu)先級(jí)號(hào)越大,優(yōu)先級(jí)越低)。不過(guò)若BASEPRI被設(shè)為0,則停止屏蔽任何中斷,0是缺省值。

5.4中斷服務(wù)程序與中斷向量表

5.4.1中斷服務(wù)程序中斷服務(wù)程序(ISR)是具體完成中斷請(qǐng)求任務(wù)的軟件實(shí)體,它由用戶(hù)編程完成。一個(gè)中斷源(中斷通道)一定有一個(gè)與之對(duì)應(yīng)的中斷服務(wù)程序。每響應(yīng)一次中斷請(qǐng)求,中斷系統(tǒng)就會(huì)調(diào)用一次中斷服務(wù)程序,以完成該次中斷要求的服務(wù)。

從形式上來(lái)看,例5.1與普通的子程序非常相似,但實(shí)質(zhì)上中斷服務(wù)程序與普通子程序存在很大的差別,主要體現(xiàn)在以下幾個(gè)方面。

(1)服務(wù)的主體不同。

(2)調(diào)用的時(shí)機(jī)不同。

(3)調(diào)用的方式不同。

(4)中斷服務(wù)程序一般沒(méi)有參數(shù)和函數(shù)返回值。

5.4.2中斷向量

當(dāng)中斷發(fā)生時(shí),一些功能簡(jiǎn)單的CUP采用非向量中斷的方式調(diào)用中斷服務(wù)程序。此時(shí),所有中斷都會(huì)使CUP進(jìn)入到同一個(gè)內(nèi)存地址,調(diào)用同一個(gè)服務(wù)程序。用戶(hù)需要在服務(wù)程序中查詢(xún)不同的中斷標(biāo)志,以跳轉(zhuǎn)到不同的程序段來(lái)執(zhí)行不同的中斷服務(wù)。具體過(guò)程如圖5.6所示。

指令型中斷向量表一般位于系統(tǒng)的ROM區(qū)域,其中存放的是轉(zhuǎn)移指令,51單片機(jī)采用的就是這種方式:用指令跳轉(zhuǎn)到對(duì)應(yīng)中斷服務(wù)程序的入口,如圖5.10(a)所示。

入口地址型中斷向量表則是在內(nèi)存中直接存放中斷服務(wù)程序的入口地址,ARM處理器采用的就是這種方式:具體的入口地址可以由用戶(hù)寫(xiě)入,這樣的中斷向量表一般位于ARM區(qū),如圖5.10(b)所示。圖5.10兩種類(lèi)型的中斷向量表

表5.6是STM32F10xxx產(chǎn)品(小容量、中容量和大容量)的向量表。從該表可以看出,當(dāng)發(fā)生外部中斷時(shí),將使用公式(位置+16)×4計(jì)算出中斷向量表的偏移量,從中取出中斷向量送往CUP的程序計(jì)數(shù)器,實(shí)現(xiàn)對(duì)中斷服務(wù)程序的調(diào)用。

在啟動(dòng)代碼中,還定義了默認(rèn)的服務(wù)程序主體,這些都是基于固件庫(kù)和CMSIS的。只要是基于固件庫(kù)的中斷程序設(shè)計(jì),就可以直接調(diào)用。但由于啟動(dòng)代碼中的服務(wù)程序是用匯編語(yǔ)言編寫(xiě)的,所以用戶(hù)自己編寫(xiě)的中斷服務(wù)程序一般不放在啟動(dòng)代碼中,而是放在STM32F10x_it.c中,該文件是固件庫(kù)的模板文件。

在固件庫(kù)和CMSIS支持下,用戶(hù)不必自己建立中斷向量表,只需要配置好相關(guān)的外設(shè)和NVIC的寄存器,在STM32F10x_it.c

中找到對(duì)應(yīng)的異常處理函數(shù)名稱(chēng)后,編寫(xiě)自己的中斷服務(wù)程序。程序運(yùn)行后,當(dāng)該異常發(fā)生時(shí),用戶(hù)編寫(xiě)的程序就會(huì)被CM3的中斷系統(tǒng)自動(dòng)調(diào)用。

5.5中斷的處理過(guò)程

1.中斷請(qǐng)求當(dāng)出現(xiàn)中斷觸發(fā)事件時(shí),中斷源發(fā)出中斷請(qǐng)求,請(qǐng)求CUP對(duì)事件進(jìn)行處理,有些中斷源可能還在中斷接口的相應(yīng)的寄存器中設(shè)有標(biāo)志位。當(dāng)中斷請(qǐng)求發(fā)出時(shí),該標(biāo)志位被置1,用于指示該中斷源有中斷請(qǐng)求產(chǎn)生。

2.中斷判優(yōu)

由于CUP在某一時(shí)刻只能為一個(gè)中斷服務(wù),根據(jù)中斷系統(tǒng)的不同用途,必須按照一定的中斷調(diào)度方式,在眾多中斷請(qǐng)求中挑選出接受CUP服務(wù)的那一個(gè)。

另外,中斷之間有沒(méi)有搶占行為(中斷嵌套),以及如何搶占也是中斷調(diào)度需要解決的重要問(wèn)題。出于簡(jiǎn)化系統(tǒng)的考慮,在一些非實(shí)時(shí)應(yīng)用中,中斷嵌套功能不是必需的。

STM32采用了兩段16級(jí)的中斷優(yōu)先級(jí),分別是搶占優(yōu)先級(jí)段和子優(yōu)先級(jí)段。并規(guī)定優(yōu)先級(jí)判斷邏輯和嵌套規(guī)則如下:

(1)只有高搶占優(yōu)先級(jí)的中斷可打斷低搶占優(yōu)先級(jí)的中斷服務(wù),構(gòu)成中斷嵌套。

(2)當(dāng)多個(gè)相同搶占優(yōu)先級(jí)的中斷同時(shí)掛起時(shí),它們之間不能構(gòu)成中斷嵌套。CUP首先響應(yīng)子優(yōu)先級(jí)更高的中斷,較低子優(yōu)先級(jí)的中斷只能在較高子優(yōu)先級(jí)服務(wù)結(jié)束后才能得到服務(wù)。

(3)當(dāng)多個(gè)掛起中斷的兩個(gè)優(yōu)先級(jí)都相同時(shí),先響應(yīng)中斷向量表地址較低的中斷。

3.中斷響應(yīng)

成功通過(guò)判別電路的中斷請(qǐng)求將被CUP立即響應(yīng)。響應(yīng)的第一個(gè)行動(dòng)就是自動(dòng)保存斷點(diǎn),以便中斷返回時(shí)能回到原來(lái)的地方,繼續(xù)主程序或被打斷的中斷服務(wù)程序的執(zhí)行過(guò)程。斷點(diǎn)包括原來(lái)程序執(zhí)行時(shí)程序計(jì)數(shù)器(PC)的值和程序狀態(tài)寄存器(PSR)的值。

為了節(jié)約中斷響應(yīng)時(shí)間,簡(jiǎn)化中斷服務(wù)程序,STM32對(duì)中斷響應(yīng)過(guò)程進(jìn)行了改進(jìn),不僅自動(dòng)保存斷點(diǎn),也將中斷服務(wù)程序經(jīng)常用到的R0~R3寄存器自動(dòng)保存,即斷點(diǎn)與現(xiàn)場(chǎng)保存都是由硬件自動(dòng)完成。具體而言,STM32中斷響應(yīng)時(shí)會(huì)依次把xPSR、PC、LR、R12以及R3~R0由硬件自動(dòng)壓入適當(dāng)?shù)亩褩V?,如果響?yīng)中斷,當(dāng)前的代碼正在使用進(jìn)程堆棧PSP,則壓入PSP;否則就壓入主堆棧MSP。一旦進(jìn)入了服務(wù)例程,就將一直使用主堆棧。入棧順序以及入棧后堆棧中的內(nèi)容如表5.7所示。

4.中斷處理

中斷處理就是中斷服務(wù)程序要做的事情。一般情況下,CUP在響應(yīng)中斷后,都會(huì)關(guān)閉對(duì)可屏蔽中斷的響應(yīng),處于關(guān)中斷狀態(tài)。

中斷處理的工作至少包括:

(1)保護(hù)現(xiàn)場(chǎng)。

(2)根據(jù)需要開(kāi)中斷。

(3)中斷服務(wù)。

(4)關(guān)中斷。

(5)恢復(fù)現(xiàn)場(chǎng)。

5.中斷返回

如果中斷源有相應(yīng)的請(qǐng)求標(biāo)志位,應(yīng)在返回前將其清除。

在中斷處理程序中,其最后一條指令必須是中斷返回指令,該指令的執(zhí)行能讓CUP自動(dòng)將中斷響應(yīng)時(shí)保存的PC和其他一些重要寄存器的內(nèi)容恢復(fù),使CUP繼續(xù)執(zhí)行原來(lái)被中斷的程序。

有的CUP有專(zhuān)用的中斷返回指令,而ARM處理器直接使用傳送指令來(lái)完成中斷返回功能。

5.6中斷延遲及其改善

中斷請(qǐng)求產(chǎn)生到開(kāi)始執(zhí)行中斷服務(wù)程序的第一條指令所用的時(shí)間稱(chēng)為中斷延遲。實(shí)際上中斷請(qǐng)求并不能立刻到響應(yīng),中斷延遲總是存在的。嵌入式系統(tǒng)對(duì)實(shí)時(shí)性能的要求較高,中斷延遲的長(zhǎng)短也就成為系統(tǒng)的一個(gè)重要指標(biāo)。由于實(shí)時(shí)系統(tǒng)考慮最多的是最壞情況,而不是平均情況,因此必須按最大延遲時(shí)間來(lái)計(jì)算中斷延遲。

產(chǎn)生中斷延遲的原因主要有以下幾個(gè)方面。

(1)最長(zhǎng)指令時(shí)間。

(2)中斷向量跳轉(zhuǎn)時(shí)間。

(3)保存CUP內(nèi)部寄存器時(shí)間。

在斷點(diǎn)保存和恢復(fù)上采用硬件操作堆棧,不僅簡(jiǎn)化了程序設(shè)計(jì),也節(jié)約了在ISR中軟件壓棧的時(shí)間。并且當(dāng)數(shù)據(jù)總線正在進(jìn)行入棧操作時(shí),指令總線也將從向量表中找出正確的異常向量,然后在服務(wù)程序的入口處預(yù)取指令。由此可以看到,CM3采用的哈佛結(jié)構(gòu)指令和數(shù)據(jù)各自都有專(zhuān)用總線的好處:入棧與取指這兩個(gè)工作能并行進(jìn)行。

最終,NVIC的中斷延遲是絕對(duì)固定的。從外設(shè)請(qǐng)求中斷開(kāi)始到執(zhí)行中斷服務(wù)程序的第一條指令只需要12個(gè)時(shí)鐘周期。

此外,CM3為縮短中斷延遲還做了很多努力,新增“咬尾中斷”和“晚到異常”機(jī)制。

5.6.1咬尾中斷

當(dāng)處理器在響應(yīng)異常時(shí),如果又發(fā)生其他異常,但它們優(yōu)先級(jí)不夠高,則被阻塞。那么在當(dāng)前的異常執(zhí)行返回后,系統(tǒng)處理掛起的異常時(shí),倘若還是先出棧(POP),然后又把出來(lái)的內(nèi)容又入棧(PUSH)保存回去,這就白白浪費(fèi)了CUP的時(shí)間。正因如此,CM3不會(huì)執(zhí)行POP操作,而是繼續(xù)使用上一次異常已經(jīng)PUSH好的結(jié)果。這么一來(lái),前后只執(zhí)行了一次入棧/出棧操作。于是,這兩個(gè)異常之間的“時(shí)間溝”變窄了很多,切入新異常服務(wù)的耗時(shí)可以縮短到6個(gè)周期。

中斷咬尾的過(guò)程如圖5.11和圖5.12所示。

圖5.12使用咬尾的情況

5.6.2晚到異常

CM3的中斷處理還有另一個(gè)機(jī)制,它強(qiáng)調(diào)了優(yōu)先級(jí)的作用,這就是“晚到的異常處理”。當(dāng)CM3對(duì)某異常的響應(yīng)序列還處在早期:入棧的階段,尚未執(zhí)行其服務(wù)例程時(shí),如果收到了高優(yōu)先級(jí)異常的請(qǐng)求,則本次入棧就成了為高優(yōu)先級(jí)中斷所做的了——入棧后將執(zhí)行高優(yōu)先級(jí)異常的服務(wù)例程??梢?jiàn),它雖然來(lái)晚了,卻還是因優(yōu)先級(jí)高而被優(yōu)先執(zhí)行,這個(gè)過(guò)程如圖5.13所示。圖5.13晚到異常

例如,若在響應(yīng)某低優(yōu)先級(jí)異常#1的早期檢測(cè)到了高優(yōu)先級(jí)異常#2,則只要#2沒(méi)有太晚,就能以“晚到中斷”的方式處理——在入棧完畢后執(zhí)行ISR#2。如果異常#2來(lái)得太晚,以至于已經(jīng)執(zhí)行了ISR#1的指令,則按普通的搶占處理,這會(huì)需要更多的處理器時(shí)間和額外32字節(jié)的堆棧空間。

在ISR#2執(zhí)行完畢后,則以剛剛講過(guò)的“咬尾中斷”方式,來(lái)啟動(dòng)ISR#1的執(zhí)行。

5.7STM32中斷應(yīng)用

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論