我是这个领域的新手。以前,我在进行微控制器编程时,使用易失性变量来避免编译器优化。但我从来没有在变量声明之前看到过这样的 volatile 声明。这是否意味着编译是在 Arago 构建中没有进行任何优化的情况下完成的。这里我有两个问题。
如何在编译过程中启用不同类型的优化,例如 Angstrom 构建中的速度和空间优化?
如果已经是优化编译了,为什么我们不需要 volatile 声明呢?
如果您正在使用gcc
进行编译然后添加/修改CFLAGS
-O2
or -O3
启用一系列通用性能优化。
Os
启用代码大小优化。
提供了一长串控制各个 gcc 编译器优化选项的标志here http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html.
最经常volatile
不是用于优化代码,而是用于确保数据的有效性 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472c/CJAEGDEA.html.
变量的声明为volatile
告诉编译器可以在实现外部随时修改该变量
- 操作系统
- 另一个执行线程
-- 中断例程
-- 信号处理程序
- 底层硬件
由于 volatile 限定变量的值可以随时更改,因此只要在代码中引用该变量,就必须始终访问实际变量。
这意味着编译器无法对变量执行优化。标记变量volatile
强制编译器生成忽略 CPU 寄存器中变量的代码,并实际读取映射到该变量引用的地址的底层内存/硬件寄存器。
还要检查使用的各个方面volatile以及编译器优化 https://stackoverflow.com/questions/14170000/volatile-and-compiler-optimization.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)