打印
[技术问答]

碰到一个不可解释的问题,及其解决办法。

[复制链接]
1563|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用的是003,IDE是keil C51。问题是,程序编译后 0 error 0 warning,但是单步执行的时候,变量++,放到变量窗就是没反应,从如下方式尝试,改数据类型,从uint8 改为uint_16 ,从局部变量改为全局变量。这个变量就是没有反应。看汇编窗口,也不是按指令执行。开始怀疑是keil 出问题了,采取,电脑重启,无效。keil卸载重装,无效。最后重新,使用可以的工程,把需要的文件抠出来,添加到可以的工程里,改成需要的函数。尝试,可行。结论是工程出问题了。是什么问题不知道。现象是编译后不按窗口指令执行。希望我发出来对有需要的人又帮助

使用特权

评论回复
沙发
windows100|  楼主 | 2019-6-13 18:19 | 只看该作者
我也想到了可能是编译器优化的问题,所以在使用变量的时候有限制,并且把优化等级改为默认了。欢迎有知道原因的交流一下

使用特权

评论回复
板凳
xyz549040622| | 2019-6-13 19:21 | 只看该作者
你用串口输出这个变量值看看,我认为这才是最准确的。

使用特权

评论回复
地板
heisexingqisi| | 2019-6-13 22:04 | 只看该作者
对,你实际跑起来看看

使用特权

评论回复
5
heisexingqisi| | 2019-6-13 22:04 | 只看该作者
试试楼上的方法

使用特权

评论回复
评论
windows100 2019-6-14 08:45 回复TA
我换了工程,函数都是全部替换过来,问题就好了,为了上面的问题,我搞了2天,工程又催得急,最后用STM8出的样机。昨天是有时间了才又来琢磨这个事 
6
dongnanxibei| | 2019-6-13 23:46 | 只看该作者
你可能看错了地方,所以看不到

使用特权

评论回复
评论
windows100 2019-6-14 09:00 回复TA
看下面的截图, 
windows100 2019-6-14 08:43 回复TA
这么说吧,我把数据类型,数据名字都改了一圈都没用,如果你告诉我不能Debug不看到变量值我还可以理解,这样说看错了,我都想把工程添加进来,你们看看。 
7
windows100|  楼主 | 2019-6-14 08:41 | 只看该作者
xyz549040622 发表于 2019-6-13 19:21
你用串口输出这个变量值看看,我认为这才是最准确的。

我刚开始是全速跑,就是不能进行到下一步,所以Debug ,看起来那变量++,那一行都没有编译,是无效语句。修改了数据类型,编译了能设置断点了,但是变量值不改变。

使用特权

评论回复
评论
windows100 2019-6-14 08:49 回复TA
我的样板上串口当普通AD口了,不方便接线。我确认是工程坏了,只是不知道是哪里坏了。我把工程发给新唐的技术支持,他就回了个是好的。我让他远程帮我看一下,也没理我 -_- 
8
windows100|  楼主 | 2019-6-14 08:58 | 只看该作者
我把有问题的截图上来了,你们看一下,工程是不能传了。

好的汇编.png (30.61 KB )

这个是没问题的

这个是没问题的

有问题的汇编.png (32.4 KB )

这个是有问题的

这个是有问题的

不编译的C.png (86.92 KB )

没有编译这一行

没有编译这一行

使用特权

评论回复
9
windows100|  楼主 | 2019-6-14 08:59 | 只看该作者
heisexingqisi 发表于 2019-6-13 22:04
对,你实际跑起来看看

看下面的截图

使用特权

评论回复
10
ayb_ice| | 2019-6-14 10:39 | 只看该作者
这有很多方法可以处理
变量使用volatile修饰,
看变量地址,直接看对应地址的内存,
将这个值赋值给其它变量,
看反汇编是否有编译的对应的代码,
。。。

使用特权

评论回复
11
laocuo1142| | 2019-6-14 15:40 | 只看该作者
十有**还是优化等级高了,变量定义有问题。楼上说的应该可行,用volatile修饰。

使用特权

评论回复
12
Harvard| | 2019-6-14 21:53 | 只看该作者
不知道是在哪里看的  periodical update有没有打勾 另外一定要把keil插件升级到最新的 6909 .

使用特权

评论回复
13
yiyigirl2014| | 2019-6-14 23:45 | 只看该作者
工程遗留问题。

使用特权

评论回复
14
apleilx| | 2019-6-15 11:36 | 只看该作者
要volatile修饰或者不开优化,否则结果未被使用的变量相关程序会被优化掉。

使用特权

评论回复
15
tianxj01| | 2019-6-15 15:51 | 只看该作者
我一直是在新唐提供的官方提供的Sample_Code环境下面直接修改,从来没发现这样的问题。
看表现,非常典型,是代码优化的事,编译器把分析没用到的东东,给咔嚓了。
出现这样问题,多琢磨没什么意思,反正肯定是环境造成,直接复制官方Sample_Code里面的一个工程,替换C文件就搞定。

使用特权

评论回复
评论
windows100 2019-6-17 13:50 回复TA
我也是用的官方的工程改,所以碰到这个问题蛮奇怪,后来我是放弃了这个工程,重新替换C文件弄了一个。我也没琢磨了,只是发出来大家讨论一下,假如大家碰到我一样的问题,好歹知道。 
16
dongnanxibei| | 2019-6-15 16:25 | 只看该作者
吓得我不敢自己创建工程了。

使用特权

评论回复
17
windows100|  楼主 | 2019-6-17 13:53 | 只看该作者
apleilx 发表于 2019-6-15 11:36
要volatile修饰或者不开优化,否则结果未被使用的变量相关程序会被优化掉。 ...

我觉得你们对volatile这个修饰符是不是有什么误会,这个的用法不是和硬件相关,且随时会变的时候才用吗,我这个是纯逻辑应用,一个劲说用这个修饰。你看了上面的代码,觉得那个变量需要这样修饰吗

使用特权

评论回复
18
apleilx| | 2019-6-18 12:04 | 只看该作者
本帖最后由 apleilx 于 2019-6-18 12:06 编辑
windows100 发表于 2019-6-17 13:53
我觉得你们对volatile这个修饰符是不是有什么误会,这个的用法不是和硬件相关,且随时会变的时候才用吗, ...

volatile只有一个意思,就是不对该变量进行任何优化,没有任何其他附带意义。硬件寄存器操作顺序不允许打乱,并且必须被操作,所以用volatile。没用volatile时,你定义一个变量如果计算后结果未使用,只要开了优化,这段程序必定被优化掉,相当于没执行,优化等级-O0除外。实际上结果未用时,这段程序执行与否对整个项目来说毫无影响,你只是为了看中间结果才会发现差异。

使用特权

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

本版积分规则

13

主题

277

帖子

1

粉丝