新聞中心

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

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

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

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

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

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

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

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

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

void__disable_irq (void);

void __disable_fault_irq (void);

下面兩個(gè)函數(shù)等效于開(kāi)放總中斷:

void __enable_irq (void);

void __enable_fault_irq (void);

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

例如:

第一種方法:

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

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

void __enable_irq (void);//開(kāi)放總中斷

__set_PRIMASK(1);

__set_PRIMASK(0);

第二種方法:

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

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

void __enable_fault_irq (void);//開(kāi)放總中斷

__set_FAULTMASK(1);

__set_FAULTMASK(0);

常常使用

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

void __enable_irq (void);//開(kāi)放總中斷

呵呵

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

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

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

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

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

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

不同的政府機(jī)關(guān)(搶占式優(yōu)先級(jí))之間可以相互中斷,但是同一個(gè)政府機(jī)關(guān)里面的不同部門(即搶占式中斷優(yōu)先級(jí)相同,響應(yīng)優(yōu)先級(jí)不同)之間不能相互中斷,因?yàn)閮?nèi)部不能相互打架,即使響應(yīng)優(yōu)先級(jí)高的來(lái)了,如果此時(shí)有響應(yīng)優(yōu)先級(jí)低的中斷服務(wù)程序正在執(zhí)行,他一定要等到對(duì)方執(zhí)行完之后才可以執(zhí)行,但是要注意一點(diǎn),雖然他不可以打斷比他響應(yīng)優(yōu)先級(jí)低的中斷服務(wù)函數(shù),但是他有“插隊(duì)”的特權(quán),即當(dāng)有多個(gè)相同搶占式優(yōu)先級(jí)同時(shí)到來(lái)的時(shí)候,響應(yīng)優(yōu)先級(jí)高的雖然中斷來(lái)的比較遲,但是他有優(yōu)先執(zhí)行的特權(quán)!問(wèn)題又來(lái)了,如果搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)都相同的中斷同時(shí)中斷或是排隊(duì)時(shí)孰先孰后呢,這就要看他們?cè)谥袛嘞蛄勘碇械奈恢昧耍簿褪钦f(shuō)中斷入口地址低的優(yōu)先。

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

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


上一頁(yè) 1 2 下一頁(yè)

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

評(píng)論


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

關(guān)閉