【发布时间】: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是愚蠢的,尤其是是高优先级的。在执行较高优先级的中断期间禁用较低优先级的中断有什么意义? -
但一般来说,禁用中断会阻止它被触发,但不会在流程中削弱它。
-
这是用于什么平台的?