(注:此为乐某学习记录,若有出错的地方欢迎各位指出!)

前言

关于前段时间,我在测试我的买来的开发板的时候。我想建立一个工程,然后写一个LED灯闪烁的程序进行测试,结果发现这个LED灯没有闪烁。但是用Debug来看,LED灯是有亮灭的,所以是我做的简单延时没有效果。然后请教了之前学校的学长之后,才发现是这个Keil的优化等级的问题。

官网地址

https://developer.arm.com/documentation/dui0375/g/Compiler-Command-line-Options/-Onum

官网中Keil的优化等级介绍

翻译过来就是

控制生成代码的编译器代码优化。设置编译器命令行选项-Onum:

默认:使用编译器默认值或更高目标或组级别的设置。

级别0:关闭所有优化,除了一些简单的源转换。

级别1:关闭严重降低调试视图的优化。

级别2:高度优化(默认级别)。调试视图可能不太令人满意,因为目标代码到源代码的映射并不总是清晰的。

级别3:最大优化。请注意,第3级与优化时间相结合可能会生成比第2级更多的代码,因为它可能展开循环。

优化等级:0

最小的优化。关闭大多数优化。当启用调试时,此选项将提供最好的调试视图,因为生成的代码的结构直接对应于源代码。所有干扰调试视图的优化都被禁用。特别是:

1、断点可以设置在任何可到达的点上,包括死代码。

2、变量的值在其作用域内的任何地方都是可用的,除非它是未初始化的。

3、Backtrace提供了读取源代码时预期的开放函数激活堆栈。

请注意:

1、请注意尽管由0级生成的调试视图最接近源代码,但用户可能更喜欢由-01生成的调试视图,因为这在不改变基本结构的情况下提高了代码的质量。

2、请注意死代码包括对程序结果没有影响的可到达代码,例如对从未使用过的局部变量的赋值。不可到达代码是指无法通过任何控制流路径到达的代码,例如紧跟在return语句后面的代码。

优化等级:1

受限制的优化。编译器只执行调试信息所描述的优化。删除未使用的内联函数和未使用的静态函数。关闭会严重降低调试视图性能的优化。如果与debug一起使用,该选项将提供一个总体上令人满意的调试视图和良好的代码密度。

调试视图与0级的区别是:

1、不能在死代码上设置断点。

2、变量的值在初始化后可能在其作用域内不可用。例如,如果它们分配的位置已被重用。

3、没有副作用的函数可能会被按顺序调用,如果不需要结果,则可能会被省略。

4、由于尾部调用的存在,Backtrace可能不会给出读取源代码所期望的开放函数激活堆栈。

优化级别1级在源代码和目标代码之间产生良好的对应关系,特别是当源代码不包含死代码时。生成的代码可以明显小于0级的代码,这可以简化目标代码的分析。

优化等级:2

级别高的优化。如果与debug一起使用,调试视图可能不太令人满意,因为目标代码到源代码的映射并不总是清晰的。编译器可能执行调试信息无法描述的优化。这是默认的优化级别。

调试视图与1级的区别如下:

1、源代码到目标代码的映射可能是多对一,因为可能有多个源代码位置映射到文件的一个点,以及更激进的指令调度。

2、指令调度允许交叉序列点。这可能导致变量在特定点的报告值与您从阅读源代码中可能期望的值之间的不匹配。

3、编译器自动内联函数。

优化等级:3

最大的优化。当启用调试时,此选项通常会给出一个糟糕的调试视图。ARM建议在较低的优化级别进行调试。如果同时使用3级和-Otime,编译器会执行额外的更激进的优化,例如:

1、高级标量优化,包括循环展开。这可以以较小的代码大小成本获得显著的性能优势,但冒着构建时间较长的风险时间。

2、更积极的内联和自动内联。

这些优化有效地重写了输入源代码,导致目标代码与源代码的对应关系最低,调试视图最差。loop_optimization_level=选项控制在-O3 -Otime执行的循环优化的数量。循环优化的次数越多,源代码和目标代码之间的对应关系就越差。

有关在-O3 -Otime对源代码执行的高级转换的额外信息,请使用备注命令行选项。

请注意:

1、浮点代码的性能可以通过使用——fpmode选项选择适当的数值模型来影响。

2、不要依赖于这些优化的实现细节,因为它们在未来的版本中可能会改变。

3、默认情况下,编译器优化以减少图像大小,代价是可能增加执行时间。即-Ospace是默认值,而不是-Otime。注意-Ospace不受优化级别-Onum的影响。也就是说,-O3-Ospace比-02-Ospace支持更多的优化,但不会执行更积极的减小内存。

个人总结

优化的主要操作体现在调试界面和代码生成的执行文件上。等级越高,调试界面的内容给人的感觉就会越差,代码的编译时间也会更长,当然生成的执行文件的内存也就会更小。但是弊端就是,使用Debug调试的时候,在你想停下的地方不能够打断点,你想看的变量值也看不了。而且程序的效果,也会根据程序的最终结果来执行。例如,我的LED灯闪烁程序,最终的结果就是LED灯的状态一直翻转,那么这个延时函数要不要都可以,然后就索性给我优化掉了。所以,需要根据个人需求来设置。

那么,以下就是修改优化等级的地方

物联沃分享整理
物联沃-IOTWORD物联网 » Keil优化等级的探讨

发表评论