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

    文章

    5619

    浏览量

    130410
  • 函数
    +关注

    关注

    3

    文章

    4422

    浏览量

    67836
  • Systick
    +关注

    关注

    0

    文章

    67

    浏览量

    14016

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一文看懂PCIe中断机制

    PCIe 中断机制主要分为两类:一类是继承自传统 PCI 的 物理中断线(INTx)中断,通过硬件引脚触发;另一类是 MSI(Message Signaled Interrupt)中断
    的头像 发表于 03-11 09:35 492次阅读
    一文看懂PCIe<b class='flag-5'>中断</b>机制

    Linux中断“搬家”指南:从应用到操作,手把手教你转移中断核心(RK3588)

    在高性能服务器或嵌入式设备(如瑞芯微 RK3588)上,中断处理的 CPU 核心绑定是优化性能的关键手段之一。比如网卡中断默认绑在小核上时,高网络负载会导致小核过载,而大核却“闲置”;通过中断转移,把网卡
    的头像 发表于 02-04 16:20 916次阅读
    Linux<b class='flag-5'>中断</b>“搬家”指南:从应用到操作,手把手教你转移<b class='flag-5'>中断</b>核心(RK3588)

    如何在Zephyr RTOS中实现延时和计时函数

    在实时操作系统(RTOS)中,时间管理是核心功能之一。无论是任务调度、超时控制,还是周期性事件,延时和计时机制都扮演着至关重要的角色。Zephyr RTOS作为一个轻量级、模块化的开源系统,提供了
    的头像 发表于 12-26 10:32 6094次阅读
    如何在Zephyr RTOS中实现<b class='flag-5'>延时</b>和计时函数

    交流延时电源

    交流延时电源
    的头像 发表于 12-25 12:57 528次阅读
    交流<b class='flag-5'>延时</b>电源

    RISC-V怎么实现核间中断?核心本地中断控制器(CLINT)深度解析

    全称为Core Local Interruptor(核心本地中断控制器),是 RISC-V 特权架构规范(Privileged Architecture Specification)中明确定义的内建
    的头像 发表于 12-13 14:06 2633次阅读
    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 991次阅读
    感知再进化,新增“触发<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 932次阅读
    【NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO<b class='flag-5'>中断</b>唤醒

    瑞萨RA系列MCU的中断过程介绍

    中断来临的时候会最先经过IRQ寄存器,IRQ寄存器检测到中断的时候,会向中央处理嵌套向量中断控制器NVIC发送中断信号,当NVIC检测到中断
    的头像 发表于 09-23 09:45 1515次阅读
    瑞萨RA系列MCU的<b class='flag-5'>中断</b>过程介绍

    探头的延时介绍

    探头的延时是指信号从被测点传输到示波器输入端的时间间隔,即信号经过探头的探针、传输电缆、内部电路等路径后,到达示波器采样系统的总时间延迟,(以下讨论低速信号情景,忽略示波器通道间ps级的延时误差)。不同型号的探头延时存在差异,尤
    的头像 发表于 09-17 17:32 999次阅读
    探头的<b class='flag-5'>延时</b>介绍

    认识探头的延时

    探头的延时是指信号从被测点传输到示波器输入端的时间间隔,即信号经过探头的探针、传输电缆、内部电路等路径后,到达示波器采样系统的总时间延迟,(以下讨论低速信号情景,忽略示波器通道间ps级的延时误差
    的头像 发表于 08-26 17:04 900次阅读
    认识探头的<b class='flag-5'>延时</b>

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

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

    第六章 外部中断

    本章介绍W55MH32的IO口作为外部中断输入的使用。先阐述了NVIC(嵌套向量中断控制器) 的结构、寄存器、优先级及相关函数,再说明EXTI(外部中断和事件控制器)的功能。框图及IO口与
    的头像 发表于 05-26 16:27 1671次阅读
    第六章 外部<b class='flag-5'>中断</b>