打印
[51单片机]

一个奇怪的问题

[复制链接]
3005|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
先上图,如图,程序运行过程 0578-->0580-->0594.居然就跳过了0579行,并且能直接跳到0594的。真的搞不清了,那位高人能解惑下?是Keil uVision4 C51,SM5964的芯片。

相关帖子

沙发
NE5532| | 2014-2-4 22:42 | 只看该作者
仿真是经常有这样问题的,所以别太依赖仿真,一般来说,全速运行时的可靠性比较高。

使用特权

评论回复
板凳
wangke2010| | 2014-2-5 07:07 | 只看该作者
不要纠结这些东西吧,楼主用的是高级语言,优化的时候可能就会合并一些语句。楼主如果懂汇编,可以切换到汇编界面看看到底是怎么运行的。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
xyz549040622 + 2
地板
tao819tao| | 2014-2-5 08:11 | 只看该作者
定义变量 cDrawpoint  前加个volatile 修饰一下试试,估计是KEIL优化的问题

使用特权

评论回复
5
zhaofy521| | 2014-2-5 10:57 | 只看该作者
把优化关了试试

使用特权

评论回复
6
dirtwillfly| | 2014-2-5 14:59 | 只看该作者
估计是被优化掉了

使用特权

评论回复
7
散装805| | 2014-2-5 17:32 | 只看该作者
那个cDrawpoint变量,无论你在哪个case里面都要自加,编译器就把你优化掉了,case完了之后再自加。

使用特权

评论回复
评分
参与人数 2威望 +3 收起 理由
xxlin1984 + 1
xyz549040622 + 2
8
通宵敲代码| | 2014-2-5 19:49 | 只看该作者
估计是被优化了。

下载到芯片看看运行有没有问题,

不行就把优化关掉。

使用特权

评论回复
9
music_586| | 2014-2-5 20:14 | 只看该作者
优化级别

使用特权

评论回复
10
晓文88|  楼主 | 2014-2-5 21:26 | 只看该作者
散装805 发表于 2014-2-5 17:32
那个cDrawpoint变量,无论你在哪个case里面都要自加,编译器就把你优化掉了,case完了之后再自加。 ...

有case 中不自加的。另外,流程也不对,从一个CASE出来,居然会直接跳转到另一个CASE 中去的。

使用特权

评论回复
11
晓文88|  楼主 | 2014-2-5 21:31 | 只看该作者
这两天,调试这个C51程序,快发疯了。无论程序检查多么正确,编译后就是运行部起来。Keil uVision2换了Keil uVision4,也不行,重装系统也不行。甚至找了以前的备份程序,直接烧录目标文件是可以运行的,一旦重新编译,就不能运行了。在此问下,有没有其它兼容Keil uVision2又容易上手的C51编译器,救急啊。

使用特权

评论回复
12
weiyi192| | 2014-2-5 21:34 | 只看该作者
相同的语句,keil会自动跳到最后一个执行。这里每个case都有相同的cdrawpoint++;

使用特权

评论回复
13
Rmcu| | 2014-2-6 08:43 | 只看该作者
正如LS所说,这没错,程序运行的结果是完全相同的。

使用特权

评论回复
14
xyz549040622| | 2014-2-6 20:09 | 只看该作者
晓文88 发表于 2014-2-5 21:31
这两天,调试这个C51程序,快发疯了。无论程序检查多么正确,编译后就是运行部起来。Keil uVision2换了Keil ...

MDK都不满足你,去哪找了,就这么简单的判断而已,你把编译优化关掉,不行上Demo

使用特权

评论回复
15
guangbiao| | 2014-2-8 11:18 | 只看该作者

使用特权

评论回复
16
xxlin1984| | 2014-2-9 17:08 | 只看该作者
本帖最后由 xxlin1984 于 2014-2-9 17:16 编辑
晓文88 发表于 2014-2-5 21:31
这两天,调试这个C51程序,快发疯了。无论程序检查多么正确,编译后就是运行部起来。Keil uVision2换了Keil ...

你纠结的地方不对。
这段switch..case..只要验证switch前和switch后的变量,输入和期望的输出对上了,程序就对了。
至与运行不起来,那是其他的问题。

“甚至找了以前的备份程序,直接烧录目标文件是可以运行的,一旦重新编译,就不能运行了”
可能的原因:
1. 使用了别的版本编译的库,现在的版本不兼容
2. 源程序写的时候不规范;版本、优化等级的不同会导致编译结果的微小区别(虽然逻辑一般是正确的),但和硬件配合不上(比如,某些精确的延时既没使用定时器,又没留余量,版本或优化等级变了,延时也就对不上了)

使用特权

评论回复
17
香水橙| | 2014-2-9 17:47 | 只看该作者
显然是编译器进行了优化。不必纠结于哪句运行哪句没运行,只要结果正确即可。

使用特权

评论回复
18
autopccopy| | 2014-2-10 12:20 | 只看该作者
学习了!我一般不优化,或优化后详细测试!

使用特权

评论回复
19
天命风流| | 2014-2-10 13:50 | 只看该作者
这个......

使用特权

评论回复
20
ningling_21| | 2014-2-11 09:29 | 只看该作者
KEIL 默认8级的优化,纯属正常现象...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:思想超越了宇宙,思考局限在利益。

35

主题

114

帖子

1

粉丝