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

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

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

中斷里面這樣延時,有點猛~

嵌入式情報局 ? 來源:TopSemic嵌入式 ? 2023-11-12 11:40 ? 次閱讀

最近一工程師向我反饋一個問題,Ta說:我程序會死在這一行,大概是什么原因?

828abfec-803f-11ee-939d-92fbcf53809c.png

以下是Ta所說程序會死的地方,

8295b14a-803f-11ee-939d-92fbcf53809c.png

用過HAL庫的童鞋應該比較熟悉這個函數(shù),它是延時函數(shù)。

82aca7c4-803f-11ee-939d-92fbcf53809c.png

拿到工程代碼后我就開始Debug之旅了,現(xiàn)象確實如Ta所說,剛開始Hal_delay函數(shù)調(diào)用沒問題,但是過了幾秒之后就卡住了。因為該函數(shù)的計時是依賴Systick中斷,這個現(xiàn)象說明Systick中斷進不去了,通過debug模式下Systick中斷服務函數(shù)里加斷點,可以驗證這一點。但是為什么剛開始好好的,后面就進不去中斷了呢?最初我想是不是Systick中斷被關掉了,通過查看Systick寄存器,發(fā)現(xiàn)并沒有,Systick依然在計時并且中斷使能也沒有關。

程序里初始化時開啟了RTC中斷,周期是1s,Systick中斷周期是1ms。剛開始時這兩個中斷都能進,幾秒之后這倆中斷就都進不去了。

82b81e9c-803f-11ee-939d-92fbcf53809c.png

這個現(xiàn)象看起來確實挺詭異,因為給我的代碼里糅雜了很多業(yè)務代碼,寫的也有點亂,看的我很煩躁,后來還是靜下心來仔細的分析,找到了問題所在。

原因是這樣:Ta在RTC的中斷服務函數(shù)里,在某個分支函數(shù)里調(diào)用了Hal_delay函數(shù)。因為RTC的中斷優(yōu)先級和Systick中斷優(yōu)先級一樣,所以Systick中斷就進不去了,導致Hal_delay函數(shù)也就執(zhí)行不過去了,所以就出現(xiàn)了所謂的卡死現(xiàn)象。之所以剛開始沒問題,過了幾秒才出問題,是因為剛開始前幾秒的RTC中斷服務函數(shù)里沒有進到調(diào)用Hal_delay函數(shù)的那個分支處理里,Ta是在初始化幾秒之后,設置了一個標志位,導致后來RTC中斷處理里調(diào)用了Hal_delay函數(shù)。

問題找到了,如何解決呢?

最簡單的方法是,把Systick和RTC的中斷優(yōu)先級設置不一樣,讓Systick優(yōu)先級比RTC高一點,這樣可以保證Systick中斷能夠打斷RTC中斷,從而不會卡死。

ARM Cortex MCU的中斷控制器英文名叫做NVIC,Nested Vectored Interrupt Controller,翻譯過來就是嵌套向量中斷控制器,所謂中斷嵌套是指當正在執(zhí)行一個中斷服務程序時,這時如果來了優(yōu)先級更高的中斷,新來的中斷會打斷原來還沒有處理完的中斷服務程序,等新中斷處理完畢之后再回到原中斷服務繼續(xù)處理。

Cortex-M0/M0+中斷優(yōu)先級設置非常簡單,只需要通過CMSIS標準接口函數(shù)__NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)即可完成,優(yōu)先級只有4個,分別為0、1、2、3,數(shù)字越小優(yōu)先級越高。

問題解決了,總結不能少:

1)我當時找這個問題花了較長時間,反思一下,其實是可以更快的定位問題的。當卡死在Hal_delay函數(shù)時,首先應該去分析是哪里調(diào)用這個函數(shù)導致卡死的,因為工程里調(diào)用的地方有好多處,可以通過在可能出現(xiàn)問題的調(diào)用前給一個全局變量賦不同的值,卡住時看全局變量,就可以定位到是從哪里進去的。這樣倒著往前推,可以更快的定位問題。

2)通常情況下中斷服務函數(shù)應該盡可能的短,最好不要在中斷里做延時之類的占用CPU時間長的工作。

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

    關注

    31

    文章

    5357

    瀏覽量

    120614
  • 函數(shù)
    +關注

    關注

    3

    文章

    4337

    瀏覽量

    62730
  • Systick
    +關注

    關注

    0

    文章

    62

    瀏覽量

    13119

原文標題:中斷里面這樣延時,有點猛~

文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    力源電池-紐扣電池系列:CR系列鋰扣式產(chǎn)品介紹

    深圳鴻合智遠|力源電池-紐扣電池系列:CR系列鋰扣式產(chǎn)品介紹
    的頭像 發(fā)表于 12-02 11:03 ?187次閱讀
    力源電池-紐扣電池系列:CR系列鋰<b class='flag-5'>猛</b>扣式產(chǎn)品介紹

    延時開關怎么調(diào)時間長短

    延時開關是一種常見的電子控制設備,廣泛應用于各種場合,如照明、空調(diào)、風扇等。它可以根據(jù)用戶的需求,設定一定的延時時間,實現(xiàn)自動控制。 一、延時開關的工作原理 延時開關的基本組成
    的頭像 發(fā)表于 08-19 15:46 ?1756次閱讀

    延時開關上l和a是什么意思

    延時開關是一種常見的電子控制元件,廣泛應用于各種電子設備和系統(tǒng)中。它可以實現(xiàn)對電路的自動控制,使電路在一定的延時后自動接通或斷開。在延時開關的標識中,L和A通常代表不同的意義。 一、延時
    的頭像 發(fā)表于 08-19 15:45 ?6331次閱讀

    2024這款AIPC迷你主機有點

    。未來,隨著AI技術的不斷發(fā)展和普及,我們有理由相信,像華碩PN65這樣的高性能迷你主機將會更加普及,成為更多用戶的心儀之選。 不管你是玩游戲,直播,視頻剪輯還是正常辦公或者你正在尋找一款既小巧又強大的電腦主機,那么華碩PN65絕對值得你深入了解和考慮。
    的頭像 發(fā)表于 07-30 17:35 ?583次閱讀
    2024這款AIPC迷你主機<b class='flag-5'>有點</b><b class='flag-5'>猛</b>

    實現(xiàn)一個ns級的延時函數(shù),延時時間不可控的原因?

    現(xiàn)在要實現(xiàn)一個ns級的延時函數(shù),用nop指令已經(jīng)調(diào)試完成,然而問題在于這個延時函數(shù)經(jīng)常被中斷,導致延時時間不可控,我在延時函數(shù)前后加了 p
    發(fā)表于 06-26 06:50

    esp32s3在中斷里面printf會重啟,怎么才能在中斷里面printf?

    我在定時中斷里面 想打印信息,發(fā)現(xiàn)printf 會導致重啟 應該是 中斷堆棧 和 任務堆棧 沖突的問題把 我想實時獲取 中斷的打印信息,不想通過 消息隊列 在任務級別打印 應該怎么處理
    發(fā)表于 06-12 06:30

    FreeRtos能否直接讀取Rtos的系統(tǒng)時鐘計數(shù)器來實現(xiàn)延時統(tǒng)計,改如何讀取呢?

    關于200~300uS的延時 1 能否直接讀取Rtos的 系統(tǒng)時鐘計數(shù)器來 實現(xiàn)延時統(tǒng)計,改如何讀取呢? 2 通過獨立的定時器中斷來實現(xiàn),這樣感覺
    發(fā)表于 04-29 08:40

    在stm32使用freertos時首先要移植startup.s文件將里面中斷函數(shù)名對接一下,為什么我找不到?

    問題是這樣的,我看了別人的教程在stm32使用freertos時首先要移植startup.s文件將里面中斷函數(shù)名對接一下。 但是我在FreeRTOS官網(wǎng)下載的源碼里面的demo歷程,
    發(fā)表于 04-29 07:32

    請問ucos-III中斷保護放在中斷回調(diào)函數(shù)還是中斷里面?

    請教下ucos-III 中斷保護放在中斷回調(diào)函數(shù)還是中斷里面? 1. 中斷函數(shù) void DMA2_Stream6_IRQHandler(
    發(fā)表于 04-23 07:44

    新火種AI|如何看待AI蹭熱點,合成假新聞?官方:治療AI亂象,務必下

    針對AI造謠亂象,官媒明確發(fā)聲:欲去“沉疴”還需“藥”。
    的頭像 發(fā)表于 04-19 21:59 ?245次閱讀
    新火種AI|如何看待AI蹭熱點,合成假新聞?官方:治療AI亂象,務必下<b class='flag-5'>猛</b>藥

    請問使能TIM的中斷能放在IRQHandler里面嗎?

    RT, 比如運行完這次中斷就要disable這個TIM的中斷,能在IRQHandler里面直接用HAL設置Disable嗎? 還是說要在IRQHandler和Callback函數(shù)之外才能關閉?
    發(fā)表于 04-09 07:21

    Systick到底是用作延時好還是用作定時好?都有什么優(yōu)缺點?

    功能,作基礎定時用,而不建議用作延時功能,方便后面程序移植. 最好有個定論,方便后面程序的移植,不能各自玩各自的,一個公司里面寫程序的風格和標準需要統(tǒng)一。 想問下各位,Systick到底是用作延時好?還是用作定時好,都有什么
    發(fā)表于 04-08 07:37

    信號通過ADC DMA DAC進行轉(zhuǎn)換,非空狀態(tài)下觸發(fā)定時器中斷進行延時,中斷結束還會繼續(xù)DMA轉(zhuǎn)換嗎?

    信號通過ADC DMA DAC進行轉(zhuǎn)換,其中需要延時 我的想法是 把ADC數(shù)據(jù)存入FIFO,然后根據(jù)DMA_GetFIFOStatus()函數(shù)判斷FIFO狀態(tài),非空狀態(tài)下觸發(fā)定時器中斷進行延時,
    發(fā)表于 04-03 08:06

    時間繼電器通電延時與斷電延時的區(qū)別

    時間繼電器通電延時與斷電延時的區(qū)別? 時間繼電器是一種常用的控制設備,可用于各種延時應用。常見的時間繼電器主要包括通電延時繼電器和斷電延時
    的頭像 發(fā)表于 02-04 13:43 ?4799次閱讀

    延時繼電器工作原理 延時繼電器的接法和用途

    延時繼電器是一種常用的電子設備,它能夠延遲觸發(fā)繼電器的動作,從而在電路中產(chǎn)生一定的延時效果。它在工業(yè)自動化控制、電氣設備保護、通信系統(tǒng)和家庭電器控制等領域中廣泛應用。 一、延時繼電器的工作原理
    的頭像 發(fā)表于 01-19 11:24 ?7612次閱讀