伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

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

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

3天內不再提示

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

嵌入式情報局 ? 來源:TopSemic嵌入式 ? 2023-11-12 11:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

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

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

原因是這樣: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

    文章

    5612

    瀏覽量

    130261
  • 函數
    +關注

    關注

    3

    文章

    4419

    瀏覽量

    67726
  • Systick
    +關注

    關注

    0

    文章

    67

    瀏覽量

    14002

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    一文看懂PCIe中斷機制

    PCIe 中斷機制主要分為兩類:一類是繼承自傳統 PCI 的 物理中斷線(INTx)中斷,通過硬件引腳觸發;另一類是 MSI(Message Signaled Interrupt)中斷
    的頭像 發表于 03-11 09:35 ?399次閱讀
    一文看懂PCIe<b class='flag-5'>中斷</b>機制

    如何在Zephyr RTOS中實現延時和計時函數

    在實時操作系統(RTOS)中,時間管理是核心功能之一。無論是任務調度、超時控制,還是周期性事件,延時和計時機制都扮演著至關重要的角色。Zephyr RTOS作為一個輕量級、模塊化的開源系統,提供了
    的頭像 發表于 12-26 10:32 ?5769次閱讀
    如何在Zephyr RTOS中實現<b class='flag-5'>延時</b>和計時函數

    交流延時電源

    交流延時電源
    的頭像 發表于 12-25 12:57 ?444次閱讀
    交流<b class='flag-5'>延時</b>電源

    RISC-V怎么實現核間中斷?核心本地中斷控制器(CLINT)深度解析

    全稱為Core Local Interruptor(核心本地中斷控制器),是 RISC-V 特權架構規范(Privileged Architecture Specification)中明確定義的內建
    的頭像 發表于 12-13 14:06 ?2515次閱讀
    RISC-V怎么實現核間<b class='flag-5'>中斷</b>?核心本地<b class='flag-5'>中斷</b>控制器(CLINT)深度解析

    mcu短時間內發生多次中斷,如何解決中斷丟失問題呢?

    理論上可以緩存2次中斷標志? 網友的回復總結: 使用異步處理的方式 ——中斷來了之后,只做中斷的記錄,不做中斷服務的處理。 就好比我們寫單片機程序,在
    發表于 12-05 07:07

    使用系統定時器SysTick來實現精確延時微秒和毫秒函數

    );//定時1ms即SysTick定時器每1ms中斷一次,如果我們定義全局變量,然后在中斷函數中,讓此變量遞減,而在延時函數中,一直判斷此變量是否減到了0,那么這樣就實現了一個
    發表于 11-20 07:12

    感知再進化,新增“觸發延時”功能!

    ——「觸發延時」正式上線!這不僅是一個功能的增加,更是對產品穩定性和場景適用性的一次深刻優化。一、亮點速覽什么是“觸發延時”功能?簡單來說,“觸發延時”是指在雷達檢測到
    的頭像 發表于 11-10 11:05 ?876次閱讀
    感知再進化,新增“觸發<b class='flag-5'>延時</b>”功能!

    求助,關于蜂鳥mcu外部中斷的問題求解

    是0x0c20_0004,只有32個中斷,如果想看后面的應該是啥地址呢...我自己試了一下發現后面都是0,有點疑惑,而且我的pending一直不變...不知道到底是哪個中斷觸發的,求大佬指點一二,小弟不勝感激。
    發表于 11-07 07:14

    【NCS隨筆】如何進入system_off深度睡眠模式以及配置GPIO中斷喚醒

    【NCS隨筆】如何進入system_off深度睡眠模式以及配置GPIO中斷喚醒 本文章主要是講解NCS下面使用nRF54L15如何進入system_off模式,以及如何配置通過按鍵喚醒 一、如何進
    的頭像 發表于 09-29 00:56 ?852次閱讀
    【NCS隨筆】如何進入system_off深度睡眠模式以及配置GPIO<b class='flag-5'>中斷</b>喚醒

    探頭的延時介紹

    探頭的延時是指信號從被測點傳輸到示波器輸入端的時間間隔,即信號經過探頭的探針、傳輸電纜、內部電路等路徑后,到達示波器采樣系統的總時間延遲,(以下討論低速信號情景,忽略示波器通道間ps級的延時誤差)。不同型號的探頭延時存在差異,尤
    的頭像 發表于 09-17 17:32 ?951次閱讀
    探頭的<b class='flag-5'>延時</b>介紹

    認識探頭的延時

    探頭的延時是指信號從被測點傳輸到示波器輸入端的時間間隔,即信號經過探頭的探針、傳輸電纜、內部電路等路徑后,到達示波器采樣系統的總時間延遲,(以下討論低速信號情景,忽略示波器通道間ps級的延時誤差
    的頭像 發表于 08-26 17:04 ?849次閱讀
    認識探頭的<b class='flag-5'>延時</b>

    為什么中斷回調函數中不能使用接收中斷開啟函數?

    我看(書是基于stm32f407編寫)書上說在串口接收中斷回調函數里面不能使用 接收中斷開啟函數,書上是利用自己創建了空閑中斷回調函數,在這里面
    發表于 05-28 07:19

    第六章 外部中斷

    本章介紹W55MH32的IO口作為外部中斷輸入的使用。先闡述了NVIC(嵌套向量中斷控制器) 的結構、寄存器、優先級及相關函數,再說明EXTI(外部中斷和事件控制器)的功能。框圖及IO口與
    的頭像 發表于 05-26 16:27 ?1585次閱讀
    第六章 外部<b class='flag-5'>中斷</b>

    為什么中斷回調函數中不能使用接收中斷開啟函數?

    我看(書是基于stm32f407編寫)書上說在串口接收中斷回調函數里面不能使用 接收中斷開啟函數,書上是利用自己創建了空閑中斷回調函數,在這里面
    發表于 04-22 08:19

    示波器差分探頭延時測量:從理論到工程實踐的關鍵解析

    示波器差分探頭延時的測量是高速信號分析中的重要環節。通過時域測量法或頻域測量法,可以準確計算探頭的延時,從而優化測量結果。在實際應用中,了解影響延時的因素并采取相應措施,可以進一步提高測量的準確性和可靠性。
    的頭像 發表于 04-14 16:59 ?1093次閱讀
    示波器差分探頭<b class='flag-5'>延時</b>測量:從理論到工程實踐的關鍵解析