0

我是这个领域的新手。以前我在做微控制器编程。我在 volatile 变量中使用以避免编译器优化。但是我在变量声明之前从未见过这样的 volatile 声明。这是否意味着编译在 arago build 中没有任何优化。这里我有两个疑问。

  1. 如何在编译期间启用不同类型的优化,例如 angstrom build 中的速度和空间优化?
  2. 如果已经优化编译了,为什么不需要 volatile 声明呢?
4

1 回答 1

0

优化通常通过编译器设置来控制 - 例如编译器命令行。它不受代码控制。

然而,为了进行优化,编译器假定变量的行为类似于“正常变量”,而代码没有被中断。

这可能会导致以下错误:一些示例代码:

int a;

void myFunc(void)
{
    a=1;
    /* Wait until the interrupt sets a back to 0 */
    while(a==1);
}

void interruptHandler(void)
{
    /* Some hardware interrupt */
    if(a==1) doSomeAction();
    a=0;
}

编译器假定没有中断。因此它会看到

  • "a" 设置为 1 并且在 "while" 循环之前从未更改
  • while 循环是一个无限循环,因为“a”在这个循环中不会改变
  • 在这个无限循环之前从未读取过“a”

因此,优化编译器可能会像这样在内部更改代码:

void myFunc(void)
{
    while(1);
}

离开“易失性”可能有效,但可能无效

如果您没有硬件中断(并且没有并行线程、多核 CPU 等),“易失性”只会使代码变慢并且没有任何好处,因为它不是必需的。

于 2013-09-10T20:33:06.057 回答