我具有以下实现的功能:
void func (uint8 index, uint8 status)
{
if (status == 1)
{
myArrayOfStructures[index].status = 1;
}
else if (status == 0)
{
myArrayOfStructures[index].status = 0;
}
else
{
/* Nothing */
}
}
注意:myArrayOfStructures是文件上的全局变量。
我认为此函数是可重入的,因为通过以下分析可以将其参数传递通过堆栈进行:
函数的2个参数在函数调用时被压入堆栈。
如果该函数本身被另一个OS任务中断,则该参数将第二次推入堆栈。
因此,函数的2个实例是“独立的”,因为每个实例在堆栈中都有其自己的参数集。
直到我使用某个编译器选项优化了此文件的速度。
经过优化后,我发现这些参数的传递是通过寄存器完成的(我知道编译器有权这样做(寄存器分配))。但是,此优化使此函数不可重入。
所以,我的问题是
请把您的答案推荐给我。
非常感谢。
最佳答案
无论编译器选择哪种参数传递模式,您的函数都是可重入的。
尽管依靠全局状态进行正确的执行会破坏重入,但是仅访问全局状态并不一定会使您的函数不可重入。特别是,如果像函数中那样从不读取全局变量,则代码是可重入的,因为其执行不依赖于全局状态。
就通过寄存器传递参数而言,上下文切换也会保存所有寄存器的内容,因此无论参数传递模式如何,这些值都是中断安全的。
关于c - 此功能是否被视为可重入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41440680/