<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時間: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)先級,從而達到控制所有中斷的目的。

          新庫中下面兩個函數(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個等級,通過你對需要的中斷源進行中斷優(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)先級是某個等級的政府機關(guān)的話,那響應(yīng)優(yōu)先級就是這個政府機關(guān)里面的部門,政府機關(guān)權(quán)力有高低之分,同樣每個部門之間也有權(quán)力大小之分。

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

          不同的政府機關(guān)(搶占式優(yōu)先級)之間可以相互中斷,但是同一個政府機關(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)力高的政府機關(guān)中最爛部門說話都比權(quán)力低的政府機關(guān)中最好的部門說話好使。即權(quán)力高,可以搶斷,嵌套

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


          上一頁 1 2 下一頁

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

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();