【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485
1 . 前言
留意优化等级注意事项,加固程序稳定性,是开发过程中比较重要的思想,以下详解KeilC51平台的九级优化
- 0级(Constan folding):常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算。b、 简单访问优化:对8051系统的内部数据和位地址进行访问优化。c、 跳转优化:编译器总是将跳转延至最终目标上,因此跳转到跳转之间的命令被删除。
- 1级(Dead code elimination):死码消除:无用的代码段被消除。b、 跳转否决:根据一个测试回溯,条件跳转被仔细检查,以决定是否能够简化或删除。
- 2级(Data overlaying):数据覆盖:适于静态覆盖的数据和位段被鉴别并标记出来。连接定位器BL51通过对全局数据流的分析,选择可静态覆盖的段。
- 3级(Peephole optimization):“窥孔”优化:将冗余的MOV命令去掉,包括不必要的从存储器装入对象及装入常数的操作。另外如果能节省存储空间或者程序执行时间,复杂操作将由简单操作所代替。
- 4级(Register variables):寄存器变量:使自动变量和函数参数尽可能位于工作寄存器中,只要有可能,将不为这些变量保留数据存储器空间。b、扩展访问优化:来自IDATA、XDATA、PDATA和CODE区域的变量直接包含在操作之中,因此大多数时候没有必要将其装入中间寄存器。c、局部公共子式消除:如果表达式中有一个重复执行的计算,第一次计算的结果被保存,只要有可能,将被用作后续的计算,因此可从代码中消除繁杂的计算。d、CASE/SWITCH语句优化:将CASE/SWITCH语句作为跳转表或跳转串优化。
- 5级(Common subexpression elimination):全局公共子式消除:只要有可能,函数内部相同的子表达式只计算一次。中间结果存入一个寄存器以代替新的计算。b、简单循环优化:以常量占据一段内存的循环再运行时被优化。
- 6级(Loop rotation):回路循环:如果程序代码能更快更有效地执行,程序回路将进行循环。
- 7级(Extended Index Access optimizing):扩展入口优化:在适合时对寄存器变量使用DPTR数据指针,指针和数组访问被优化以减小程序代码和提高执行速度。
- 8级(Reuse Common Entry Code):公共尾部合并:对同一个函数有多处调用时,一些设置代码可被重复使用,从而减小程序代码长度。
- 9级(Common Block Subroutines):公共子程序块:检测重复使用的指令序列,并将它们转换为子程序。C51甚至会重新安排代码以获得更多的重复使用指令序列。
2 . 优化问题分析
-
第2级数据覆盖的意思是局部变量之间地址复用,但是中断的局部变量还是独立的,另外要注意就是编译会链接调用行为,函数指针检测不到调用行为,所以如果实现函数指针的时候在里面的局部变量可能会改变上层调用时的局部变量,因此若优化大于此级别,那么函数指针的作用域内最好别操作局部变量。
-
第4级优化编译会尽力把变量往寄存器变量赋予,以保证程序运行性能达到最优,但是这样会引发中断与后台的调用判断逻辑产生差异,导致异常,因此注意这类情况,这类情况本人也写了篇详细描述该类问题的细节,若是不希望编译器这么执行,可在定义时加volatile关键字防止编译优化。
-
其余优化基本都是为了代码复用,高性能运转代码,一般KeilC51开发选择到8级,第9级优化可能会导致一些不好的程序写法产生异常,因为第9级会把代码进一步复用,无论中断亦或者后台。
-
KeilC51在程序中动态更改优化等级用如下语句,其中x范围0~9
#pragma optimize(x) -
MDK在程序中动态更改优化等级用如下语句,其中x范围0~3
#pragma Ox
3 . 总结
KeilC51虽然是8位机,没有32位平台复杂,但是想要稳定写好一个项目,要平常心对待,分析其中可能出现的问题,以让自己掌控全局,不至于出现问题束手无策,以上主要描述keilC51的九级优化,与优化问题分析,谢谢观看。
技术交流群 : 745662457
群内专注问题答疑,技术交流