0

我是这个领域的新手。以前我在做微控制器编程,我使用 volatile 变量来避免编译器优化。但是在变量声明之前我从未见过这样的 volatile 声明。这是否意味着在 Arago 构建中没有任何优化就完成了编译。这里我有两个问题。

  1. 如何在编译期间启用不同类型的优化,例如 Angstrom 构建中的速度和空间优化?

  2. 如果已经是优化编译了,为什么我们不需要 volatile 声明呢?

4

1 回答 1

2

如果您gcc用于编译,则添加/修改CFLAGS

  • -O2-O3启用一堆通用性能优化。

  • Os启用代码大小优化。

控制各个 gcc 编译器优化选项的标志的长列表可在此处获得。


大多数情况volatile下不是用于优化代码,而是用于确保数据的有效性

变量 as 的声明volatile告诉编译器该变量可以随时在实现外部修改

  • 操作系统
  • 另一个执行线程
    ——中断例程
    ——信号处理程序
  • 底层硬件

由于 volatile 限定变量的值可以随时更改,因此无论何时在代码中引用该变量,都必须始终访问实际变量。

这意味着编译器无法对变量执行优化。标记变量volatile会强制编译器生成忽略 CPU 寄存器中的变量的代码,并实际读取映射到变量引用的地址的底层内存/硬件寄存器。

volatile还要检查使用编译器优化的各个方面。

于 2013-09-08T02:17:19.123 回答