This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 而循环由编译器优化? 问题

Guru**** 2616675 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/768109/while-loops-optimized-out-by-the-compiler-question

器件型号:MSP430F5510

工具/软件:TI C/C++编译器

大家好 、我在程序中看到了一些奇怪的行为、它似乎归结为编译器优化了一些 while 循环? 我的原始代码只有一行(即 loop2、无法正常工作)我 更改 了它 、使其类似于 LOOP1、现在它工作正常、这是由于编译器上的优化级别造成的吗? 这是否是已知的挑战(即结构为空?)

///-------------------- [LOOP1]-----

//这似乎起作用

while (comm_flags & ran_busy_flag){//如果 ran 忙则放弃

    __no_operation()//

///-------------------- [LOOP2]--------------------

//编译器似乎会优化或忽略这一点?

while (comm_flags & ran_busy_flag);

Avance、谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    comm_flags 和 ran_busy_flag 如何更改?

    如果是在中断或其他过程中完成的,则 MCU 无法知道它们将在其控制之外发生变化,因此它假定它们的值*neve*发生变化,并且在运行时已知。

    这就是 volatile 关键字的作用。 这将使编译器知道其他一些进程可以更改这些值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keith、感谢您花时间回答这个问题、这是一个很好的问题、comm_flags 是一个易失性全局变量、ran_busy_Flag 是其中一个位、并通过中断进行更新。

    易失性 uint16_t comm_FLAGS = 0x0005;

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何定义 RAM_BUSY_FLAG? 如果它是一个定义,请尝试将它直接放在 while ()中。 即、comm_FLAGS&0x01。

    如果可以、您可能发现了编译器错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还有另一种可能需要考虑。   请通过阅读 此常见问题 解答(不是来自 TI)了解全局变量声明和定义之间的区别。

    这是 comm_FLAGS 的定义...

    [引用用户="Luis Flores"]易失性 uint16_t comm_FLAGS = 0x0005;

    它必须出现在某个 C 源文件中一次。  确保声明也使用 volatile。  喜欢这里...

    extern volatile uint16_t comm_flags; 

    此声明通常出现在头文件中、该头文件包含在所有读取或写入 comm_flags 的源文件中。

    谢谢、此致、

    乔治