解决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 中选择你需要的级别


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






 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(单片机,优化,编译器,optimization,variables,存储,扩展)