【无标题】keil51优化等级--bug记录

Keil MDK优化级别设置与嵌入式开发性能调优 代码优化是嵌入式系统开发中的核心技术,通过编译器优化可以显著提升程序执行效率和减少内存占用。ARM架构编译器提供从O0到O3多级优化选项,不同级别在代码大小、执行速度和可调试性之间实现不同平衡。在Keil MDK开发环境中,开发者可以灵活配置项目全局、文件组甚至单个函数的优化级别,这种分层优化策略特别适合实时性要求高的嵌入式应用。通过合理使用#pragma指令和函数属性,能够对关键路径代码实施针对性优化,实测表明可带来5-15%的性能提升。掌握这些优化技术对开发高性能嵌入式系统至关重要,尤其在电机控制、信号 阅读详情

项目场景:Damo板上跑编译通过的keil 51文件


问题描述

`Damo板上跑编译通过的keil 51文件,发现程序跑不了


原因分析:

查询配置文件都没问题,最后找到keil优化等级设置


解决方案:

在这里插入图片描述

keil优化等级说明 keil code optimization

其中

0级(Constan folding)的优化包括:

a、常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算。

b、 简单访问优化:对8051系统的内部数据和位地址进行访问优化。

c、 跳转优化:编译器总是将跳转延至最终目标上,因此跳转到跳转之间的命令被删除。

特点:最少的优化,可以最大程度上配合产生代码调试信息,可以在任何代码行打断点,特别是死代码处。

1级(Dead code elimination)的优化包括:

a、 死码消除:无用的代码段被消除。

b、 跳转否决:根据一个测试回溯,条件跳转被仔细检查,以决定是否能够简化或删除。

特点:有限的优化,去除无用的inline和无用的static函数、死代码消除等,在影响到调试信息的地方均不进行优化。在适当的代码体积和充分的调试之间平衡,代码编写阶段最常用的优化等级。

2级(Data overlaying)的优化包括:

a、数据覆盖:适于静态覆盖的数据和位段被鉴别并标记出来。连接定位器BL51通过对全局数据流的分析,选择可静态覆盖的段。

特点:高度优化,调试信息不友好,有可能会修改代码和函数调用执行流程,自动对函数进行内联等。

3级(Peephole optimization)的优化包括:

a、“窥孔”优化:将冗余的MOV命令去掉,包括不必要的从存储器装入对象及装入常数的操作。另外如果能节省存储空间或者程序执行时间,复杂操作将由简单操作所代替。

特点:最大程度优化,产生极少量的调试信息。会进行更多代码优化,例如循环展开,更激进的函数内联等。

另外,可以通过单独设置 --loop_optimization_level=option 来控制循环展开的优化等级。

4级(Register variables)的优化包括:

a、寄存器变量:使自动变量和函数参数尽可能位于工作寄存器中,只要有可能,将不为这些变量保留数据存储器空间。

b、扩展访问优化:来自IDATA、XDATA、PDATA和CODE区域的变量直接包含在操作之中,因此大多数时候没有必要将其装入中间寄存器。

c、局部公共子式消除:如果表达式中有一个重复执行的计算,第一次计算的结果被保存,只要有可能,将被用作后续的计算,因此可从代码中消除繁杂的计算。

d、CASE/SWITCH语句优化:将CASE/SWITCH语句作为跳转表或跳转串优化。

5级(Common subexpression elimination)的优化包括:

a、全局公共子式消除:只要有可能,函数内部相同的子表达式只计算一次。中间结果存入一个寄存器以代替新的计算。

b、简单循环优化:以常量占据一段内存的循环再运行时被优化。

6级(Loop rotation)的优化包括:

a、回路循环:如果程序代码能更快更有效地执行,程序回路将进行循环。

7级(Extended Index Access optimizing)的优化包括:

a、扩展入口优化:在适合时对寄存器变量使用DPTR数据指针,指针和数组访问被优化以减小程序代码和提高执行速度。

8级(Reuse Common Entry Code)的优化包括:

a、公共尾部合并:对同一个函数有多处调用时,一些设置代码可被重复使用,从而减小程序代码长度

9级(Common Block Subroutines)的优化包括:

a、公共子程序块:检测重复使用的指令序列,并将它们转换为子程序。C51甚至会重新安排代码以获得更多的重复使用指令序列。

PS:
优化级别并非越高越好,应该根据具体要求适当选择。
在debug时尽量保证优化等级在0,在出货时尽量保证等级在1,既不会出现问题,生成的代码也小。
尽量不要用最高优先级。
引用博客园文章

Keil IDE —— 优化等级Code Optimization keil对代码优化等级code optimization在魔法棒配置的C51选项里,一共有0-9这10个等级可选。在debug时尽量保证优化等级在0,在出货时尽量保证等级在1,既不会出现问题,生成的代码也小。优化级别并非越高越好,应该根据具体要求适当选择。尽量不要用最高优先级。 阅读详情

相关推荐

编译器优化导致的问题(调试技术)

在讲编译器优化导致程序问题前先要讲讲什么是编译器优化。不同的C语言编译器都会对程序进行一定程度的优化,每种编译器都会划分几种编译优化等级。不同的优化等级对程序的优化程度不同,有对代码空间的优化,有对执行时间的优化。编译器针对不同问题的优化都是基于某种算法的,但是最终的原则是不能改变用户程序的执行逻辑。在大多数情况下这种优化会提高程序的执行效率及优化代码空间,但是有时编译器也会错误的领会程序员的意图,将一些代码优化后造成不可预测的问题。

难波儿万的博客 2990

劝君慎用KEILC51九级优化

有时程序才4K多一点,或者8K多一点,32K多一点,64K多一点,总会想方设法去优化压缩代 码,以便放到更低成本的芯片中去,可是这时问题可能就出现了!

【蓝桥杯】— Keil C51 优化等级全解析

1、优化等级种类 Keil C51中的Code Optimization栏共有0-9个优化等级,高优化级别中包含了前面所有的优化级别。本文主要介绍如何设置代码优化等级及各等级优化内容。 2、针对的问题 如果你因为编译代码过多,而导致超出编译的范围,可以修改下优化等级。如: 从这可以看出,这个keil c51共有0800H字节码大小限制,但是使用了0955H字节,超出了限制,所以造...

Fanjufei的博客 6192

KEIL里的优化选项解读

优化大家都知道,-O0,-O1,-O2,-O3,等级越高优化程度越高,代码的执行效率也就越高。3、Optimize for time的3种状态是什么意思?1、低优化等级代码能跑,开启高优化等级后代码就跑不起来了。2、高优化等级代码能跑,开启低优化等级后代码就跑不起来了。第3个问题还是在群里问大神才知道。问题1和2的解决思路看看。

iommer的博客 1万+

关于keil MDK调整优先级程序出错的解决思路

关于keil MDK调整优先级程序出错的解决思路

再怎么痛、也要向天微笑丶的博客 4221

keil代码被优化的问题总结

keil编译器仿真出现各种奇葩问题!!!

R_752995的博客 3461

KeilC51平台 - 优化等级注意事项

描述KeilC51平台的注意事项

嵌入式技术 2656

Keil优化等级高导致的程序跑飞

在一个工程里面发现stm32的输出不对劲,调试看了一下,发现在一个if判断那里,即使条件不成立但是还依然运行了里面的程序,导致的状态不对劲,一开始以为是语法写的不规范,后面改了语法,再后面就分开成两个if来判断,但调试的时候依然如此 a = 1; b = 1; if(a == 1 && b == 0) xxxxxxx; //条件不成立依然运行了这一句 最后看了一下Keil里设置的优化等级,发现我之前设置成O3了,导致了程序跑飞了 再后来改成了O0.不优化代码了就解决

weixin_47587025的博客 3769

keil优化等级bug

跳过函数一般又判断和Goto等语句,其它的溢出和错误编译器会报错,而这个编译器并没有报错,那么怎么回事呢?将图中optimization选项改成default或者Level 0即可解决,优化太高导致。将代码优化等级降低,代码优化等级高导致的部分函数无法正确执行,我觉得这是个bug。程序中代码有的执行,有的不执行,仔细研究,查询人工智能。程序中printf打印后面的代码不执行, 然后过几十个函数又开始正常了。

xiaoxuechong的博客 1288

KEIL编译器优化导致的问题。

参考https://blog.csdn.net/u012363005/article/details/51814126 KEIL的默认优化等级8级,我要缩小size,改为9级。代码size缩小了,但时软件复位无效了。 解决方法如下: 1,使用汇编替代C。 2,把出问题的C文件的优化等级改回以前的优化等级。 void SW_Reset(void) { /* there will ...

register_k的博客 3347

关于Keil优化等级...

关于Keil优化等级那些坑...

lemou1211的博客 8183

c51优化等级 keil_keil c51怎么设置单个函数的优化等级-keil c51教程

使用keil c51怎么设置单个函数的优化等级呢?下面小编就将和大家一起分享keil c51设置单个函数优化等级的方法,有需要的朋友可以来看看哦,希望可以帮助到大家。首先,在Keil中新建一个C51工程,同时加入一个main.c的源程序文件。在main.c当中输入下面的代码,其中testFun用于代码优化效果比较:int testFun(int in){ int i = 0; int j = 0...

weixin_42131633的博客 1813

C51编译器的优化问题

以下的翻译和原文 OPTIMIZE Compiler Directive Abbreviation OT Arguments A decimal number between 0 and 11 enclosed in parentheses optionally followed by SIZE or SPEED to specify code size or execution spe

1786

keil优化等级设置

优化论 谈到优化,其实很多人都哭笑不得,因为在一个C51软件工程师的生涯中,总要被KEIL优化耍那么一次到几次。我被耍过,想必看着文章的你也被耍过,如果你回答说不,那只能说你写的C51程序不多! 看看KEILC的优化级别选项吧:   0-9共10个级别的优化,0是最低,9最高,一个普通的程序,设置最高级别和最低级别,编译后代码量有时会相差很远,以DXDEMO程序为例,0级优化后是14K

husion01的专栏 2万+

如何利用keil C51软件减少代码长度呢?

单片机程序的时候有时候会遇到所编写的代码超出程序存储器的存储空间,那么这时该怎么办呢?不妨打开keil软件,做如下设置,可能将源代码长度最大减少10K。 首先在keil的菜单栏选择“Project”,打开“Options for Target”选项,界面如下,切换到C51选项卡,可以看到“Code Optimization”----代码优化优化Level下拉选择按空间大小,9级优化程序,点击确定即可。然后重新编译程序。 除了上面的操作方法之外,还需注意在进行程序设计的时候尽可能少...

6083

keil 编译优化等级低 导致flash操作失败

记一个坑 之前想用V6的ARM Complier,尝试未果,,,这个过程不提了。 然后切回V5的版本,结果没注意编译优先级变成了 -O1,导致程序code段占的flash空间大了一倍。后面操作flash就操作到了code段于是失败。 -O1 优化生成的map文件 -O3 优化生成的map文件 ...

周星星_少年只有一个面的博客 919

c51优化等级 keil_keil优化等级设置

优化级别说明(仅供参考):则其中的CodeOptimization栏就是用来设置C51优化级别。共有9个优化级别(书上这么写的),高优化级别中包含了前面所有的优化级别。现将各个级别说明如下:0级优化:1、常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算。2、简单访问优化:对8051系统的内部数据和位地址进行访问优化。3、跳转优化:编译器总是将跳转延至最终目标上...

weixin_26806355的博客 1406

Keil5 优化级别引发的 FSMC花屏问题(附带FSMC配置)

FSMC移植花屏问题

嵌入式中手 3457
上一篇: 雏鹰的初次飞行
Metayou
博客等级 码龄7年 0粉丝 · 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值