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

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

    文章

    17742

    瀏覽量

    358607
  • STM32
    +關注

    關注

    2286

    文章

    10987

    瀏覽量

    361482
  • 微處理器
    +關注

    關注

    11

    文章

    2359

    瀏覽量

    83654
  • 移植
    +關注

    關注

    1

    文章

    392

    瀏覽量

    28526
  • 中斷
    +關注

    關注

    5

    文章

    902

    瀏覽量

    42399

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    multisim 如何疊加兩個兩個信號

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

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

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

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

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

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

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

    STM32_UCOS移植

    STM32 UCOS移植 STM32 UCOS移植 STM32 UCOS移植
    發表于 07-13 17:31 ?30次下載

    Obtain_Studio自帶兩個STM32_GUI實例使用說明

    Obtain_Studio自帶兩個STM32_GUI實例使用說明
    發表于 07-15 16:03 ?25次下載

    新建STM32工程全局聲明兩個宏的原因

    在uVision中新建STM32工程后,需要從STM32標準庫中拷貝標準外設驅動到自己的工程目錄中,此時需要在工程設置->C/C++選項卡下的Define文本框中鍵入這兩個全局宏定義。
    發表于 08-10 10:25 ?2039次閱讀

    不同網段的兩個路由器如何互通?

    路由器的橋接功能一般應用在家用中較多,靜態路由的配置確實在項目中經常會應用,主要可以解決兩個不同網段路由器的互訪,具體的配置有一些朋友有些疑問,今天我們一起來看下。
    的頭像 發表于 03-21 11:14 ?1.2w次閱讀

    基于KEIL MDK環境調試STM32兩個誤會

    曾有兩個不同的STM32用戶反饋了相似的問題,他們在對STM32F7Cube庫里的工程例程進行編譯時,發現了一令人很不解的事。編譯的結果提示芯片內的RAM幾乎都耗光了。
    發表于 02-08 16:06 ?0次下載
    基于KEIL MDK環境調試<b class='flag-5'>STM32</b>的<b class='flag-5'>兩個</b>誤會

    STM32移植的一穩定可靠的FIFO

    STM32移植的一穩定可靠的FIFO,可移植到其他的STM32的單片機上。
    發表于 09-26 16:08 ?6次下載

    分享兩個STM32應用中的實戰案例

    今天在此分享兩個STM32應用中的實戰案例,權作提醒,以免重蹈覆轍。
    的頭像 發表于 01-11 09:13 ?4428次閱讀

    兩個LED和兩個按鈕的使用

    電子發燒友網站提供《兩個LED和兩個按鈕的使用.zip》資料免費下載
    發表于 01-30 16:04 ?1次下載
    <b class='flag-5'>兩個</b>LED和<b class='flag-5'>兩個</b>按鈕的使用

    STM32F1兩個USB中斷入口詳解

    STM32中斷入口有兩個,分別是USB_HP_CAN1_TX_IRQHandler和USB_LP_CAN1_RX0_IRQHandler。
    的頭像 發表于 07-24 11:12 ?5342次閱讀

    stm32單片機如何實現一按鍵切換兩個程序?

    stm32單片機如何實現一按鍵切換兩個程序? 作為一款功能強大的微控制器,STM32單片機可以支持多種應用場景,其中一實用的功能是按鍵切
    的頭像 發表于 09-14 14:22 ?6721次閱讀

    stm32定時器能同時控制兩個燈以不同頻率閃爍嗎?

    STM32的定時器功能強大,**STM32的定時器可以同時控制兩個燈以不同頻率閃爍** 。
    的頭像 發表于 12-13 10:43 ?2700次閱讀
    主站蜘蛛池模板: 午夜在线 | 亚洲免费毛片 | a天堂影院 | 4虎影院最近地址 | 欧洲乱码专区一区二区三区四区 | 日韩成人在线影院 | 婷婷色香 | 久久sp| 1024亚洲视频| 三级三级三级网站网址 | 手机看片1024福利 | 久久999| 欧美最猛性xxxx免费 | 四虎影院免费网址 | brazzers720欧美丰满 | 激情com| 欧美操穴 | 中文天堂最新版资源新版天堂资源 | 久草视频这里只有精品 | 一级做a爰片久久毛片免费看 | 特黄特色大片免费播放器9 特黄特色大片免费视频播放 | 国产亚洲3p一区二区三区 | 日韩无| 天天爽爽 | 国产精品久久久久国产精品三级 | 欧美日韩国产成人高清视频 | 国产精品人成在线播放新网站 | 特级毛片免费视频播放 | 亚洲区中文字幕 | 奇米影视第四色7777 | 永久免费观看午夜视频在线 | wwwwwww色| 伊人成伊人成综合网2222 | 国产精品视频第一区二区三区 | 极品美女啪啪 | 站长工具天天爽视频 | 久久综合香蕉久久久久久久 | 你懂的网址在线观看 | 久久视频免费看 | 四虎精品永久在线网址 | 日本成人免费网站 |