加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

防止嵌套调用

发布时间:2020-12-16 09:42:15 所属栏目:百科 来源:网络整理
导读:我有一个禁用中断的功能,但问题是,如果我禁用它们并且我调用一个也禁用/启用它们的功能,它们会过早地重新启用.以下逻辑是否足以阻止这种情况? static volatile int IrqCounter = 0;void EnableIRQ(){ if(IrqCounter 0) { IrqCounter--; } if(IrqCounter ==
我有一个禁用中断的功能,但问题是,如果我禁用它们并且我调用一个也禁用/启用它们的功能,它们会过早地重新启用.以下逻辑是否足以阻止这种情况?

static volatile int IrqCounter = 0;

void EnableIRQ()
{
    if(IrqCounter > 0)
    {
        IrqCounter--;
    }

    if(IrqCounter == 0)
    {
        __enable_irq();
    }
}

void DisableIRQ()
{
    if(IrqCounter == 0)
    {
        __disable_irq();
    }

    IrqCounter++;
}

解决方法

假设您有一个系统,当中断被禁用时您无法更改上下文,那么您所拥有的就是好的,假设您在调用enable()时会仔细跟踪.

在您在下面的注释中描述的用法中,您计划在中断服务例程中使用这些部分.您的主要用途是阻止高优先级中断运行ISR的某个部分.

请注意,您必须考虑这些嵌套ISR的堆栈深度,因为在从中断返回之前启用中断时,您将在ISR中启用中断.

关于其他答案:enable()缺乏线程安全性(由于if(IrqCounter> 0))并不重要,因为任何时候你在enable()上下文中都会因为中断而禁用开关不在. (除非由于某种原因你有不匹配的禁用/启用对,在这种情况下你还有其他问题.)

我唯一的建议是将ASSERT添加到启用而不是运行时检查,因为你永远不应该启用你没有禁用的中断.

void EnableIRQ()
{
  ASSERT(IrqCounter != 0)  //should never be 0,or we'd have an unmatched enable/disable pair

  IrqCounter--;  //doesn't matter that this isn't thread safe,as the enable is always called with interrupts disabled.

  if(IrqCounter == 0)
  {
      __enable_irq();
  }
}

我更喜欢你在save()上列出的技术;禁用();恢复();技术,因为我不喜欢每次使用中断时都要跟踪操作系统的数据.但是,您必须知道何时(直接或间接)从ISR调用enable().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读