重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 7107|回复: 6
打印 上一主题 下一主题

[经验] keil C51 编译器优化问题

[复制链接]

287

主题

668

帖子

5622

积分

学生管理组

Rank: 8Rank: 8

积分
5622
跳转到指定楼层
楼主
发表于 2016-1-17 12:27:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 李维强-15级 于 2016-1-17 12:28 编辑

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



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

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


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


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

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

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






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

12

主题

66

帖子

538

积分

高级会员

Rank: 4

积分
538
QQ
沙发
发表于 2016-1-18 10:16:55 | 只看该作者
赞一个,把编译器在这里具体是怎么优化的讲的很清楚。这里如果选用了较高的优化等级,上文中如果将aal变量打印输出到串口中,值是1000还是232呢
回复 支持 反对

使用道具 举报

12

主题

66

帖子

538

积分

高级会员

Rank: 4

积分
538
QQ
板凳
发表于 2016-1-18 10:19:01 | 只看该作者
PS:我也在用SIM808开发一个3G数传,欢迎交流
回复 支持 反对

使用道具 举报

16

主题

75

帖子

863

积分

版主

Rank: 7Rank: 7Rank: 7

积分
863
QQ
地板
发表于 2016-1-18 15:09:13 | 只看该作者
写代码把.c 文件包含到.c文件有什么好处吗
回复 支持 反对

使用道具 举报

287

主题

668

帖子

5622

积分

学生管理组

Rank: 8Rank: 8

积分
5622
5#
 楼主| 发表于 2016-1-19 08:04:06 | 只看该作者
程浥 发表于 2016-1-18 15:09
写代码把.c 文件包含到.c文件有什么好处吗

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

还是把函数写在头文件里面,包含头文件比较靠谱,规范些,他这个我费了很多力才调试通过,乱七八糟的,不好看
回复 支持 反对

使用道具 举报

287

主题

668

帖子

5622

积分

学生管理组

Rank: 8Rank: 8

积分
5622
6#
 楼主| 发表于 2016-1-19 08:05:00 | 只看该作者
张金权-11级电子 发表于 2016-1-18 10:16
赞一个,把编译器在这里具体是怎么优化的讲的很清楚。这里如果选用了较高的优化等级,上文中如果将aal变量 ...

欢迎,欢迎
正需要
要不我另外开一贴   来里面留言吧。
回复 支持 反对

使用道具 举报

12

主题

66

帖子

538

积分

高级会员

Rank: 4

积分
538
QQ
7#
发表于 2016-1-19 10:07:42 | 只看该作者
李维强-15级 发表于 2016-1-19 08:05
欢迎,欢迎
正需要
要不我另外开一贴   来里面留言吧。

这个可以有,哈哈
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-4-19 23:41 , Processed in 0.185418 second(s), 31 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表