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

    文章

    5451

    浏览量

    125573
  • 函数
    +关注

    关注

    3

    文章

    4388

    浏览量

    65397
  • Systick
    +关注

    关注

    0

    文章

    64

    浏览量

    13665

原文标题:中断里面这样延时,有点猛~

文章出处:【微信号:嵌入式情报局,微信公众号:嵌入式情报局】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为什么中断回调函数中不能使用接收中断开启函数?

    我看(书是基于stm32f407编写)书上说在串口接收中断回调函数里面不能使用 接收中断开启函数,书上是利用自己创建了空闲中断回调函数,在这里面
    发表于 05-28 07:19

    为什么中断回调函数中不能使用接收中断开启函数?

    我看(书是基于stm32f407编写)书上说在串口接收中断回调函数里面不能使用 接收中断开启函数,书上是利用自己创建了空闲中断回调函数,在这里面
    发表于 04-22 08:19

    【S32K 进阶之旅】如何使用 S32K3 PIT 定时器实现精准延时

    周期中断定时器(PeriodicInterruptTimer,PIT)模块顾名思义,就是通过计时行为引发周期性中断事件的触发器。本文基于S32K312开发板实现延时功能,在此之前先简单介绍下PIT
    的头像 发表于 03-10 16:33 ?897次阅读
    【S32K 进阶之旅】如何使用 S32K3 PIT 定时器实现精准<b class='flag-5'>延时</b>?

    STM32C031C6在按键中断处理程序中使用HAL_Delay()延时函数,程序则无法运行怎么解决?

    测试STM32C031C6开发板的长短按键,在按键中断处理程序中使用HAL_Delay()延时函数,程序则无法运行,类似进入了死循环,于是则添加了延时函数如下: /[i
    发表于 03-07 06:50

    断电延时继电器的应用

    延时继电器作为一种重要的电气控制元件,在现代电气系统中发挥着不可或缺的作用。其基于一个或多个可调的计时器电路,通过与继电器相连的控制电路,实现了在电路中定时闭合或断开控制的功能。 一、工作原理 延时
    的头像 发表于 02-07 16:07 ?1350次阅读

    串口中断是内部中断还是外部中断,串口中断是怎么触发的

    串口中断通常被视为外部中断。虽然串口控制器(如USART、UART等)可能集成在微控制器或处理器的内部,但从中断的角度来看,串口中断是由处理器外部的通信事件触发的。这些事件包括数据的接
    的头像 发表于 01-29 15:03 ?2028次阅读

    延时继电器功能汇总与应用

    延时继电器是一种在电气系统中广泛应用的控制元件,在电路中实现定时闭合或断开控制,为各种应用场景提供灵活的时间管理功能。 通常,聚英延时继电器由一个控制电压引发,该控制电压可以是任何符合电器设备功能
    的头像 发表于 01-17 16:03 ?814次阅读

    延时继电器应用场景

    延时继电器是一种在电气系统中广泛应用的控制元件,通过引入延时功能,实现了在电路中定时闭合或断开控制的重要任务。 延时继电器的工作原理,基于一个或多个可调的计时器电路,2路/4路/8路电路与继电器相连
    的头像 发表于 01-16 16:27 ?783次阅读

    AM1305采样延时很长是哪里的问题?

    在使用AM1305作为电机的相电流采样时候,如果按照20MHz的时钟,256的OSR,输出为16位,那延时就是50ns*256*2=25.6us,这样的采样延时也太长了吧,还是我计算的不对?
    发表于 12-11 08:30

    力源电池-纽扣电池系列:CR系列锂扣式产品介绍

    深圳鸿合智远|力源电池-纽扣电池系列:CR系列锂扣式产品介绍
    的头像 发表于 12-02 11:03 ?945次阅读
    力源电池-纽扣电池系列:CR系列锂<b class='flag-5'>猛</b>扣式产品介绍

    ADS1292R读取spi总线,有延时会读取数据出错,怎么回事?

    ADS1292R读取spi总线,当有延时读取数据出错 (1)ADS1292R 2mS 定时采样中断一次,通知主控去读取数据 (2)当主控去SPI读取数据有延时,如500uS,读出来的数据有会出现错误
    发表于 11-29 14:46

    关于ADS1120延时的疑问求解

    再请教个关于ADS1120延时,我这样计算是不是正确: 在9.1.6的示例中,有这样一句 Delay for a minimum of 50 μs + 32 · t(CLK); 我用的是正常
    发表于 11-26 06:49

    FPGA延时Verilog HDL实现

    可以在任意时刻启动,可以重复启动,延时时长可调,单位可切换(ms/us),在50MHz时钟下的延时范围是1ms-85899ms/1us-85899us。
    的头像 发表于 11-05 11:26 ?927次阅读

    光控延时开关电路的结构是什么

    光控延时开关电路是一种利用光信号来控制电路的通断和延时功能的电子设备,广泛应用于自动照明、安全监控、智能家居等领域。这种电路的核心在于能够根据环境光线的变化来自动开启或关闭电路,以及在特定条件下实现
    的头像 发表于 09-20 10:32 ?1045次阅读

    stm32怎样触发软件中断

    了解STM32中断系统 STM32微控制器具有丰富的中断系统,包括NVIC(嵌套向量中断控制器)和SYSTICK定时器。NVIC可以处理多达240个中断源,包括外部
    的头像 发表于 09-02 09:32 ?2260次阅读