在Keil的ARM Compiler编译器配置中,经常用到的有AC5和AC6两个版本,如下图所示,那这两个版本有什么区别呢?我们怎么选择呢?本文给大家简单解释一下。 当你选择AC5编译器时,界面如下所示: 而C/C++菜单下面的编译优化等级如下图所示,共有4种优化等级供选择: 当你选择AC6编译器时,界面如下所示: 而C/C++菜单的名称变成了C/C++(AC6),从这里可以看出,Keil默认编译器应该是VC5,并且下面的编译优化等级如下图所示,共有7种优化等级供选择: 先解释一下VC5的4种优化等级: Level 0(-O0):近乎不优化,用于调试代码,出现代码行不能设置断点的时候可以这么设置试试; Level 1(-O1):部分优化,去除未调用的内联函数或者静态函数,关闭debug窗口优化,此状态也能用于调试; Level 2(-O2):默认优化等级,如果处于debug状态,部分代码行将不能被调试; Level 3(-O3):除了和等级2执行相同的优化以外,还有空间和时间之间的平衡优化在生成的代码中比等级2更重的空间或时间。 再解释一下VC6的7种优化等级: -O0:没有优化,不推荐在ARMCompiler6.6中使用; -O1: 有限优化,这是源代码调试的推荐级别; -O2:优化速度,由于许多循环展开和函数内联,代码大小将增加; -O3:优化速度,比-O2生成的代码更快,但更大; -Ofast:暂未没有找到资料; -Os: 平衡的优化,优化速度,代码大小的增加是合理的; -Oz:纯粹优化代码大小。 总之: AC5提供了4种不同的优化级别,它们的行为和优化等级相关,优化等级越高,代码越小。 AC6各个优化等级不存在直接的关系,可以将项目在各个优化等级下进行编译,选择最优的优化等级即可。
作者分别用AC5和AC6的默认优化等级编译了一套程序,可以对比看下两者的生成代码的大小,区别还是比较大的: 另外,如果出现类似下面这种在编译时报很多警告的情况(来自帖子https://bbs.21ic.com/icview-3466614-1-1.html),也可以尝试将编译器改成VC5试试: 如果出现操作跳转变量或者函数等到其定义的地方时报错的情况,也可以尝试将编译器改成VC5试试(来自作者实操):
|