打印
[工具下载]

keil代码被优化的问题总结

[复制链接]
4103|50
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zerorobert|  楼主 | 2024-7-16 07:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在遇到编译器仿真跳转不按常理跳转(程序执行仿真从下边跳至上边行数),if语句无法正常执行,需要注意检查以下几个方面。
  • 设置编译器优化,如下图:

将此处设置为Level 0或者None(有那个设置成那个即可)
2. 增大编译器堆栈内存,如下图

增大此处堆栈内存的大小。
以上两处设置能解决90%遇见的奇葩问题。
3. 问题描述:
在调试程序中发现if条件很明显正常,仿真确一直不执行或者直接if,else都执行,直接崩溃!
以下是程序中各个优化设置的区别及优化机制分析(个人查找资料总结,不权威)-----
Keil中的程序优化机制主要通过编译器对源代码进行分析和转换来实现。编译器会根据所选的优化级别,对代码进行各种优化操作,以提高程序的执行效率和/或减小程序的存储空间占用。
优化机制包括但不限于以下几个方面:
  • 代码结构优化:编译器会对代码的结构进行调整,以提高指令的执行效率,例如循环展开、函数内联等。
  • 数据优化:编译器会对数据的存储和访问方式进行优化,包括寄存器分配、变量存储方式选择等。
  • 控制流优化:编译器会对程序的控制流进行优化,以减少分支跳转、简化条件表达式等。
  • 内联函数:编译器会根据情况将函数内联展开,以减少函数调用的开销。
  • 常量折叠:编译器会尝试将表达式中的常量进行计算和合并,以减少运行时的计算开销。
  • 死代码消除:编译器会识别和删除不会被执行的代码,以减小程序的存储空间占用。

以上优化机制可以根据所选的优化级别进行不同程度的应用,通常情况下,较高级别的优化会带来更好的执行效率,但也可能增加编译时间和代码大小。在实际开发中,需要根据项目的需求和目标平衡执行效率、存储空间占用和编译时间。
Code 是代码占用的空间 RO-data是
Read Only 只读常量的大小
RW-data是(Read Write) RW是可读可写变量,初始化已经赋值的变量
RW + ZI就是你的程序总共使用的RAM字节数。
Level 0
Program Size: Code=35990 RO-data=8514 RW-data=4800 ZI-data=13336
Level 1
Program Size: Code=29160 RO-data=8512 RW-data=2788 ZI-data=13332
Level 2
Program Size: Code=27802 RO-data=8514 RW-data=2788 ZI-data=13332
Level 3
Program Size: Code=27754 RO-data=8514 RW-data=2788 ZI-data=13332

使用特权

评论回复
沙发
hearstnorman323| | 2024-8-12 20:45 | 只看该作者
Keil提供了多个优化级别,从-O0(无优化)到-O3(最大优化)。每个级别都会对代码的生成方式产生不同的影响。

使用特权

评论回复
板凳
班杰明| | 2024-8-12 22:41 | 只看该作者
怎么选择合适的等级啊?

使用特权

评论回复
地板
1988020566| | 2024-8-12 23:40 | 只看该作者
在应用高优化等级之前,确保代码的逻辑清晰、结构良好。高质量的源代码是获得良好优化结果的基础。

使用特权

评论回复
5
lihuami| | 2024-8-13 01:33 | 只看该作者
使用Keil提供的断点和观察点功能,帮助跟踪和理解优化后的代码执行流程。

使用特权

评论回复
6
sheflynn| | 2024-8-13 04:43 | 只看该作者
较低的优化级别(如Optimization Level 0)通常更容易调试,而较高的优化级别(如Optimization Level 3)可能会提供更好的性能。

使用特权

评论回复
7
fengm| | 2024-8-13 07:59 | 只看该作者
虽然优化通常旨在减少资源占用,但在某些情况下,高级别的优化可能会增加堆栈内存的使用量或产生更多的临时变量。

使用特权

评论回复
8
vivilyly| | 2024-8-13 10:02 | 只看该作者
编译器可能会自动展开循环以减少循环控制的开销。这可能会增加代码大小并影响程序的可读性。如果需要手动控制循环展开,可以使用特定的编译器指令或属性。

使用特权

评论回复
9
呐咯密密| | 2024-8-13 10:41 | 只看该作者
经常会遇到提高优化等级导致代码异常运行

使用特权

评论回复
10
pmp| | 2024-8-13 11:49 | 只看该作者
进行调试时,确保编译器生成的调试信息是完整的。优化可能会删除或改变调试信息,使得调试变得困难

使用特权

评论回复
11
plsbackup| | 2024-8-13 14:07 | 只看该作者
所有使用的变量都被声明为volatile,以防止编译器对其进行优化。

使用特权

评论回复
12
gygp| | 2024-8-13 19:10 | 只看该作者
编译器可能会自动内联小函数以减少函数调用的开销。这可能会改变程序的执行流程,尤其是在有多个返回路径的函数中。

使用特权

评论回复
13
mikewalpole| | 2024-8-13 21:23 | 只看该作者
过度的优化可能会使调试变得更加困难,因为代码的实际执行情况可能与源代码有较大差异

使用特权

评论回复
14
elsaflower| | 2024-8-15 11:39 | 只看该作者
尽管优化可以提高性能,但过度优化可能会牺牲代码的可读性和维护性。

使用特权

评论回复
15
uiint| | 2024-8-15 15:19 | 只看该作者
随着优化等级的提升,编译时间会相应增长。这是因为编译器需要进行更多的分析和优化处理。在项目开发初期或频繁调试的阶段,这一点尤其需要注意。

使用特权

评论回复
16
tifmill| | 2024-8-17 17:02 | 只看该作者
过度优化可能会导致性能下降或不稳定。

使用特权

评论回复
17
gygp| | 2024-8-17 19:08 | 只看该作者
对于需要精确控制访问顺序的变量(如硬件寄存器),使用volatile关键字来防止编译器对其进行优化。

使用特权

评论回复
18
earlmax| | 2024-8-17 22:14 | 只看该作者
在不同的优化级别下测试代码性能。

使用特权

评论回复
19
febgxu| | 2024-8-18 11:49 | 只看该作者
对于那些需要每次访问都读取最新值的变量,应该使用volatile关键字声明,以防止编译器对其进行优化。

使用特权

评论回复
20
kmzuaz| | 2024-8-18 13:32 | 只看该作者
尽量避免编写依赖于特定优化行为的代码,以保持代码的可移植性和可维护性。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

1601

帖子

0

粉丝