【问题标题】:Does disabling an interrupt A from interrupt B stops its execution without waiting for A to end?从中断 B 中禁用中断 A 是否会在不等待 A 结束的情况下停止其执行?
【发布时间】:2017-01-22 13:21:53
【问题描述】:

我有一种情况,当我的中断被禁用时,我相信中断的代码直到最后才执行。是否有可能在以下代码中, variableA 和 variableB 在轮到它们打印时会有所不同? 至少,对于某些打印,它们可能会有所不同(如果例程在中断期间执行)。但是当中断被禁用后最终解决时,两个变量应该始终具有相同的值。

myInterrupt 在一个固定的采样时间被调用,而 someRoutine 在另一个采样率被调用。在程序中的某个点设置了外部条件。

int variableA = 0;
int variableB = 0;

void myInterrupt_A(void){
    variableA++;
    /*
     stuff
    */
    variableB++; // Will this instruction be executed if the interrupt is disabled before its execution?
}

void someRoutine(void){
 if some_condition
    Enable_myInterruptA();
 else
    Disable_myInterruptA();
 end
    /*
      stuff
    */
    printf("variableA= %d\n, variableB= %d\n", variableA, variableB)
}

如果“someRoutine”是一个更高优先级的中断呢?

【问题讨论】:

  • 如果中断函数发生在准备调用printf的过程中,在一个变量的副本被压入堆栈之后,但在另一个变量的副本被压入堆栈之前,则@987654323 @ 会输出不同的值。
  • printf 永远不会在中断过程中执行,并且调用者在中断服务期间无法禁用中断,因此无法停止中断处理程序的运行直至完成。
  • 重新编辑,从中断中调用printf 是愚蠢的,尤其是是高优先级的。在执行较高优先级的中断期间禁用较低优先级的中断有什么意义?
  • 但一般来说,禁用中断会阻止它被触发,但不会在流程中削弱它。
  • 这是用于什么平台的?

标签: c embedded


【解决方案1】:

中断是导致中断服务例程 (ISR) 运行完成的事件。禁用中断不会中止正在进行的 ISR - 它只是防止进一步的中断。中断和ISR不是一回事;您只是禁用中断。

如果中断 B 具有更高的优先级并且抢占了中断 A,我可能想通过修改堆栈来中止中断 A,以便从 B 返回不会导致上下文切换到 A,而是代码被抢占A - 但你真的不想这样做 - 它过于复杂且针对特定目标。如果您的中断处理有问题,几乎肯定会有更简单的解决方案(比如好的设计!)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多