gpt4 book ai didi

c - GCC 优化问题和行为

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:12 24 4
gpt4 key购买 nike

我在 Eclipse 上运行的 gcc 有一个优化问题。我有一个程序在 -O0 优化级别下运行良好,但我需要打开其他优化级别,因为我的软件使用了太多闪存空间。但是当我使用 -O1 优化级别(例如)时,我的代码不再工作,我需要使用 UART 外设管理功能进行如下所述的奇怪修改。

代码在 -O0 下运行良好

void function(...)
{
// Send char one by one on UART peripheral
UART_put_char(...)

// Wait end of transmission on UART
while(end_of_transmission_flag == flase);
}

void UART_TxCompleteCallback()
{
// Change flag state
end_of_transmission_flag = true;
}

修改为-O1 的代码

void function(...)
{
// Send char one by one on UART peripheral
UART_put_char(...)

// Wait end of transmission on UART
while(end_of_transmission_flag == flase)
{
Dummy = Dummy == 0 ? 1 : 0;
}
}


void UART_TxCompleteCallback()
{
// Change flag state
end_of_transmission_flag = true;
}

我想知道为什么 gcc 会强制我做这种修改,我是否需要改变我对代码设计的“思维方式”。或者对这种行为有解释吗?

感谢您的建议。

最佳答案

如评论中所述,您应该将 end_of_transmission_flag 声明为 volatile 以确保编译器在优化期间不会删除循环。通过声明变量 volatile,编译器知道该变量将在其他地方更新。

但要调试您的问题,您不应该一次更改所有带有“-O1”的文件,但您应该尝试移动 -O1 中的一些文件并保留 - 中的一些文件O0.

您还可以在本地禁用 GCC 优化:

#pragma GCC push_options
#pragma GCC optimize ("O0")

// your code

#pragma GCC pop_options

请注意,在嵌入式中,访问硬件寄存器时必须遵守操作顺序。编译优化有时/经常改变顺序。将 volatile 与寄存器地址一起使用可确保操作顺序。

关于c - GCC 优化问题和行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44363300/

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