[技术问答] 碰到一个不可解释的问题,及其解决办法。

[复制链接]
1882|22
 楼主| windows100 发表于 2019-6-13 18:17 | 显示全部楼层 |阅读模式
使用的是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 | 显示全部楼层
对,你实际跑起来看看
heisexingqisi 发表于 2019-6-13 22:04 | 显示全部楼层
试试楼上的方法

评论

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

评论

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

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

评论

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

没有编译这一行

没有编译这一行

这个是有问题的

这个是有问题的

这个是没问题的

这个是没问题的
 楼主| windows100 发表于 2019-6-14 08:59 | 显示全部楼层
heisexingqisi 发表于 2019-6-13 22:04
对,你实际跑起来看看

看下面的截图
ayb_ice 发表于 2019-6-14 10:39 | 显示全部楼层
这有很多方法可以处理
变量使用volatile修饰,
看变量地址,直接看对应地址的内存,
将这个值赋值给其它变量,
看反汇编是否有编译的对应的代码,
。。。
laocuo1142 发表于 2019-6-14 15:40 | 显示全部楼层
十有**还是优化等级高了,变量定义有问题。楼上说的应该可行,用volatile修饰。
Harvard 发表于 2019-6-14 21:53 | 显示全部楼层
不知道是在哪里看的  periodical update有没有打勾 另外一定要把keil插件升级到最新的 6909 .
yiyigirl2014 发表于 2019-6-14 23:45 | 显示全部楼层
工程遗留问题。
apleilx 发表于 2019-6-15 11:36 | 显示全部楼层
要volatile修饰或者不开优化,否则结果未被使用的变量相关程序会被优化掉。
tianxj01 发表于 2019-6-15 15:51 | 显示全部楼层
我一直是在新唐提供的官方提供的Sample_Code环境下面直接修改,从来没发现这样的问题。
看表现,非常典型,是代码优化的事,编译器把分析没用到的东东,给咔嚓了。
出现这样问题,多琢磨没什么意思,反正肯定是环境造成,直接复制官方Sample_Code里面的一个工程,替换C文件就搞定。

评论

我也是用的官方的工程改,所以碰到这个问题蛮奇怪,后来我是放弃了这个工程,重新替换C文件弄了一个。我也没琢磨了,只是发出来大家讨论一下,假如大家碰到我一样的问题,好歹知道。  发表于 2019-6-17 13:50
dongnanxibei 发表于 2019-6-15 16:25 | 显示全部楼层
吓得我不敢自己创建工程了。
 楼主| windows100 发表于 2019-6-17 13:53 | 显示全部楼层
apleilx 发表于 2019-6-15 11:36
要volatile修饰或者不开优化,否则结果未被使用的变量相关程序会被优化掉。 ...

我觉得你们对volatile这个修饰符是不是有什么误会,这个的用法不是和硬件相关,且随时会变的时候才用吗,我这个是纯逻辑应用,一个劲说用这个修饰。你看了上面的代码,觉得那个变量需要这样修饰吗
apleilx 发表于 2019-6-18 12:04 | 显示全部楼层
本帖最后由 apleilx 于 2019-6-18 12:06 编辑
windows100 发表于 2019-6-17 13:53
我觉得你们对volatile这个修饰符是不是有什么误会,这个的用法不是和硬件相关,且随时会变的时候才用吗, ...

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

本版积分规则

13

主题

282

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部