我有一个具有以下实现的函数:
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 个实例是“独立的”,因为每个实例在堆栈中都有自己的一组参数。
直到我使用某个编译器选项优化了这个文件的速度。
经过优化,我发现这些参数的传递是通过寄存器完成的(我知道编译器有权做这样的事情(寄存器分配))。但是这种优化使得这个函数不可重入。
所以,我的问题是
请给我引用您的答案。
非常感谢。
最佳答案
无论编译器选择何种参数传递模式,您的函数都是可重入的。
虽然依赖全局状态来正确执行会破坏可重入性,但简单地访问全局状态并不一定会使您的函数不可重入。特别是,如果您从不读取全局变量(如函数中的情况),则您的代码是可重入的,因为它的执行不依赖于全局状态。
就通过寄存器传递参数而言,上下文切换也会保存所有寄存器的内容,因此无论参数传递模式如何,值都是中断安全的。
https://stackoverflow.com/questions/41440680/