澄清一个问题假设我们有:静态Button对象:static Button_T sButton = {0};获取Button的函数:void GetButton(Button_T * p_button);从主循环上下文调用ISR ……
有一个隐藏的同步会影响你是否有竞争条件:中断是什么?两种最常见的场景是边缘和水平触发;边沿触发意味着中断将被禁止,直到器件被清零,而电平触发意味着中断将反复重新置位,直到器件被清零。
如果你的代码使用了级别触发的中断,那么你完全省略了这个同步,或者假装sIsPendingISR是掩码&状态标志。在那种情况下,你看起来没问题
如果它是电平触发的,那么它可以在期间重新断言 的 / *更新sButton对象* / 强> ,导致设备处理代码在两个上下文中执行(中断+正常)。大多数设备代码不是为此而设计的。
顺便说一句,有一个名为“ DekkersAssolution ”的软件协议,它提供了一种在没有硬件支持的情况下互斥的通用解决方案。你在这里集成了一个版本。