我具有以下实现的功能:

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/

    10-08 23:47