C优化器消除了意外变量

时间:2016-12-08 16:05:26

标签: c optimization volatile

C编译器似乎正在优化我不期望的变量。有问题的代码如下:

uint32_t GetSysTick(void);

uint32_t timeout = GetSysTick() + 9000;  //9sec
while(len && (GetSysTick() < timeout))
{
    ... some code that will decrement len
}

编译器将优化“超时”变量。通常,一旦len到达零,while循环将退出但是如果一旦systick超过超时,则进程花费的时间比预期的要长,那么它也应该退出,当然如果超时被优化,则不会发生这种情况。我确定我是否将超时定义为volatile,以防止它被优化掉,但从技术上讲它不是一个易失性的。我在这里错过了什么? 我应该在GetSysTick()的返回值上使用volatile吗? (不确定这是否合法)

为了完整性,这里是GetSysTick和systick的声明。两者都在另一个C文件中。 systick在中断时每毫秒递增一次。

static volatile uint32_t systick=0;

uint32_t GetSysTick(void)
{
  return systick;
}

1 个答案:

答案 0 :(得分:1)

因此,在进一步调查我的编译器后,我发现我没有使用最新版本。显然我在gnu arm C编译器版本5.2上一旦我更新到最新版本5.4我的超时变量没有被优化出来。这里的课程总是检查工具的更新。感谢大家的意见和建议。感谢@JohnBollinger花时间用他的设置来测试它。