防止嵌套调用

Mui*_*uis 3 c embedded interrupt c99

我有一个禁用中断的功能,但问题是,如果我禁用它们并且我调用一个也禁用/启用它们的功能,它们会过早地重新启用.以下逻辑是否足以阻止这种情况?

static volatile int IrqCounter = 0;

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

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

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

    IrqCounter++;
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 5

我所知道的每个操作系统的方式是将IRQ状态保存到局部变量中,然后恢复它.

显然,你的代码有TOCTOU问题 - 如果两个线程同时运行,检查IrqCounter> 0,如果IrqCounter == 1,那么第一个线程将其视为1,第二个线程将其视为1,并且两个都减少柜台.

我肯定会尝试安排这样的事情:

int irq_state = irq_save();

irq_disable();

... do stuff with IRQ's turned off ... 

irq_restore(irq_state);
Run Code Online (Sandbox Code Playgroud)

现在,您不必担心可能会失去同步的计数器等.