解决keil4版本的程序乱跳的原因

来源:本站
导读:目前正在解读《解决keil4版本的程序乱跳的原因》的相关信息,《解决keil4版本的程序乱跳的原因》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《解决keil4版本的程序乱跳的原因》的详细说明。
简介:前段时间调试一个很简单的IIC总线程序,程序编译通过了,但是在软件仿真调试的时候发现,不按照自己设定的程序跳转,找了很多天现在总结如下。

1.是你的程序优化级别太高,调低点就可以了,现在的ROM都很大。

2.是你有中断程序没有用,或者用错了

3.你定义的指针有错或者非法

一、优化

KeilC51的编译器有一个优化设置,不同的优化设置,会产生不同的编译结果。一般情况缺省编译优化设置被设定为8级优化,实际最高可设定为9级优化:

1.Dead code elimination。

2.Data overlaying。

3.Peephole optimization。

4.Register variables。

5.Common subexpression elimination。

6.Loop rotation。

7.Extended Index Access Optimizing。

8.Reuse Common Entry Code。

9.Common Block Subroutines

附表:Keil C51中的优化级别及优化作用

级别 说明

0 常数合并:编译器预先计算结果,尽可能用常数代替表达式。包括运行地址计算。

优化简单访问:编译器优化访问8051系统的内部数据和位地址。

跳转优化:编译器总是扩展跳转到最终目标,多级跳转指令被删除。

1 死代码删除:没用的代码段被删除。

拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试逻辑来改进或删除。

2 数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识。BL51连接/定位器可以通过全局数据流分析,选择可被覆盖的段。

3 窥孔优化:清除多余的MOV指令。这包括不必要的从存储区加载和常数加载操作。当存储空间或执行时间可节省时,用简单操作代替复杂操作。

4 寄存器变量:如有可能,自动变量和函数参数分配到寄存器上。为这些变量保留的存储区就省略了。

优化扩展访问:IDATA、XDATA、PDATA和CODE的变量直接包含在操作中。在多数时间没必要使用中间寄存器。

局部公共子表达式删除:如果用一个表达式重复进行相同的计算,则保存第一次计算结果,后面有可能就用这结果。多余的计算就被删除。

Case/Switch优化:包含SWITCH和CASE的代码优化为跳转表或跳转队列。

5 全局公共子表达式删除:一个函数内相同的子表达式有可能就只计算一次。中间结果保存在寄存器中,在一个新的计算中使用。

简单循环优化:用一个常数填充存储区的循环程序被修改和优化。

6 循环优化:如果结果程序代码更快和有效则程序对循环进行优化。

7 扩展索引访问优化:适当时对寄存器变量用DPTR。对指针和数组访问进行执行速度和代码大小优化。

8 公共尾部合并:当一个函数有多个调用,一些设置代码可以复用,因此减少程序大小。

9 公共块子程序:检测循环指令序列,并转换成子程序。Cx51甚至重排代码以得到更大的循环序列。

设置:在的TARGET 中C51 的CODE 中选择你需要的级别

堆栈、指针和自己写的中断问题那得自己检查下你的程序函数。

提醒:《解决keil4版本的程序乱跳的原因》最后刷新时间 2024-03-14 01:01:40,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《解决keil4版本的程序乱跳的原因》该内容的真实性请自行鉴别。