假设您有一个在禁用中断时无法更改上下文的系统,那么您所拥有的一切都很好,假设您仔细跟踪何时调用 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(); disable(); restore();
技术而不是技术,因为我不喜欢每次处理中断时都必须跟踪操作系统的一段数据。但是,您必须注意何时(直接或间接)从 ISR 调用 enable()。