91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

中斷里面這樣延時(shí),有點(diǎn)猛~

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

掃碼添加小助手

加入工程師交流群

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

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

以下是Ta所說程序會(huì)死的地方,

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

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

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

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

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

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

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

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

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

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

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

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

問題解決了,總結(jié)不能少:

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

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

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

    關(guān)注

    31

    文章

    5609

    瀏覽量

    130017
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67550
  • Systick
    +關(guān)注

    關(guān)注

    0

    文章

    67

    瀏覽量

    13970

原文標(biāo)題:中斷里面這樣延時(shí),有點(diǎn)猛~

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何在Zephyr RTOS中實(shí)現(xiàn)延時(shí)和計(jì)時(shí)函數(shù)

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

    交流延時(shí)電源

    交流延時(shí)電源
    的頭像 發(fā)表于 12-25 12:57 ?353次閱讀
    交流<b class='flag-5'>延時(shí)</b>電源

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

    全稱為Core Local Interruptor(核心本地中斷控制器),是 RISC-V 特權(quán)架構(gòu)規(guī)范(Privileged Architecture Specification)中明確定義的內(nèi)建
    的頭像 發(fā)表于 12-13 14:06 ?2444次閱讀
    RISC-V怎么實(shí)現(xiàn)核間<b class='flag-5'>中斷</b>?核心本地<b class='flag-5'>中斷</b>控制器(CLINT)深度解析

    mcu短時(shí)間內(nèi)發(fā)生多次中斷,如何解決中斷丟失問題呢?

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

    使用系統(tǒng)定時(shí)器SysTick來實(shí)現(xiàn)精確延時(shí)微秒和毫秒函數(shù)

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

    感知再進(jìn)化,新增“觸發(fā)延時(shí)”功能!

    ——「觸發(fā)延時(shí)」正式上線!這不僅是一個(gè)功能的增加,更是對(duì)產(chǎn)品穩(wěn)定性和場景適用性的一次深刻優(yōu)化。一、亮點(diǎn)速覽什么是“觸發(fā)延時(shí)”功能?簡單來說,“觸發(fā)延時(shí)”是指在雷達(dá)檢測到
    的頭像 發(fā)表于 11-10 11:05 ?757次閱讀
    感知再進(jìn)化,新增“觸發(fā)<b class='flag-5'>延時(shí)</b>”功能!

    求助,關(guān)于蜂鳥mcu外部中斷的問題求解

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

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

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

    探頭的延時(shí)介紹

    探頭的延時(shí)是指信號(hào)從被測點(diǎn)傳輸?shù)绞静ㄆ鬏斎攵说臅r(shí)間間隔,即信號(hào)經(jīng)過探頭的探針、傳輸電纜、內(nèi)部電路等路徑后,到達(dá)示波器采樣系統(tǒng)的總時(shí)間延遲,(以下討論低速信號(hào)情景,忽略示波器通道間ps級(jí)的延時(shí)誤差)。不同型號(hào)的探頭延時(shí)存在差異,尤
    的頭像 發(fā)表于 09-17 17:32 ?862次閱讀
    探頭的<b class='flag-5'>延時(shí)</b>介紹

    認(rèn)識(shí)探頭的延時(shí)

    探頭的延時(shí)是指信號(hào)從被測點(diǎn)傳輸?shù)绞静ㄆ鬏斎攵说臅r(shí)間間隔,即信號(hào)經(jīng)過探頭的探針、傳輸電纜、內(nèi)部電路等路徑后,到達(dá)示波器采樣系統(tǒng)的總時(shí)間延遲,(以下討論低速信號(hào)情景,忽略示波器通道間ps級(jí)的延時(shí)誤差
    的頭像 發(fā)表于 08-26 17:04 ?805次閱讀
    認(rèn)識(shí)探頭的<b class='flag-5'>延時(shí)</b>

    為什么中斷回調(diào)函數(shù)中不能使用接收中斷開啟函數(shù)?

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

    第六章 外部中斷

    本章介紹W55MH32的IO口作為外部中斷輸入的使用。先闡述了NVIC(嵌套向量中斷控制器) 的結(jié)構(gòu)、寄存器、優(yōu)先級(jí)及相關(guān)函數(shù),再說明EXTI(外部中斷和事件控制器)的功能??驁D及IO口與
    的頭像 發(fā)表于 05-26 16:27 ?1502次閱讀
    第六章 外部<b class='flag-5'>中斷</b>

    為什么中斷回調(diào)函數(shù)中不能使用接收中斷開啟函數(shù)?

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

    示波器差分探頭延時(shí)測量:從理論到工程實(shí)踐的關(guān)鍵解析

    示波器差分探頭延時(shí)的測量是高速信號(hào)分析中的重要環(huán)節(jié)。通過時(shí)域測量法或頻域測量法,可以準(zhǔn)確計(jì)算探頭的延時(shí),從而優(yōu)化測量結(jié)果。在實(shí)際應(yīng)用中,了解影響延時(shí)的因素并采取相應(yīng)措施,可以進(jìn)一步提高測量的準(zhǔn)確性和可靠性。
    的頭像 發(fā)表于 04-14 16:59 ?1012次閱讀
    示波器差分探頭<b class='flag-5'>延時(shí)</b>測量:從理論到工程實(shí)踐的關(guān)鍵解析

    【S32K 進(jìn)階之旅】如何使用 S32K3 PIT 定時(shí)器實(shí)現(xiàn)精準(zhǔn)延時(shí)?

    周期中斷定時(shí)器(PeriodicInterruptTimer,PIT)模塊顧名思義,就是通過計(jì)時(shí)行為引發(fā)周期性中斷事件的觸發(fā)器。本文基于S32K312開發(fā)板實(shí)現(xiàn)延時(shí)功能,在此之前先簡單介紹下PIT
    的頭像 發(fā)表于 03-10 16:33 ?1192次閱讀
    【S32K 進(jìn)階之旅】如何使用 S32K3 PIT 定時(shí)器實(shí)現(xiàn)精準(zhǔn)<b class='flag-5'>延時(shí)</b>?