防止嵌套调用
发布时间: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(). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |