gpt4 book ai didi

C 优化器消除意外变量

转载 作者:行者123 更新时间:2023-11-30 15:02:28 25 4
gpt4 key购买 nike

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 ,应该可以防止它被优化,但从技术上讲它不是 volatile 的。我在这里缺少什么?我应该在 GetSysTick() 的返回值上使用 volatile 吗? (不确定这是否合法)

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

static volatile uint32_t systick=0;

uint32_t GetSysTick(void)
{
return systick;
}

最佳答案

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

关于C 优化器消除意外变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41043777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com