女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

為何修改BASEPRI寄存器無效?

茶話MCU ? 來源:茶話MCU ? 2023-04-26 09:16 ? 次閱讀

STM32用戶發(fā)現(xiàn)在操作BASEPRI特殊功能寄存器時,根本不起作用。比方,它目前配置了幾個中斷,優(yōu)先級各不相同,按照STM32CubeMx里的配置分別為2、3、4不等,當他在BASEPRI寄存器里寫這幾個數(shù)字中的任意一個時,發(fā)現(xiàn)BASEPRI的數(shù)字始終是0,沒有任何效果。

我們知道,通過配置 BASEPRI寄存器非0值來給系統(tǒng)中的中斷響應設置門檻,當中斷優(yōu)先級低于某個級別時將不會得到CPU的響應執(zhí)行,也就是說只有中斷優(yōu)先級高于某個級別時才能得到響應。下面截圖是來自ARM CORTEX M4技術手冊中有關BASEPRI寄存器的描述。

092c7a46-e3be-11ed-ab56-dac502259ad0.png

從這里可以看到該寄存器的有效配置位有8位,對其寫0無意義,或者說放棄設置中斷響應門檻功能。在ARMCORTEX-M內(nèi)核系統(tǒng)里,中斷優(yōu)先級的高低跟表示優(yōu)先級的數(shù)字大小成相反關系,即數(shù)字越小的中斷優(yōu)先級配置值所對應的優(yōu)先級反而越高。

根據(jù)BASEPRI寄存器的定義,假設給BASEPRI寫數(shù)字5,那就意味著只有中斷優(yōu)先級高于5的中斷,即中斷優(yōu)先級的數(shù)字小于5的中斷可以得到響應,而其它低于優(yōu)先級5的中斷將會被屏蔽。【注:這里說的優(yōu)先級比較最終都體現(xiàn)在搶占優(yōu)先級上】

另外,在ARM內(nèi)核里關于每個中斷的優(yōu)先級配置寄存器也是8位,并支持字節(jié)訪問。

0946b690-e3be-11ed-ab56-dac502259ad0.png

內(nèi)核里還有跟中斷優(yōu)先級有關的寄存器,它把中斷優(yōu)先級配置位分成2部分,用來分別設置每個中斷的組優(yōu)先級和子優(yōu)先級,或稱搶占優(yōu)先級和響應優(yōu)先級,也有稱主優(yōu)先級和子優(yōu)先級的,意思都一樣。個人喜歡中間的術語。

0959b66e-e3be-11ed-ab56-dac502259ad0.png

以上圖優(yōu)先級分組值【PRIGROUP】等于3為例。中斷優(yōu)先級寄存器中的bit0~bit3用作配置該中斷的響應優(yōu)先級,顯然,它的值可以是0到15的任一值。bit4~bit7用來配置該中斷的強占優(yōu)先級,同樣它的值也可以是0到15的任一值。若以【PRIGROUP】等于7為例,則所有可配置優(yōu)先級的中斷只配置響應優(yōu)先級,不區(qū)分強占優(yōu)先級,或者說搶占優(yōu)先級都一樣,或者說彼此不發(fā)生中斷搶占都一個意思。所謂中斷搶占即指另一中斷事件打斷正在執(zhí)行的中斷服務程序而響應更高優(yōu)先級的程序。

上面都基于ARM Cortex-M內(nèi)核的最初設計來說的,我們知道,STM32是基于ARM內(nèi)核添加ST的外設而成,ST在設計芯片的中斷優(yōu)先級這個地方,在AMR核的設計基礎上做了些針對性的調(diào)整,涉及中斷優(yōu)先級的寄存器的有效控制位由8位變成4位,且僅使用高4位,低4位變成保留位。【下圖來自STM32Cortex M4 編程手冊。注意紅色下劃線特別說明。】

097052a2-e3be-11ed-ab56-dac502259ad0.png

不難理解,BASEPRI寄存器也會跟著做了調(diào)整,不然沒法跟上面調(diào)整過的中斷優(yōu)先級寄存器匹配,它也只使用高4位,低4位變保留位。【下圖來自STM32F4系列編程手冊】

098db784-e3be-11ed-ab56-dac502259ad0.png

當然,關于優(yōu)先級分組的控制寄存器的內(nèi)容也做了相應調(diào)整,即針對優(yōu)先級寄存器的高4位來劃分搶占優(yōu)先級和響應優(yōu)先級的配置。詳見下圖:

09a0a4fc-e3be-11ed-ab56-dac502259ad0.png

把上圖的各種優(yōu)先級分組配置變得更直觀點就是下圖的樣子。綠色用于配置搶占優(yōu)先級,黃色用于配置響應優(yōu)先級,灰色保留位,一共有5種可能的分組情形。

09b7d636-e3be-11ed-ab56-dac502259ad0.png

聊到這里,我們得知每個可配置的STM32片內(nèi)中斷,都有一個8位優(yōu)先級配置寄存器與之對應,且只用到高4位。我們接著看看開篇的問題。目前STM32的有關中斷配置如下圖所示【使用STM32CubeMx工具進行】:

09ce2008-e3be-11ed-ab56-dac502259ad0.png

這里優(yōu)先級分組選擇的是將優(yōu)先級的4位控制位全部用作搶占優(yōu)先級的配置,響應優(yōu)先級都一樣,即不做特別配置。那么上圖中SYSTICK/TIM2/TIM3/TIM4的中斷的搶占優(yōu)先級數(shù)據(jù)0、2、3、4其實是站在中斷優(yōu)先級寄存器的高4位而言的,那么放到整個8位優(yōu)先級寄存器來看的話,他們的優(yōu)先級應該是0x00,0x20,0x30,0x40【其實,低4位值是多少無關緊要,反正無效位】。

前面提過了,現(xiàn)在BASEPRI寄存器也只用到高4位,低4位保留。顯然,如果在給BASEPRI寄存器賦值時按照基于高4位得到數(shù)字往里面寫的話肯定都是無效的。

比方,我們期望在主程序里將上面TIM2/TIM3/TIM4的幾個中斷都屏蔽掉,若代碼像下面截圖里這樣寫肯定達不到目的。我這里開啟了TIM2/TIM3/TIM4的周期性更新中斷。【本文代碼編譯、調(diào)試基于ARM MDK IDE】

09eb1122-e3be-11ed-ab56-dac502259ad0.png

09f8265a-e3be-11ed-ab56-dac502259ad0.png

經(jīng)過測試也的確沒有達到目的。我寫__set_BASEPRI(2)的本意是想屏蔽掉那幾個定時器的中斷響應,結果發(fā)現(xiàn)根本沒作用。BASEPRI寄存器也沒正確寫入,因為數(shù)據(jù)2只能寫到BASEPRI寄存器的低4位,這幾位恰好是無效位。不難理解,當我們改寫成__set_BASEPRI(0x20)時就可以達到目的了。

0a0b9f0a-e3be-11ed-ab56-dac502259ad0.png

此時,BASEPRI被正確寫入,TIM2/TIM3/TIM4的中斷不能得到響應,倒是SYSTICK中斷可以不被影響地得到響應,因為它的優(yōu)先級是0,BASEPRI的配置屏蔽不了它。也就是說,通過配置BASEPRI寄存器來設置中斷響應門檻的話,是阻止不了優(yōu)先級為0或更高優(yōu)先級的中斷的響應的。如果對BASEPRI寫0表示放棄其設置的中斷門檻的功能。

如果希望對包括0優(yōu)先級在內(nèi)的所有可配置中斷進行關閉或屏蔽,能否做得到呢?若可以,如何操作?

STM32芯片里的中斷如果按中斷源是來自ST外設還是ARM核處理器可以分為異常和中斷,比方下圖中灰色部分的就是異常,其它為中斷。【截圖來自STM32G4系列參考手冊】

0a311596-e3be-11ed-ab56-dac502259ad0.png

平常我們統(tǒng)稱二者為中斷,不做區(qū)分。如果說把所有中斷按其優(yōu)先級是否可以配置,又可以將中斷分為優(yōu)先級固定和優(yōu)先級可配置的中斷。其中,優(yōu)先級固定的中斷在上面表格中都明確標示了fixed字樣,優(yōu)先級可配置的都加注了settable字樣。結合前面提到的優(yōu)先級寄存器的特性,可配置的優(yōu)先級是不會高于0級,即配置的數(shù)字不會小于0的。

若我們期望對所有可配置中斷進行關閉或屏蔽,可以操作另一個叫PRIMASK的寄存器,它只有1位有效控制位。

0a6a42a8-e3be-11ed-ab56-dac502259ad0.png

我們通過對PARMASK寫1,令CPU對所有優(yōu)先級可配置的中斷不做響應;若對其寫0表示放棄屏蔽功能。比方,我們還是接著前面的演示代碼來看看效果。

0a75ef90-e3be-11ed-ab56-dac502259ad0.png

這時,前面提到的4個定時器中斷都不能得到響應了,雖打了斷點但過不去。我們還可以借助調(diào)試工具看到這幾個中斷的響應情況【SYSTICK位置離得遠,單獨截取后插進圖中的】。

0a953f1c-e3be-11ed-ab56-dac502259ad0.png

對于上圖的部分信息我這里稍微解釋下。

圖形上方的字母E、P、A是下方Eable/Pending/Active單詞的首字母。Enable表示相應中斷是否在NVIC端得到響應允許;Pending表示中斷等待CPU的執(zhí)行;Active表示中斷服務程序正在被執(zhí)行。從圖中可以看出,SYSTICK/TIM2/TIM3/TIM4的中斷響應都雖得到允許,但都處于Pending期待執(zhí)行狀態(tài)。既然沒有得到執(zhí)行,Active位自然也是0。

上圖中優(yōu)先級的數(shù)字顯然是按照高4位結合優(yōu)先級分組后來看的,那個S表示SubPriority的意思。為了看得更清晰點,我不妨將優(yōu)先級分組采用下面的做法重新配置下,保持原搶占優(yōu)先級都不動,增加1位響應優(yōu)先級【即子優(yōu)先級】配置。目前4位優(yōu)先級配置位拆分為3位搶占優(yōu)先級配置位和1位響應優(yōu)先級配置位。當前測試代碼也保持不動。

0abc04da-e3be-11ed-ab56-dac502259ad0.png

顯然,上圖中的搶占優(yōu)先級編號2、3、4是站在分組后的高3位單獨來看的,響應優(yōu)先級是站在分組后剩下的1位單獨來看的。如果我們把兩類優(yōu)先級的配置在高4位一起看,優(yōu)先級數(shù)字應該分別是十進制數(shù)1、5、6、9。【這個地方要弄清楚,否則下面調(diào)試結果看不明白。】

0ae0c8ce-e3be-11ed-ab56-dac502259ad0.png

基于前面測試代碼和現(xiàn)有配置,我們看看運行后的中斷響應情況。

0aef7446-e3be-11ed-ab56-dac502259ad0.png

剛才雖然調(diào)整了優(yōu)先級的分組配置,但這幾個中斷的搶占優(yōu)先級都沒改變,所以在PRIMASK為1的情況下都不能得到響應。我們可以發(fā)現(xiàn)這幾個中斷的優(yōu)先級站在高4位的角度來看而得出的優(yōu)先級數(shù)字跟我上面分析的基本一致,除了SYSTICK的。

按理此時此處SYSTICK的優(yōu)先級應該是1而不是0。為什么會這樣呢?原因就在于我基于CubeMx組織的代碼,這個過程中如果使用SYSTICK做庫代碼的TICK時鐘,其中斷優(yōu)先級的配置使用默認配置,沒有理睬CubeMx這邊針對它子優(yōu)先級的配置。Cube庫在配置SYSTICK優(yōu)先級時,默認使用全部4位用作搶占優(yōu)先級的配置,同時將子優(yōu)先級配置為0。當然,我們可以針對性地調(diào)整來適應我們的需求。主要是下面這個weak特性的初始函數(shù),我們可以手動修改這個函數(shù)里關于中斷優(yōu)先級的配置。

0b119670-e3be-11ed-ab56-dac502259ad0.png

關于使用PRIMASK屏蔽所有可配置中斷的做法還有其它等效動作,比如使用CPSID指令和CPSIE指令或調(diào)用相關CMSIS函數(shù)。【參見下圖】

0b255f20-e3be-11ed-ab56-dac502259ad0.png

它們的作用一樣,也就是我們平常所說的開、關總中斷,準確點說是屏蔽所有優(yōu)先級可配置中斷的響應或者放棄屏蔽功能。對于開、關總中斷的說法,從實現(xiàn)屏蔽效果來看勉強可以說能關總中斷。但整體上講,個人覺得這個說法不太合適,還很容易給人帶來誤解,頗具誤導性。其實,不論是操作PRIMASK還是BASEPRI寄存器,并沒有對被屏蔽中斷的原有參數(shù)和配置做任何改變。即那些暫時被屏蔽的中斷的中斷響應允許位、中斷請求使能位、中斷觸發(fā)事件等都不會因為暫時的被屏蔽而發(fā)生改變。打個形象而不是特別貼切的比方。當你開著豪車愉快地跑在某條道上,聽著歌哼著曲。突然前方有交警在對道路做臨時管制,你和其它一干人車都被攔停下來。原因是有一行高級別的人物要保障優(yōu)先通行。你等雖被攔停下來,既沒人說你無證駕駛、也沒人告知你無權走這條道,證照都在,行路權也有,就是此刻級別不夠。一旦放行,你依然可以一如既往地行使。

我倒覺得ARM技術手冊提到的優(yōu)先級提升更好理解和接受些。即通過對BASEPRI、PRIMASK這些寄存器編程提升當前執(zhí)行程序的優(yōu)先級,使得低于當前優(yōu)先級的中斷暫時得不到響應。適當時候放棄優(yōu)先級升級功能,恢復原狀。

可能有人知道,還有個可以關閉或屏蔽優(yōu)先級高至-1級的HardFault異常的控制寄存器,就是FAULTMASK,也是1位有效位,操作跟PRIMASK類似。有興趣的話,可以自行進一步研究下。

審核編輯:湯梓紅

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

    關注

    134

    文章

    9312

    瀏覽量

    375161
  • 寄存器
    +關注

    關注

    31

    文章

    5423

    瀏覽量

    123418
  • STM32
    +關注

    關注

    2290

    文章

    11017

    瀏覽量

    362471
  • 中斷
    +關注

    關注

    5

    文章

    904

    瀏覽量

    42532
  • stm32cubemx
    +關注

    關注

    5

    文章

    286

    瀏覽量

    15986

原文標題:為何修改BASEPRI寄存器無效?

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    寄存器是什么?怎么操作寄存器點亮LED燈?

    寄存器,是集成電路中非常重要的一種存儲單元,通常由觸發(fā)組成。在集成電路設計中,寄存器可分為電路內(nèi)部使用的寄存器和充當內(nèi)外部接口的寄存器這兩
    的頭像 發(fā)表于 07-21 16:59 ?4509次閱讀
    <b class='flag-5'>寄存器</b>是什么?怎么操作<b class='flag-5'>寄存器</b>點亮LED燈?

    寄存器與移位寄存器

    寄存器與移位寄存器 寄存器是用來寄存數(shù)碼的邏輯部件,所以必須具備接收和寄存數(shù)碼的功能。任何一種觸發(fā)
    發(fā)表于 03-12 15:19 ?59次下載

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定義  寄存器是中央處理內(nèi)的組成部分。寄存器是有限存貯容量
    發(fā)表于 03-08 14:26 ?2.2w次閱讀

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思 數(shù)據(jù)寄存器數(shù)據(jù)寄存器包括累加AX、基址寄存器BX、計數(shù)
    發(fā)表于 03-08 14:38 ?1.3w次閱讀

    移位寄存器,移位寄存器是什么意思

    移位寄存器,移位寄存器是什么意思 移位寄存器_
    發(fā)表于 03-08 14:50 ?1.8w次閱讀

    寄存器與移位寄存器

    寄存器與移位寄存器:介紹寄存器原理和移位寄存器的原理及實現(xiàn)。
    發(fā)表于 05-20 11:47 ?0次下載

    移位寄存器的原理

    移位寄存器按照不同的分類方法可以分為不同的類型。 如果按照移位寄存器的移位方向來進行分類, 可以分為左移移位寄存器、移位寄存器和雙向移位寄存器
    發(fā)表于 07-15 09:38 ?7.6w次閱讀
    移位<b class='flag-5'>寄存器</b>的原理

    AD轉(zhuǎn)換寄存器設置

    AD轉(zhuǎn)換寄存器設置AD轉(zhuǎn)換寄存器設置AD轉(zhuǎn)換寄存器設置
    發(fā)表于 11-10 17:36 ?16次下載
    AD轉(zhuǎn)換<b class='flag-5'>寄存器</b>設置

    芯片與寄存器

    芯片與寄存器作為一個嵌入式開發(fā)人員,從接觸第一塊單片機的時候,就一定會聽到一個此,叫做寄存器。單片機的很多功能都是通過配置修改寄存器來實現(xiàn)的。我們了解寄存器,也讀寫過很多的
    發(fā)表于 11-23 16:21 ?50次下載
    芯片與<b class='flag-5'>寄存器</b>

    ARM通用寄存器及狀態(tài)寄存器詳解

    筆者來聊聊ARM通用寄存器以及狀態(tài)寄存器的認識與理解。
    的頭像 發(fā)表于 01-06 14:58 ?8310次閱讀

    單片機工作寄存器作用 單片機常用專用寄存器

    除了通用寄存器(如累加、通用寄存器等),單片機中還會有特定功能的寄存器,如定時寄存器、中斷控
    的頭像 發(fā)表于 04-08 14:46 ?8255次閱讀

    操作BASEPRI特殊功能寄存器無效解決方法(上)

    有STM32用戶發(fā)現(xiàn)在操作BASEPRI特殊功能寄存器時,根本不起作用。比方,它目前配置了幾個中斷,優(yōu)先級各不相同,按照STM32CubeMx里的配置分別為2、3、4不等,當他在BASEPRI
    的頭像 發(fā)表于 06-21 16:04 ?2143次閱讀
    操作<b class='flag-5'>BASEPRI</b>特殊功能<b class='flag-5'>寄存器</b>時<b class='flag-5'>無效</b>解決方法(上)

    操作BASEPRI特殊功能寄存器無效解決方法(下)

    站在中斷優(yōu)先級寄存器的高4位而言的,那么放到整個8位優(yōu)先級寄存器來看的話,他們的優(yōu)先級應該是0x00,0x20,0x30,0x40【其實,低4位值是多少無關緊要,反正無效位】。 前面提過了,現(xiàn)在
    的頭像 發(fā)表于 06-21 16:08 ?1740次閱讀
    操作<b class='flag-5'>BASEPRI</b>特殊功能<b class='flag-5'>寄存器</b>時<b class='flag-5'>無效</b>解決方法(下)

    直接修改寄存器來輸出內(nèi)部時鐘的方法

    電子發(fā)燒友網(wǎng)站提供《直接修改寄存器來輸出內(nèi)部時鐘的方法.pdf》資料免費下載
    發(fā)表于 09-19 15:43 ?0次下載
    直接<b class='flag-5'>修改寄存器</b>來輸出內(nèi)部時鐘的方法

    寄存器分為基本寄存器和什么兩種

    寄存器是計算機中用于存儲數(shù)據(jù)的高速存儲單元,它們是CPU內(nèi)部的重要組成部分。寄存器可以分為基本寄存器和擴展寄存器兩種類型。 一、基本寄存器
    的頭像 發(fā)表于 07-12 10:31 ?2076次閱讀