重工电子论坛

标题: keil C51 编译器优化问题 [打印本页]

作者: 李维强-15级    时间: 2016-1-17 12:27
标题: keil C51 编译器优化问题
本帖最后由 李维强-15级 于 2016-1-17 12:28 编辑

最近做个GPS,但是遇到个奇葩问题,最基本的C51问题



看到了么? 给一个数赋值,结果不是按个数。

最后仔细分析,这个是编译器优化的结果。
如果把优化等级变为0 就不会出现这种情况了,所有正常运行,设置如下图


但是这样一来,代码量就要增加。上图同样的工程,选择8级优化,结果如下图,程序区是不是减少了2K左右?


下面说一下为什么会出现这种情况?
最开始我和顾老师研究了半天,也没有研究个所以然出来,最后看看汇编代码来解释,如下图

看到编译器只把1000这个16位数的低8位赋值给了变量。为什么会这样?原因是我下面那行代码,编译器知道我下面一行的操作是左移8位,所以高8位本来就没有用的,这样就减少使用1个寄存器,优化了代码。
总结起来就是编译器很聪明,正式这样的聪明才达到了优化代码的效果。所以在仿真的时候,不要相信watch窗口里面的变量值,这会使得你的判断失误。

我们把代码改了试试,同样是赋值,这下赋值1000就正确了。







作者: 张金权-11级电子    时间: 2016-1-18 10:16
赞一个,把编译器在这里具体是怎么优化的讲的很清楚。这里如果选用了较高的优化等级,上文中如果将aal变量打印输出到串口中,值是1000还是232呢
作者: 张金权-11级电子    时间: 2016-1-18 10:19
PS:我也在用SIM808开发一个3G数传,欢迎交流
作者: 程浥    时间: 2016-1-18 15:09
写代码把.c 文件包含到.c文件有什么好处吗
作者: 李维强-15级    时间: 2016-1-19 08:04
程浥 发表于 2016-1-18 15:09
写代码把.c 文件包含到.c文件有什么好处吗

个人觉得没什么好处 ,这个是人家的例程  我在这个上面改的

还是把函数写在头文件里面,包含头文件比较靠谱,规范些,他这个我费了很多力才调试通过,乱七八糟的,不好看
作者: 李维强-15级    时间: 2016-1-19 08:05
张金权-11级电子 发表于 2016-1-18 10:16
赞一个,把编译器在这里具体是怎么优化的讲的很清楚。这里如果选用了较高的优化等级,上文中如果将aal变量 ...

欢迎,欢迎
正需要
要不我另外开一贴   来里面留言吧。
作者: 张金权-11级电子    时间: 2016-1-19 10:07
李维强-15级 发表于 2016-1-19 08:05
欢迎,欢迎
正需要
要不我另外开一贴   来里面留言吧。

这个可以有,哈哈




欢迎光临 重工电子论坛 (http://www.cqutlab.cn/) Powered by Discuz! X3.1