用于制作应用程序的volatile变量

时间:2013-09-08 01:26:23

标签: linux

我是这个领域的新手。以前我在做微控制器编程。我在volatile变量中使用的地方,以避免编译器优化。但是我从来没有在变量声明之前看到过这样的volatile声明。这意味着编译是在arago build中没有任何优化的情况下完成的。在这里,我有两个疑问。

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

1 个答案:

答案 0 :(得分: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等),“volatile”会使代码变慢并且没有任何好处,因为它不是必需的。