新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32中斷優(yōu)先級(默認(rèn)和不默認(rèn)情況)

STM32中斷優(yōu)先級(默認(rèn)和不默認(rèn)情況)

作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

二,開關(guān)總中斷:

在STM32/Cortex-M3中是通過改變CPU的當(dāng)前優(yōu)先級來允許或禁止中斷。

PRIMASK位:只允許NMI和hard fault異常,其他中斷/異常都被屏蔽(當(dāng)前CPU優(yōu)先級=0)。

FAULTMASK位:只允許NMI,其他所有中斷/異常都被屏蔽(當(dāng)前CPU優(yōu)先級=-1)。

在STM32固件庫中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定義了四個函數(shù)操作PRIMASK位和FAULTMASK位,改變CPU的當(dāng)前優(yōu)先級,從而達(dá)到控制所有中斷的目的。

新庫中下面兩個函數(shù)等效于關(guān)閉總中斷:

void__disable_irq (void);

void __disable_fault_irq (void);

下面兩個函數(shù)等效于開放總中斷:

void __enable_irq (void);

void __enable_fault_irq (void);

上面兩組函數(shù)要成對使用,不能交叉使用。

例如:

第一種方法:

PRIMASK 用于除能在NMI 和硬fault 之外的所有異常,它有效地把當(dāng)前優(yōu)先級改為0(可編程優(yōu)先級中的最高優(yōu)先級)。

void__disable_irq (void);//關(guān)閉總中斷

void __enable_irq (void);//開放總中斷

__set_PRIMASK(1);

__set_PRIMASK(0);

第二種方法:

FAULTMASK 更絕,它把當(dāng)前優(yōu)先級改為‐ 1 。這么一來,連硬fault 都被掩蔽了。使用方案與PRIMASK 的相似。但要注意的是,F(xiàn)AULTMASK 會在異常退出時自動清零。

void __disable_fault_irq (void); //關(guān)閉總中斷

void __enable_fault_irq (void);//開放總中斷

__set_FAULTMASK(1);

__set_FAULTMASK(0);

常常使用

void__disable_irq (void);//關(guān)閉總中斷

void __enable_irq (void);//開放總中斷

呵呵

上面說的可能大家看完之后第一感覺就是一頭霧水,可能有點繞,下面我就結(jié)合自己的經(jīng)驗直白的談?wù)凷TM32的中斷優(yōu)先級的、

含義和結(jié)合庫函數(shù)的使用方法

庫函數(shù)中提到的PreemptionPriority含義是搶占式優(yōu)先級,subPriority含義是響應(yīng)優(yōu)先級,也叫亞優(yōu)先級。何為搶占式優(yōu)先級?

顧名思義,是指在搶占式優(yōu)先級不同時,搶占式優(yōu)先級高的可以中斷搶占式優(yōu)先級低的,也就是所謂的嵌套!相同的搶占式優(yōu)先級之間是不可以中斷嵌套的。打個比方,如果系統(tǒng)采用的是第4組優(yōu)先級分組方式,就意味著所有的4位都被用來指定搶占式優(yōu)先級,也就是說,這樣一來搶占式優(yōu)先級就有16個等級,通過你對需要的中斷源進(jìn)行中斷優(yōu)先級賦值,就可以實現(xiàn)你所希望的高優(yōu)先級中斷函數(shù)在低優(yōu)先級中斷函數(shù)未執(zhí)行完之前就開始執(zhí)行,即中斷嵌套,該分組方式最多可以完成1個中斷和15級嵌套。

通過上面我們知道搶占式優(yōu)先級高的可以中斷優(yōu)先級低的,但是響應(yīng)優(yōu)先級跟搶占式優(yōu)先級有什么聯(lián)系呢?這里我就 打個可能不太形象的比喻,幫助大家理解一下,如果說搶占式優(yōu)先級是某個等級的政府機(jī)關(guān)的話,那響應(yīng)優(yōu)先級就是這個政府機(jī)關(guān)里面的部門,政府機(jī)關(guān)權(quán)力有高低之分,同樣每個部門之間也有權(quán)力大小之分。

下面的話語言我組織不好可能有點繞,但是大家一定要仔細(xì)看:

不同的政府機(jī)關(guān)(搶占式優(yōu)先級)之間可以相互中斷,但是同一個政府機(jī)關(guān)里面的不同部門(即搶占式中斷優(yōu)先級相同,響應(yīng)優(yōu)先級不同)之間不能相互中斷,因為內(nèi)部不能相互打架,即使響應(yīng)優(yōu)先級高的來了,如果此時有響應(yīng)優(yōu)先級低的中斷服務(wù)程序正在執(zhí)行,他一定要等到對方執(zhí)行完之后才可以執(zhí)行,但是要注意一點,雖然他不可以打斷比他響應(yīng)優(yōu)先級低的中斷服務(wù)函數(shù),但是他有“插隊”的特權(quán),即當(dāng)有多個相同搶占式優(yōu)先級同時到來的時候,響應(yīng)優(yōu)先級高的雖然中斷來的比較遲,但是他有優(yōu)先執(zhí)行的特權(quán)!問題又來了,如果搶占式優(yōu)先級和響應(yīng)優(yōu)先級都相同的中斷同時中斷或是排隊時孰先孰后呢,這就要看他們在中斷向量表中的位置了,也就是說中斷入口地址低的優(yōu)先。

下面的問題大家就很容易理解了,不同的響應(yīng)優(yōu)先級不影響搶占式優(yōu)先級,打個比喻就是權(quán)力高的政府機(jī)關(guān)中最爛部門說話都比權(quán)力低的政府機(jī)關(guān)中最好的部門說話好使。即權(quán)力高,可以搶斷,嵌套

剛剛發(fā)現(xiàn)有些人把STM32的中斷通道數(shù)和外部單片機(jī)引腳數(shù)混為一談,中斷通道數(shù)跟單片機(jī)引腳個數(shù)沒有任何關(guān)系,目前M3內(nèi)核無論多少引腳的單片機(jī)中斷通道數(shù)都是84個,而無論引腳有多少個,這些引腳只占用6個通道,即0~4線分別占用一個通道,5~9線10~15線占用兩個中斷通道,一個中斷通道可能對應(yīng)很多外設(shè)


上一頁 1 2 下一頁

關(guān)鍵詞: STM32中斷優(yōu)先

評論


技術(shù)專區(qū)

關(guān)閉