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时间长的工作。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5031

    浏览量

    117736
  • 函数
    +关注

    关注

    3

    文章

    3881

    浏览量

    61310
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12950

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

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

收藏 人收藏

    评论

    相关推荐

    请问ucos-III中断保护放在中断回调函数还是中断里面?

    请教下ucos-III 中断保护放在中断回调函数还是中断里面? 1. 中断函数 void DMA2_Stream6_IRQHandler(
    发表于 04-23 07:44

    请问使能TIM的中断能放在IRQHandler里面吗?

    RT, 比如运行完这次中断就要disable这个TIM的中断,能在IRQHandler里面直接用HAL设置Disable吗? 还是说要在IRQHandler和Callback函数之外才能关闭?
    发表于 04-09 07:21

    信号通过ADC DMA DAC进行转换,非空状态下触发定时器中断进行延时中断结束还会继续DMA转换吗?

    信号通过ADC DMA DAC进行转换,其中需要延时 我的想法是 把ADC数据存入FIFO,然后根据DMA_GetFIFOStatus()函数判断FIFO状态,非空状态下触发定时器中断进行延时
    发表于 04-03 08:06

    延时器的接线方法有哪些

    延时器是一种常用的电子元器件,用于在电路中引入延时。通过控制电流或电压的幅度、时间或波形,延时器可以实现多种电路功能。在接线过程中,正确的方法对于确保延时器的正常工作和延长其使用寿命至
    的头像 发表于 12-13 18:12 809次阅读

    如何使RC延时电路无延时呢?

    达到这个目标。 1.使用电子开关: 一种方法是使用电子开关来直接控制电路的通断。当开关关闭时,输入信号可以直接通过电路,从而使得输出信号无延时这样做的好处是简单易行,且能够实现精确的无延时。 2.使用快速RC组件: 在RC
    的头像 发表于 11-20 17:05 529次阅读

    单片机的默认中断优先级

    上一篇教程我们简单认识和学习了中断怎么使用,认识了单片机里面的几种中断源,学习了怎么配置中断的设置
    的头像 发表于 11-01 11:30 844次阅读
    单片机的默认<b class='flag-5'>中断</b>优先级

    单重中断与多重中断介绍

    单重中断与多重中断 •单重中断在CPU执行中断服务程序的过程中不能被打断。当有新的更高优先级的中断发生时,正在执行的
    的头像 发表于 10-30 16:46 1641次阅读
    单重<b class='flag-5'>中断</b>与多重<b class='flag-5'>中断</b>介绍

    RA2E1定时器带死区互补PWM中断延时问题分析

    RA2E1定时器带死区互补PWM中断延时问题分析
    的头像 发表于 10-27 10:56 397次阅读
    RA2E1定时器带死区互补PWM<b class='flag-5'>中断</b><b class='flag-5'>延时</b>问题分析

    请问单片机中断延时有什么区别?

    单片机中断延时有什么区别?​
    发表于 10-20 08:16

    MCU的中断函数里面为什么不能用延时函数?

    如果在中断函数里面加了延时函数会有什么后果
    发表于 10-15 09:27

    时间中断函数的编程示例

    在以下示例中,将读取延时中断 OB (OB20) 的状态,设置新的延时并启动或禁用 OB20。
    的头像 发表于 09-01 09:47 630次阅读
    时间<b class='flag-5'>中断</b>函数的编程示例

    请问Function_Define.h里面的TIMER_DIV512_VALUE_1s延时如何调用?

    Function_Define.h里面的TIMER_DIV512_VALUE_1s延时如何调用?需要做什么设置吗?晶振已经有设置为FOSC_160000了,为什么还是没效果?
    发表于 09-01 07:54

    SIMATIC S7-1500 PLC延时中断组织块及其应用简析

    延时中断组织块(如OB20)可实现延时执行某些操作,调用“SRT_DINT”指令时开始计时延时时间(此时开始调用相关延时中断)。
    的头像 发表于 08-17 09:32 1371次阅读
    SIMATIC S7-1500 PLC<b class='flag-5'>延时中断</b>组织块及其应用简析

    基于单片机的外部中断实验 中断系统知识介绍

    在单片机中有两个重要的概念分别叫做中断中断系统,那么他们分别又代表什么意义呢?当单片机CPU正在运行主程序时外界发生了紧急事件请求,要求单片机停止当前的工作,而去处理这个紧急事件,处理完成之后,在回到主程序原来的地方继续执行,这样
    的头像 发表于 07-26 17:23 1756次阅读
    基于单片机的外部<b class='flag-5'>中断</b>实验 <b class='flag-5'>中断</b>系统知识介绍

    PLC中断是什么?

    plc这样理解中断功能,在理解中断时,首先要清楚plc的运算周期或者说是扫描周期,有必要说下plc顺控循环执行的流程,这是理解中断的前提,必须要掌握,分为三部分,输入处理、程序处理、输
    的头像 发表于 05-12 09:47 461次阅读
    PLC<b class='flag-5'>中断</b>是什么?