我是这个领域的新手。以前我在做微控制器编程。我在 volatile 变量中使用以避免编译器优化。但是我在变量声明之前从未见过这样的 volatile 声明。这是否意味着编译在 arago build 中没有任何优化。这里我有两个疑问。
- 如何在编译期间启用不同类型的优化,例如 angstrom build 中的速度和空间优化?
- 如果已经优化编译了,为什么不需要 volatile 声明呢?
我是这个领域的新手。以前我在做微控制器编程。我在 volatile 变量中使用以避免编译器优化。但是我在变量声明之前从未见过这样的 volatile 声明。这是否意味着编译在 arago build 中没有任何优化。这里我有两个疑问。
优化通常通过编译器设置来控制 - 例如编译器命令行。它不受代码控制。
然而,为了进行优化,编译器假定变量的行为类似于“正常变量”,而代码没有被中断。
这可能会导致以下错误:一些示例代码:
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;
}
编译器假定没有中断。因此它会看到
因此,优化编译器可能会像这样在内部更改代码:
void myFunc(void)
{
while(1);
}
离开“易失性”可能有效,但可能无效。
如果您没有硬件中断(并且没有并行线程、多核 CPU 等),“易失性”只会使代码变慢并且没有任何好处,因为它不是必需的。