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)
我所知道的每个操作系统的方式是将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)
现在,您不必担心可能会失去同步的计数器等.
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |