搜索
bottom↓
回复: 19

求助,AVR Studio4.17+WinAVR-20100110, 多重if-else语句编译不正常!

[复制链接]

出0入0汤圆

发表于 2019-9-18 13:03:43 | 显示全部楼层 |阅读模式

如图中,黑色部分,直接被编译器忽略不处理。
2017年就碰到一样的情况了。当时时间紧直接改程序了。  今天上论坛请教一下坛里的人,搞明白到底是哪里没设置好,还是编译软件本身有bug

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出200入2554汤圆

发表于 2019-9-18 14:07:18 | 显示全部楼层
WinAVR 经常性的过度优化,建议检查 if() 里的 start_work_flash_add_enable 使用,是不是逻辑上为真什么的

出0入0汤圆

 楼主| 发表于 2019-9-18 16:05:21 | 显示全部楼层
t3486784401 发表于 2019-9-18 14:07
WinAVR 经常性的过度优化,建议检查 if() 里的 start_work_flash_add_enable 使用,是不是逻辑上为真什么的 ...

start_work_flash_add_enable  逻辑上没问题的。 就是控制一个led的闪烁。 前几天还能看到led正常闪,   今天增加了很多其他功能的代码,  再编译,发现led不闪了。确定上面黑色部分被编译器忽略了。  2017年也碰到过一模一样的情况。也是多重if-else


网上也发现另一网友碰到超过4重if-else。会被编译器忽略的这种情况,但没看到他的解决方法,也可能他也还没解决这个问题

出0入0汤圆

 楼主| 发表于 2019-9-18 16:09:03 | 显示全部楼层
将上面所用到的所有变量定义为volatile, 也没解决此问题

出0入8汤圆

发表于 2019-9-18 16:35:52 | 显示全部楼层
这个变量是有符号数?  看看反汇编

出0入0汤圆

 楼主| 发表于 2019-9-18 16:50:49 | 显示全部楼层
kebaojun305 发表于 2019-9-18 16:35
这个变量是有符号数?  看看反汇编

谢谢回答!

volatile unsigned char start_work_flash_add_enable=0;//刚开始工作的前30秒闪灯用
参数都定义为volatile unsigned char ,但还是被忽略
优化等级也尝试更改过了。无效

出0入0汤圆

发表于 2019-9-18 19:17:39 | 显示全部楼层
程序不完整,有些变量是否在别的地方有修改也不清楚……

比较的是Blue*** , 而累加的是 Red*** 。没看到Blue*** 是否改变。那么假定Blue*** <40这个条件一直成立。而你的判断的标志位却受Blue*** 限制…… 这就是你的问题了

如果Blue*** 在程序中其它地方也是没修改的。 那么可以试试把Blue*** 变量也和  Red*** 变量一样一起累加,这样 Red*** <40 就可以不成立。从而触发标志位,下一次就进入你说的那段被无视的程序中

出0入0汤圆

发表于 2019-9-18 19:34:26 | 显示全部楼层
我用feeling的单片机遇到类似。

出0入0汤圆

 楼主| 发表于 2019-9-18 21:30:31 | 显示全部楼层
rifjft 发表于 2019-9-18 19:17
程序不完整,有些变量是否在别的地方有修改也不清楚……

比较的是Blue*** , 而累加的是 Red*** 。没看到B ...

感谢你!
  你说对了。 blue***应该是red***,        前两天还正常,后来加功能改来改去,可能错改了red***。   再加上 2017年就碰到过四重的if-else结构的错误, 所以自以为是认为是上次一样的编译错误了。  根本没去想自己的代码上错误!



上次2017年碰到的问题:
原来写成这样的代码,执行不正确       
              if( Each_run_gap_pulse_value==0 )
                {
                    Forward_run_over_pulse_value++;
                }
                else
                {
                    Each_run_gap_pulse_value--;
                }

反而改成这样,才执行正确
              if( Each_run_gap_pulse_value==0 )
                {
                    Forward_run_over_pulse_value++;
                }
                //else
                if( Each_run_gap_pulse_value>0 )
                {
                    Each_run_gap_pulse_value--;
                }

无符号数,等于0和大于0,是互斥的。 用if-else居然执行得到不正确结果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-9-18 21:48:35 | 显示全部楼层
火眼金睛,直接定位问题核心

if( Each_run_gap_pulse_value>0 )
{
     Each_run_gap_pulse_value--;
}
else
{
     Forward_run_over_pulse_value++;
}

这样行不行?

出0入0汤圆

 楼主| 发表于 2019-9-18 23:56:45 | 显示全部楼层
rifjft 发表于 2019-9-18 21:48
火眼金睛,直接定位问题核心

if( Each_run_gap_pulse_value>0 )


好像跟我原来这个没区别吧??     
if( Each_run_gap_pulse_value==0 )
                {
                    Forward_run_over_pulse_value++;
                }
                else
                {
                    Each_run_gap_pulse_value--;
                }

原来这个是不能正常工作的

出0入0汤圆

 楼主| 发表于 2019-9-19 00:07:32 | 显示全部楼层
summer2017 发表于 2019-9-18 21:30
感谢你!
  你说对了。 blue***应该是red***,        前两天还正常,后来加功能改来改去,可能错改 ...

原因找到了,原来是一个模式, 灯光正常闪烁。  这两天再增加两个模式, 新增的两个模式代码是从原来那个正常的模式改过来的。   mode==2这个模式的灯光改得不彻底。造成辨别blue***,改变的是red***.   粗心啊

出105入79汤圆

发表于 2019-9-19 01:10:59 | 显示全部楼层
代码没有注释,容易绕晕

出0入0汤圆

发表于 2019-9-19 08:35:00 | 显示全部楼层
我用ICCAVR的时候,不知道哪个版本,注释没去掉,还把注释部分的给编译了

出0入0汤圆

发表于 2019-9-19 09:44:36 | 显示全部楼层
已经有好些年没有用AVR了,快10年了,挺回忆刚出来那段时光的

出0入0汤圆

 楼主| 发表于 2019-9-19 10:59:29 | 显示全部楼层
Maurice 发表于 2019-9-19 08:35
我用ICCAVR的时候,不知道哪个版本,注释没去掉,还把注释部分的给编译了


我喜欢在{} 符号后面这样注释,方便查看 { //1
                                                                      {//2
                                                                          。。。。。。
                                                                      }//2
                                                                 } //1

难道也是注释搞的鬼?

出0入0汤圆

 楼主| 发表于 2019-9-19 11:03:30 | 显示全部楼层
xjjiang 发表于 2019-9-19 09:44
已经有好些年没有用AVR了,快10年了,挺回忆刚出来那段时光的

前10年选择没现在多。 好多人都用过avr pic

出0入0汤圆

发表于 2019-9-19 13:19:37 | 显示全部楼层
summer2017 发表于 2019-9-19 10:59
我喜欢在{} 符号后面这样注释,方便查看 { //1
                                         ...

记得不是行注释,是段注释出的问题

出0入0汤圆

发表于 2019-9-19 15:31:17 | 显示全部楼层
summer2017 发表于 2019-9-18 23:56
好像跟我原来这个没区别吧??     
if( Each_run_gap_pulse_value==0 )
                {

这类逻辑判断,直接测试就能确认。 接几个LED做状态指示就能直观……

而出问题的,多半是判断的条件或者次序没弄好……毕竟人的思维与编译器的识别是有区别的

出0入0汤圆

发表于 2019-9-20 14:59:16 | 显示全部楼层
看到这里是不是觉得编译器很牛X?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 19:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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