最近一工程師向我反饋一個問題,Ta說:我程序會死在這一行,大概是什么原因?
以下是Ta所說程序會死的地方,
用過HAL庫的童鞋應該比較熟悉這個函數,它是延時函數。
拿到工程代碼后我就開始Debug之旅了,現象確實如Ta所說,剛開始Hal_delay函數調用沒問題,但是過了幾秒之后就卡住了。因為該函數的計時是依賴Systick中斷,這個現象說明Systick中斷進不去了,通過debug模式下Systick中斷服務函數里加斷點,可以驗證這一點。但是為什么剛開始好好的,后面就進不去中斷了呢?最初我想是不是Systick中斷被關掉了,通過查看Systick寄存器,發現并沒有,Systick依然在計時并且中斷使能也沒有關。
程序里初始化時開啟了RTC中斷,周期是1s,Systick中斷周期是1ms。剛開始時這兩個中斷都能進,幾秒之后這倆中斷就都進不去了。
這個現象看起來確實挺詭異,因為給我的代碼里糅雜了很多業務代碼,寫的也有點亂,看的我很煩躁,后來還是靜下心來仔細的分析,找到了問題所在。
原因是這樣:Ta在RTC的中斷服務函數里,在某個分支函數里調用了Hal_delay函數。因為RTC的中斷優先級和Systick中斷優先級一樣,所以Systick中斷就進不去了,導致Hal_delay函數也就執行不過去了,所以就出現了所謂的卡死現象。之所以剛開始沒問題,過了幾秒才出問題,是因為剛開始前幾秒的RTC中斷服務函數里沒有進到調用Hal_delay函數的那個分支處理里,Ta是在初始化幾秒之后,設置了一個標志位,導致后來RTC中斷處理里調用了Hal_delay函數。
問題找到了,如何解決呢?
最簡單的方法是,把Systick和RTC的中斷優先級設置不一樣,讓Systick優先級比RTC高一點,這樣可以保證Systick中斷能夠打斷RTC中斷,從而不會卡死。
ARM Cortex MCU的中斷控制器英文名叫做NVIC,Nested Vectored Interrupt Controller,翻譯過來就是嵌套向量中斷控制器,所謂中斷嵌套是指當正在執行一個中斷服務程序時,這時如果來了優先級更高的中斷,新來的中斷會打斷原來還沒有處理完的中斷服務程序,等新中斷處理完畢之后再回到原中斷服務繼續處理。
Cortex-M0/M0+中斷優先級設置非常簡單,只需要通過CMSIS標準接口函數__NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)即可完成,優先級只有4個,分別為0、1、2、3,數字越小優先級越高。
問題解決了,總結不能少:
1)我當時找這個問題花了較長時間,反思一下,其實是可以更快的定位問題的。當卡死在Hal_delay函數時,首先應該去分析是哪里調用這個函數導致卡死的,因為工程里調用的地方有好多處,可以通過在可能出現問題的調用前給一個全局變量賦不同的值,卡住時看全局變量,就可以定位到是從哪里進去的。這樣倒著往前推,可以更快的定位問題。
2)通常情況下中斷服務函數應該盡可能的短,最好不要在中斷里做延時之類的占用CPU時間長的工作。
-
寄存器
+關注
關注
31文章
5363瀏覽量
121194 -
函數
+關注
關注
3文章
4346瀏覽量
62977 -
Systick
+關注
關注
0文章
62瀏覽量
13150
原文標題:中斷里面這樣延時,有點猛~
文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
延時開關怎么調時間長短
延時開關上l和a是什么意思
2024這款AIPC迷你主機有點猛
![2024這款AIPC迷你主機<b class='flag-5'>有點</b><b class='flag-5'>猛</b>](https://file1.elecfans.com//web2/M00/FF/6A/wKgZomaos8yASTgtAAB7MDq7c3E23.webp)
實現一個ns級的延時函數,延時時間不可控的原因?
esp32s3在中斷里面printf會重啟,怎么才能在中斷里面printf?
FreeRtos能否直接讀取Rtos的系統時鐘計數器來實現延時統計,改如何讀取呢?
在stm32使用freertos時首先要移植startup.s文件將里面的中斷函數名對接一下,為什么我找不到?
請問ucos-III中斷保護放在中斷回調函數還是中斷里面?
請問使能TIM的中斷能放在IRQHandler里面嗎?
Systick到底是用作延時好還是用作定時好?都有什么優缺點?
信號通過ADC DMA DAC進行轉換,非空狀態下觸發定時器中斷進行延時,中斷結束還會繼續DMA轉換嗎?
CPU中斷程序:從硬件看什么是中斷?
![CPU<b class='flag-5'>中斷</b>程序:從硬件看什么是<b class='flag-5'>中斷</b>?](https://file1.elecfans.com/web2/M00/C6/AF/wKgaomYCQ3KALjkCAAAfjk1FgwI317.png)
評論