在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

常被誤解的開、關(guān)總中斷話題

茶話MCU ? 來源:茶話MCU ? 2023-05-18 09:18 ? 次閱讀

我們?cè)谑褂?a target="_blank">ARM Cortex-M內(nèi)核芯片進(jìn)行產(chǎn)品開發(fā)時(shí),有時(shí)可能需要暫時(shí)開辟一個(gè)相對(duì)清靜、不被打擾的程序執(zhí)行環(huán)境,以確保某些操作可靠順利完成。這時(shí)我們往往會(huì)使用所謂開、關(guān)總中斷的指令代碼來完成。我們可以對(duì)特殊功能寄存器PRIMASK寫1來關(guān)閉/屏蔽優(yōu)先級(jí)不高于0【數(shù)字大于0】的所有可配置中斷的中斷響應(yīng)。對(duì)其寫0,放棄關(guān)閉/屏蔽功能,即所謂的開總中斷。

關(guān)于使用PRIMASK寄存器關(guān)閉/屏蔽所有可配置中斷的做法還有其它等效操作,比如使用CPSID指令和CPSIE指令或調(diào)用相關(guān)CMSIS函數(shù)?!救缦聢D所示,左邊是匯編指令,右邊是對(duì)應(yīng)CMSIS函數(shù)】

e20ff88a-f519-11ed-90ce-dac502259ad0.png

不過,在實(shí)際應(yīng)用中很多人對(duì)這這個(gè)關(guān)、開總中斷操作有些誤解,尤其對(duì)關(guān)總中斷誤解更甚。以為關(guān)總中斷就在NVIC那里關(guān)閉了所有中斷響應(yīng)允許,或者說連外設(shè)端的中斷請(qǐng)求的使能也關(guān)閉了,中斷請(qǐng)求事件標(biāo)志也無效了,其實(shí)并不是這樣的。若出于誤解而使用開、關(guān)總中斷指令或函數(shù)往往就得不到自己想要的結(jié)果、或者結(jié)果讓人困惑不解。

下面基于Cortex -M4內(nèi)核的STM32L4芯片做些驗(yàn)證。這里我們拿STM32L476開發(fā)板驗(yàn)證下相關(guān)內(nèi)容【具體使用哪款STM32芯片不重要】。

e2163588-f519-11ed-90ce-dac502259ad0.png

我這里開啟片內(nèi)TIM1/TIM2/TIM3/TIM4四個(gè)定時(shí)器的更新事件中斷,其中TIM1/TIM2/TIM3的時(shí)間參數(shù)完全一樣,而TIM4跟前三者相比,除了溢出時(shí)間參數(shù)【就是ARR】稍微小一點(diǎn)外,其它配置一樣,四者同時(shí)啟動(dòng),并確保讓TIM4一定先進(jìn)入中斷服務(wù)程序[即ISR]。

它們的中斷優(yōu)先級(jí)設(shè)置各不相同,TIM4的最低?,F(xiàn)在假設(shè)TIM4中斷服務(wù)程序里要執(zhí)行一段特別重要的事情,通過代碼設(shè)計(jì)保證CPU剛進(jìn)入TIM4中斷服務(wù)程序時(shí)另外3個(gè)定時(shí)器一定還沒有觸發(fā)更新事件。為了便于測(cè)試,我也確保啟動(dòng)程序后每個(gè)TIMER都只產(chǎn)生一次更新事件。他們的優(yōu)先級(jí)配置如下圖所示【此處優(yōu)先級(jí)高4位全部用作搶占優(yōu)先級(jí),子優(yōu)先級(jí)都一樣,不做配置】:

e21d1894-f519-11ed-90ce-dac502259ad0.png

上面各中斷優(yōu)先級(jí)的數(shù)字是基于優(yōu)先級(jí)寄存器的高4位而言的,顯然TIM4的優(yōu)先級(jí)最低【數(shù)字越大優(yōu)先級(jí)越低】。我在CPU進(jìn)入TIM4 ISR時(shí)立即調(diào)用所謂的關(guān)閉總中斷函數(shù),然后一段時(shí)間后才調(diào)用所謂的打開總中斷的函數(shù),確保TIM4 ISR執(zhí)行完畢之前另外3個(gè)TIMER的更新中斷請(qǐng)求都產(chǎn)生了。

e22870f4-f519-11ed-90ce-dac502259ad0.png

我在每個(gè)中斷ISR里執(zhí)行一條輸提示,基于上面的測(cè)試代碼我們看看輸出結(jié)果【我借助于RTC把執(zhí)行各中斷的時(shí)間點(diǎn)也輸出了】:

e233bee6-f519-11ed-90ce-dac502259ad0.png

盡管在TIM4中斷里一開始就調(diào)用了disable_irq()函數(shù),可是,它并沒有關(guān)閉TIM1/TIM2/TIM3的中斷請(qǐng)求和后續(xù)響應(yīng)。從上圖不難看出,TIM4/TIM1/TIM2/TIM3依次得到響應(yīng)執(zhí)行。怎么感覺那個(gè)關(guān)閉總中斷的函數(shù)啥也沒關(guān)掉呢?這也正是被很多人誤會(huì)的地方。

其實(shí),這里調(diào)用disable_irq()函數(shù)的目的就是關(guān)閉/屏蔽所有優(yōu)先級(jí)不高于0的可配置中斷的響應(yīng),以保障當(dāng)前TIM4 ISR的順暢執(zhí)行。這就相當(dāng)于將當(dāng)前TIM4 的中斷優(yōu)先級(jí)從4提升到0了。因此,讓原本優(yōu)先級(jí)高于TIM4的TIM1/TIM2/TIM3中斷優(yōu)先級(jí)反而低于當(dāng)前TIM4ISR的執(zhí)行優(yōu)先級(jí),即使在TIM4 ISR過程中發(fā)生了TIM1/TIM2/TIM3中斷請(qǐng)求也沒法得到響應(yīng)。

而且,調(diào)用disable_irq()函數(shù)并不對(duì)被關(guān)閉/屏蔽中斷的原有參數(shù)和配置做任何改變。什么意思呢?那些暫時(shí)被屏蔽中斷的中斷響應(yīng)允許位、中斷請(qǐng)求使能位以及觸發(fā)事件標(biāo)志等都不會(huì)因暫時(shí)被屏蔽而發(fā)生改變。同樣,enable_irq()函數(shù)也不改變之前被屏蔽中斷的原有參數(shù)和配置,它只是放棄剛才的屏蔽功能【或說優(yōu)先級(jí)提升功能】。所以,當(dāng)執(zhí)行enable_irq()函數(shù)后,那些一度被屏蔽/關(guān)閉的中斷請(qǐng)求都會(huì)按照之前各自優(yōu)先級(jí)而被CPU響應(yīng)執(zhí)行。

我們可以在TIM4 ISR的適當(dāng)位置后打上斷點(diǎn)【斷點(diǎn)處4個(gè)TIMER的更新事件一定都產(chǎn)生了】看看各個(gè)中斷的響應(yīng)情況:【詳見下圖】

e23ccf9a-f519-11ed-90ce-dac502259ad0.png

圖中E、P、A是下方Eable/Pending/Active單詞的首字母。Enable表示中斷請(qǐng)求是否在NVIC端得到響應(yīng)允許;Pending表示中斷請(qǐng)求等待CPU的響應(yīng)執(zhí)行;Active表示中斷服務(wù)程序正在被執(zhí)行。

顯然,只有TIM4服務(wù)程序在被執(zhí)行中,其它3個(gè)都是掛起狀態(tài),等待被響應(yīng)。也就是說disable_irq()函數(shù)并不直接影響別的中斷請(qǐng)求的產(chǎn)生和響應(yīng)掛起狀態(tài),它通過提升當(dāng)前執(zhí)行程序的優(yōu)先級(jí)變相地實(shí)現(xiàn)了屏蔽/關(guān)閉其它優(yōu)先級(jí)不高于0的中斷請(qǐng)求的響應(yīng),即這個(gè)關(guān)閉是從執(zhí)行效果上來說的,相當(dāng)于變相提升了中斷響應(yīng)門檻;enable_irq()函數(shù)相當(dāng)于將提升的門檻拿走恢復(fù)原貌。

如果其它參數(shù)都不變,我注釋掉TIM4 ISR里的關(guān)閉總中斷的代碼,看看運(yùn)行結(jié)果會(huì)怎么樣呢?【見下圖中TIM4 ISR 代碼和輸出結(jié)果】

e24877dc-f519-11ed-90ce-dac502259ad0.png

雖然代碼保障了TIM4最先進(jìn)入中斷服務(wù)程序,但由于其它幾個(gè)更高優(yōu)先級(jí)的更新事件隨即產(chǎn)生而發(fā)生搶占,反而TIM4最后完成中斷執(zhí)行。我們可以觀察上面輸出順序及記錄的時(shí)間點(diǎn),請(qǐng)?zhí)貏e留意TIM3 ISR與 TIM4 ISR的輸出時(shí)間點(diǎn)是相同的,因分辨率問題時(shí)間太接近沒區(qū)分開來。不過這反而可以更清晰地看出TIM4被搶占了,TIM3一執(zhí)行完馬上回到TIM4的輸出【這個(gè)結(jié)果跟TIM4的被搶占時(shí)間點(diǎn)密切相關(guān)】。

如果說,我在上面配置和代碼基礎(chǔ)上,進(jìn)入TIM4 ISR后依然先關(guān)閉總中斷,在打開總中斷前對(duì)TIM1/TIM2/TIM3的幾個(gè)更新事件標(biāo)志做清零,結(jié)果會(huì)怎么樣呢?【相信很多人想看看這個(gè)結(jié)果,不妨先心里猜測(cè)下。】

e2577278-f519-11ed-90ce-dac502259ad0.png

基于上面調(diào)整后的代碼,編譯運(yùn)行。不論我怎么反復(fù)點(diǎn)擊運(yùn)行,上圖右邊的輸出結(jié)果紋絲不動(dòng)?這個(gè)結(jié)果是正確、合理的嗎?符合你心里預(yù)期否?

我這里清除的只是外設(shè)端的中斷請(qǐng)求事件標(biāo)志,怎么早已生效的中斷請(qǐng)求就消失了呢?結(jié)合前面的分析,在TIM4 ISR里運(yùn)行延時(shí)程序就是為了確保另外的TIM1/TIM2/TIM3的中斷請(qǐng)求得以生效,請(qǐng)求生效后并會(huì)在NVIC的中斷響應(yīng)掛起寄存器的相應(yīng)位置1,等待執(zhí)行。

這是怎么回事呢?原理上說不通啊?

其實(shí),我們看到的只是表象。真相是TIM1/TIM2/TIM3的ISR都得到執(zhí)行了,為什么沒看到TIM1/TIM2/TIM3 ISR運(yùn)行的結(jié)果輸出呢?這跟我們ISR代碼處理有關(guān)。

首先可以肯定,這里做中斷請(qǐng)求事件標(biāo)志清零時(shí),它們3個(gè)中斷請(qǐng)求早就生效并處于響應(yīng)掛起狀態(tài)。對(duì)事件標(biāo)志清零也不會(huì)影響到NVIC的中斷掛起位的。當(dāng)TIM4 ISR執(zhí)行完畢后,TIM1/TIM2/TIM3照樣基于優(yōu)先級(jí)高低相繼運(yùn)行各自ISR。但有個(gè)問題,就是各自的ISR代碼里都會(huì)檢測(cè)更新事件標(biāo)志,由于該標(biāo)志在TIM4 ISR早就被做了清除而成為無效標(biāo)志,所以在它們3個(gè)各自ISR里因檢測(cè)到事件標(biāo)志無效就都沒有繼續(xù)往下運(yùn)行而提前退場(chǎng),說直接點(diǎn)就是沒有運(yùn)行到結(jié)果輸出代碼就返回了。

既然這樣,我不妨將輸出結(jié)果的代碼放在各自ISR的入口處,免掉檢查標(biāo)志位這個(gè)環(huán)節(jié),然后我們繼續(xù)看看結(jié)果?!窘Y(jié)果輸出在各自更新中斷回調(diào)函數(shù)里完成。修改后的中斷代碼如下圖所示:】

e267510c-f519-11ed-90ce-dac502259ad0.png

基于上面的代碼調(diào)整,再看看結(jié)果輸出:

e26e2e0a-f519-11ed-90ce-dac502259ad0.png

這個(gè)輸出結(jié)果就跟我們分析和預(yù)期的一致。通過這個(gè)實(shí)驗(yàn)表明,對(duì)于在NVIC端生效處于響應(yīng)掛起的中斷請(qǐng)求,只是清除相應(yīng)的事件標(biāo)志是不會(huì)影響它的后續(xù)執(zhí)行的。如果我在上面TIM4 ISR里面執(zhí)行開啟總中斷操作前希望處于掛起狀態(tài)的TIM1/TIM2/TIM3中斷請(qǐng)求不要再被執(zhí)行了,那要如何操作呢?

首先,清除請(qǐng)求事件標(biāo)志是應(yīng)該的,而且還要清除它們各自的NVIC端的中斷響應(yīng)掛起位。我們可以通過調(diào)用__NVIC_ClearPendingIRQ(IRQn)函數(shù)對(duì)特定中斷響應(yīng)掛起位清零。

e2769a40-f519-11ed-90ce-dac502259ad0.png

對(duì)TIM4ISR代碼再稍加調(diào)整【見上圖】,運(yùn)行后就只能看到TIM4 ISR的輸出結(jié)果了。其它3個(gè)中斷請(qǐng)求半路被TIM4 ISR給清除了,即使再開總中斷也于事無補(bǔ)。

關(guān)于被誤解的開、關(guān)總中斷的話題,拉拉扯扯不知不覺也聊了這么多。所謂關(guān)總中斷,實(shí)質(zhì)上將當(dāng)前執(zhí)行程序的優(yōu)先級(jí)提升到0,變相提高了期望打斷當(dāng)前執(zhí)行程序的中斷事件的響應(yīng)門檻,開總中斷就是取消對(duì)當(dāng)前執(zhí)行程序的優(yōu)先級(jí)提升,恢復(fù)原貌。這里順便貼出幾個(gè)常用的有關(guān)中斷響應(yīng)的CMSIS函數(shù)供參考備忘。

e27f7372-f519-11ed-90ce-dac502259ad0.png

今天的分享就到這里,愿本文的分享能帶給您一些收獲。祝君好運(yùn)。下次再聊。

哦,最后補(bǔ)充下,文中的串口終端輸出結(jié)果,我是通過CPU直接向UART外設(shè)的數(shù)據(jù)寄存器輪詢式寫數(shù)據(jù)實(shí)現(xiàn)的。本公眾號(hào)文字力求不拖泥帶水,特意提醒這句給有心人。

審核編輯:湯梓紅

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

    關(guān)注

    134

    文章

    9279

    瀏覽量

    373928
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5402

    瀏覽量

    122929
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1405

    瀏覽量

    40991
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    902

    瀏覽量

    42413
  • Cortex-M
    +關(guān)注

    關(guān)注

    2

    文章

    229

    瀏覽量

    30175

原文標(biāo)題:常被誤解的開、關(guān)總中斷話題

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

收藏 人收藏

    評(píng)論

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

    STM32F0內(nèi)核的中斷是默認(rèn)的嗎?

    STM32F0、STM32F1, 用 CubeMx生成初始化代碼,只有外設(shè)的中斷使能代碼,沒有找到中斷的使能代碼,請(qǐng)問內(nèi)核的中斷默認(rèn)是
    發(fā)表于 04-03 06:14

    經(jīng)常被誤解的運(yùn)放壓擺動(dòng)作有哪些?

    運(yùn)放的壓擺動(dòng)作經(jīng)常被誤解。壓擺率是一個(gè)內(nèi)容較多的話題,我們需要將它進(jìn)行分類討論。
    發(fā)表于 02-23 07:10

    STM32關(guān)閉或開啟所有中斷代碼 精選資料分享

    STM32 關(guān)閉所有中斷如題,關(guān)閉或開啟所有中斷;代碼如下:__set_PRIMASK(1);//關(guān)中斷__set_PRIMASK(0);
    發(fā)表于 08-13 06:36

    STM32關(guān)全局中斷全局中斷有多種方法

    STM32關(guān)全局中斷全局中斷有多種方法,分別操作PRIMASK、FAULTMASK和BASEPRI寄存器。注:完整資料請(qǐng)查看Cortex-M3權(quán)威指南中的NVIC與
    發(fā)表于 08-13 09:22

    有沒有、關(guān)中斷的函數(shù)或者指令呢

    問題: 對(duì)于基于ARM Cortex M0內(nèi)核的STM32芯片各類應(yīng)用開發(fā)時(shí),有的時(shí)候需要進(jìn)行中斷、關(guān)處理。那就究竟有沒有、
    發(fā)表于 08-13 06:58

    STM32開啟和關(guān)閉中斷的方法 精選資料推薦

    __set_PRIMASK(1); //關(guān)中斷__set_PRIMASK(0); //中斷
    發(fā)表于 08-16 06:23

    STM32中斷優(yōu)先級(jí)和開關(guān)中斷教程

    STM32中斷優(yōu)先級(jí)和開關(guān)中斷 教程
    發(fā)表于 11-23 18:03 ?0次下載

    運(yùn)放的壓擺動(dòng)作誤解

    作者:Bruce Trump 資深模擬工程師 運(yùn)放的壓擺動(dòng)作經(jīng)常被誤解。壓擺率是一個(gè)內(nèi)容較多的話題,我們需要將它進(jìn)行分類討論。 運(yùn)放輸入級(jí)電路的兩個(gè)輸入端之間的電壓通常非常小------理想
    的頭像 發(fā)表于 02-10 16:53 ?1089次閱讀

    經(jīng)常被誤解的運(yùn)放壓擺動(dòng)作

    作者:Bruce Trump 資深模擬工程師 運(yùn)放的壓擺動(dòng)作經(jīng)常被誤解。壓擺率是一個(gè)內(nèi)容較多的話題,我們需要將它進(jìn)行分類討論。 運(yùn)放輸入級(jí)電路的兩個(gè)輸入端之間的電壓通常非常小------理想情況下
    發(fā)表于 01-29 06:00 ?9次下載
    經(jīng)<b class='flag-5'>常被</b><b class='flag-5'>誤解</b>的運(yùn)放壓擺動(dòng)作

    MT-006:ADC噪聲系數(shù) - 一個(gè)經(jīng)常被誤解的參數(shù)

    MT-006:ADC噪聲系數(shù) - 一個(gè)經(jīng)常被誤解的參數(shù)
    發(fā)表于 03-21 04:14 ?16次下載
    MT-006:ADC噪聲系數(shù) - 一個(gè)經(jīng)<b class='flag-5'>常被</b><b class='flag-5'>誤解</b>的參數(shù)

    LTC2954:帶μP中斷的按鈕/關(guān)控制器數(shù)據(jù)表

    LTC2954:帶μP中斷的按鈕/關(guān)控制器數(shù)據(jù)表
    發(fā)表于 04-15 20:01 ?13次下載
    LTC2954:帶μP<b class='flag-5'>中斷</b>的按鈕<b class='flag-5'>開</b>/<b class='flag-5'>關(guān)</b>控制器數(shù)據(jù)表

    STM32 關(guān)閉所有中斷

    STM32 關(guān)閉所有中斷如題,關(guān)閉或開啟所有中斷;代碼如下:__set_PRIMASK(1);//關(guān)中斷__set_PRIMASK(0);
    發(fā)表于 12-02 17:21 ?8次下載
    STM32 關(guān)閉所有<b class='flag-5'>中斷</b>

    STM32 禁用或開啟中斷

    導(dǎo)致升級(jí)失敗。ARM MDK中提供了如下兩個(gè)接口來禁用和開啟中斷:__disable_irq(); // 關(guān)閉中斷__enable_irq(); // 開啟
    發(fā)表于 12-09 09:36 ?13次下載
    STM32 禁用或開啟<b class='flag-5'>總</b><b class='flag-5'>中斷</b>

    PRIMASK寄存器、關(guān)中斷的指令代碼

    我們?cè)谑褂肁RM Cortex-M內(nèi)核芯片進(jìn)行產(chǎn)品開發(fā)時(shí),有時(shí)可能需要暫時(shí)開辟一個(gè)相對(duì)清靜、不被打擾的程序執(zhí)行環(huán)境,以確保某些操作可靠順利完成。這時(shí)我們往往會(huì)使用所謂、關(guān)中斷的指令
    的頭像 發(fā)表于 06-21 16:32 ?7524次閱讀
    PRIMASK寄存器<b class='flag-5'>開</b>、<b class='flag-5'>關(guān)</b><b class='flag-5'>總</b><b class='flag-5'>中斷</b>的指令代碼

    cc2530中斷控制位是什么?

    cc2530是一款著名的無線通信芯片,它內(nèi)置了豐富的功能和資源,其中包括中斷控制位。在本文中,將介紹cc2530中斷控制位的概念、作用、使用方法以及注意事項(xiàng)。 首先,讓我們來了解一
    的頭像 發(fā)表于 01-08 09:37 ?1353次閱讀
    主站蜘蛛池模板: 色偷偷亚洲 | 四虎影院免费在线 | 国产精品热久久毛片 | 美女视频黄a | 97av在线播放| 亚洲欧美色一区二区三区 | 亚洲视频二 | 91精品国产免费久久久久久青草 | 玖玖在线免费视频 | 天堂资源在线播放 | 免费大秀视频在线播放 | 色偷偷成人网免费视频男人的天堂 | 一女被两男吃奶玩乳尖口述 | 狠狠干狠狠插 | 韩国三级久久精品 | 国产视频日本 | 免费在线观看一级片 | 天天干天天干天天干 | 26uuu影院亚洲欧美综合 | 婷婷爱爱 | 最新天堂| 国产麻豆成人传媒免费观看 | 97成人在线视频 | 午夜在线网站 | 亚洲精品www | 色播久久 | 日本在线一本 | 婷婷六月丁 | 国产一级特黄毛片 | 久青草国产手机在线视频 | a级男女性高爱潮高清试 | 欧美在线bdsm调教一区 | 美女拍拍拍免费视频观看 | 在线观看视频一区二区三区 | 中国男女全黄大片一级 | 香港三级理论在线影院 | 亚洲电影av | 99久久伊人 | 五月天激情开心网 | 色偷偷女男人的天堂亚洲网 | 94久久国产乱子伦精品免费 |