<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

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

3天內不再提示

因STM32移植而引發的兩個小疑問

茶話MCU ? 來源:茶話MCU ? 2023-11-18 14:12 ? 次閱讀

STM32用戶將基于STM32F0芯片的代碼移植到STM32F4系列時遇到了些麻煩。其中有個問題跟中斷處理有關。有個中斷服務程序代碼在STM32F0芯片里運行正常,移植到STM32F4芯片并使用同樣的程序代碼卻明顯異常,感覺每次中斷都進了兩次。

經過他一番網上搜索,大致找到了問題原因和解決辦法。原因就是他在中斷服務程序里做中斷請求標志清零的代碼放在服務程序的結尾處了,將其挪至服務程序的入口處就可以了。

問題是解決了,但依然還是有兩個小疑問如鯁在喉。

第一個疑問,為什么同樣的操作在F0系列正常,而在F4系列卻異常呢?僅僅是因為F4系列跑得快?

其實,這里的主要原因是內核差異導致的。STM32F0系列芯片是基于ARM Cortex-M0內核的微處理器,STM32F4系列芯片是基于ARM Cortex-M4內核的微處理器,二者在內核上存在一些差異,其中一個差異就是,M4內核相比M0內核多了針對寫操作的寫緩沖以及相應執行機構,這里不妨稱之為“緩沖寫”單元。

847cb746-85d1-11ee-939d-92fbcf53809c.png

對于F0系列,由于沒有“緩沖寫單元”,CPU在做中斷請求標志清零時需全程執行直到清零完成才能做中斷返回。對于F4系列,由于有“緩沖寫單元”協助,在做中斷請求標志清零時CPU只需執行相應程序,交代清楚寫些什么到哪里即可,具體的寫操作就交給“緩沖寫”單元完成,然后繼續執行后續程序,后面跟F0系列就有點不一樣了。由于清零操作代碼執行時刻與準備出棧時刻太接近,“緩沖寫”單元尚未完成對標志的清零,CPU因而再次進了一次中斷服務程序。顯然程序再運行一次后,一般來講那個標志的清零都會完成了。因此,類似情況我們往往最多也就看到進了兩次中斷。

第二個疑問呢?

用戶發現在使用STM32F4芯片時,即使清中斷標志代碼放在服務程序的結尾,一般只需在其后面追加3到4個NOP操作后就保證不會發生1次事件進入2次中斷服務程序的情況。也就是說,在清中斷標志代碼后面稍加延時3~5個時鐘就能保證清零完成。

對于Cortex-M內核的芯片,中斷出棧不會少于12系統時鐘。這樣說來,即使不加那幾個NOP操作延時,這12個時鐘也足以讓清零完成。這意味著出棧后中斷請求標志早已完成清零,那么第2次再進中斷是依據什么而響應的呢?

這里就涉及到ARM Cortex-M內核的中斷響應咬尾機制。簡單點說,當CPU剛執行完某中斷服務程序準備出棧返回時,若內核硬件發現外邊正有嗷嗷待哺的其它中斷請求候著時,就果斷決定不做出棧了,立馬響應新的中斷請求并執行相應服務程序。

具體到這里,當STM32F4的中斷服務程序里最后一行清中斷標志代碼執行完后(具體寫操作交給“緩沖寫單元”了),CPU準備做出棧返回時,由于寫緩沖單元尚未完成清零,硬件發現有個中斷請求存在,于是乎果斷決定放棄出棧,稍作準備后也不做壓棧就執行當前中斷請求所對應的服務程序,這里就是把剛才的中斷服務程序再跑一次。

看到這里,我們應該明白了,中斷再進一次的關鍵是CPU準備出棧時發現還有中斷請求存在,至于出棧時間多長多短已經不重要,因為這時壓根就不做出棧操作了。這也就可以解除上面提到的疑惑了。

下圖就是示意中斷前后兩次執行的情況?!炯俣ㄖ袛嗟谝淮问谴驍嘀鞒绦蚧驈娬计渌M來的】

8496280c-85d1-11ee-939d-92fbcf53809c.png

第一次進中斷時,發生了壓棧。第二次進中斷是緊跟著第一次中斷服務程序之后,未做出棧稍加準備后就開始執行服務程序,之后才做出棧操作。

看到這里,或許有人會問上面提到的稍加準備難道不要時間嗎?也是要的,如果Flash訪問取指延時為0等待的話,最短6個時鐘。

84a3e820-85d1-11ee-939d-92fbcf53809c.png

或許有人繼續問,這個6個時鐘跟平常壓棧的10來個時鐘是什么關系呢?

當有壓棧時,這個6個時鐘就包含于壓棧時間里了,它大致用來做中斷向量的提取、Exc_return值的擬定等,這些操作跟壓棧操作是并行重疊的,有壓棧時就不提這幾個時鐘的時間了,只說壓棧時間。

對于前面提到的第2次基于咬尾機制進中斷的情形,如果希望得到較為直觀地體驗、感受,可以借助斷點,觀察棧幀的變化來滿足。我們可以明顯地觀察到中斷服務程序運行了兩次,壓棧只發生一次。

好,今天的話題就分享到這里,供君參考。下次再聊。

審核編輯:湯梓紅

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

    關注

    146

    文章

    16019

    瀏覽量

    343659
  • STM32
    +關注

    關注

    2240

    文章

    10674

    瀏覽量

    348809
  • 微處理器
    +關注

    關注

    11

    文章

    2133

    瀏覽量

    81423
  • 移植
    +關注

    關注

    1

    文章

    367

    瀏覽量

    27854
  • 中斷
    +關注

    關注

    5

    文章

    884

    瀏覽量

    41028

原文標題:因STM32移植而引發的兩個小疑問

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

收藏 人收藏

    評論

    相關推薦

    multisim 如何疊加兩個兩個信號

    的)那么接下來就為了驗證這個電路到底能不能濾除兩個信號中的一信號,以及再放大這個信號。那么~~~~那么~~~~那么是不是就需要一混合了兩個信號的信號(比如
    發表于 03-03 17:55

    stm32怎么與兩個液晶相連

    stm32怎么與兩個液晶相連
    發表于 03-15 09:02

    怎么進行兩個stm32之間的通訊?

    求大神我拿兩個32rxtx反接發送的板子我只寫了USART_SendData(USART1,1);接受的板子我寫了data=USART_ReceiveData(USART1);printf("%c",data);不行求大神教教我如何實現
    發表于 08-15 16:53

    同步從站FIFO時序要引發額外的兩個周期延遲嗎?

    使用當前線程標志,除了專用線程標志所示的兩個周期延遲之外,是否還要引發額外的兩個周期延遲?如果不是,這者之間的時差是多少? 以上來自于百度翻譯 以下為原文I'm trying
    發表于 05-07 12:17

    兩個STM32服務器如何連接做客戶端的stm32?

    通信如圖所示。三stm32是在一板子上的,wifi 為esp8266模塊。兩個stm32做服務器和一
    發表于 05-13 03:23

    ewin移植出現TF5206 INIT SCAN這兩個函數沒定義

    ewin移植出現 TF5206 INITSCAN這兩個函數沒定義 (移植文件里 定義了 )為什么 。。
    發表于 06-14 04:35

    請問stm32f103ze和stm32f103rb(vb)兩個移植模板什么區別?

    micrim公司官網提供的STM32移植版的UCOSII,有stm32f103ze和stm32f103rb(vb)兩個
    發表于 07-05 03:50

    請問多出的這個兩個匯編函數是從哪移植過來的?

    exception (causes context switch) LDRR1, =NVIC_PENDSVSET STRR1, [R0] BXLRAGE 請問多出的這個兩個匯編函數,是從哪移植過來的呢?求教!
    發表于 07-29 04:35

    為什么移植ucosii進入hardfault會引發異常?

    移植完ucosii后,運行了一下,發現在任務調度時進入hardfault異常經過調試后發現是在OS_Sched()函數運行結束時引發的異常,這個是調試截圖,好像是在出棧指令pop引發的,但是不知道為什么,求大神指點一下。
    發表于 08-29 04:35

    STM32的中斷向量具有兩個屬性

    STM32 的中斷向量具有兩個屬性,一為搶占屬性,另一為響應屬性,其屬性編號越小,表明它的優先級別越高。 搶占,是指打斷其他中斷的屬性,即因為具有這個屬性會出現嵌套中斷(在執行中斷
    發表于 08-16 07:11

    STM32F103的兩個串口簡要分析

    一.STM32F103有兩個串口圖中 TXD/RXD 是相對 CH340G 來說的,也就是 USB 串口的發送和接收引腳。 USART1_RX 和 USART1_TX 則是相對于
    發表于 01-14 07:37

    STM32F072與STM32F070這兩個MCU的USB有什么差異?

    STM32F072與STM32F070這兩個MCU的USB有什么差異?stm32f103移植到f0_USB庫的過程是怎樣的?
    發表于 02-21 07:02

    小白求助ARM移植實驗中的兩個問題

    我在移植實驗中想到了兩個問題,如下:1.Debug 和 Release 以及 DebugRel 有什么不同?為什么在作 2104 移植實驗時,要用Release?2.在 Release 中為什么要將 RW Base 設置為 0x
    發表于 10-17 15:44

    調用派生自兩個基類的類的虛函數硬故障崩潰怎么解決?

    兩個基類派生類時,我發現了一問題。類BaseA{民眾: 基礎A(){} 虛擬 int GetNumber () const {返回 42;}};類BaseB{民眾: 基地B
    發表于 01-12 08:14

    STM32_UCOS移植

    STM32 UCOS移植 STM32 UCOS移植 STM32 UCOS移植
    發表于 07-13 17:31 ?28次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>