求助,AVR Studio4.17+WinAVR-20100110, 多重if-else语句编译不正常!
如图中,黑色部分,直接被编译器忽略不处理。
2017年就碰到一样的情况了。当时时间紧直接改程序了。今天上论坛请教一下坛里的人,搞明白到底是哪里没设置好,还是编译软件本身有bug WinAVR 经常性的过度优化,建议检查 if() 里的 start_work_flash_add_enable 使用,是不是逻辑上为真什么的 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。会被编译器忽略的这种情况,但没看到他的解决方法,也可能他也还没解决这个问题 将上面所用到的所有变量定义为volatile, 也没解决此问题
这个变量是有符号数?看看反汇编 kebaojun305 发表于 2019-9-18 16:35
这个变量是有符号数?看看反汇编
谢谢回答!
volatile unsigned char start_work_flash_add_enable=0;//刚开始工作的前30秒闪灯用
参数都定义为volatile unsigned char ,但还是被忽略
优化等级也尝试更改过了。无效 程序不完整,有些变量是否在别的地方有修改也不清楚……
比较的是Blue*** , 而累加的是 Red*** 。没看到Blue*** 是否改变。那么假定Blue*** <40这个条件一直成立。而你的判断的标志位却受Blue*** 限制…… 这就是你的问题了
如果Blue*** 在程序中其它地方也是没修改的。 那么可以试试把Blue*** 变量也和Red*** 变量一样一起累加,这样 Red*** <40 就可以不成立。从而触发标志位,下一次就进入你说的那段被无视的程序中 我用feeling的单片机遇到类似。 rifjft 发表于 2019-9-18 19:17
程序不完整,有些变量是否在别的地方有修改也不清楚……
比较的是Blue*** , 而累加的是 Red*** 。没看到B ...
感谢你!
{:mad:}你说对了。 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居然执行得到不正确结果 {:lol:}火眼金睛,直接定位问题核心{:victory:}
if( Each_run_gap_pulse_value>0 )
{
Each_run_gap_pulse_value--;
}
else
{
Forward_run_over_pulse_value++;
}
这样行不行? 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--;
}
原来这个是不能正常工作的
summer2017 发表于 2019-9-18 21:30
感谢你!
你说对了。 blue***应该是red***, 前两天还正常,后来加功能改来改去,可能错改 ...
原因找到了,原来是一个模式, 灯光正常闪烁。这两天再增加两个模式, 新增的两个模式代码是从原来那个正常的模式改过来的。 mode==2这个模式的灯光改得不彻底。造成辨别blue***,改变的是red***. 粗心啊 代码没有注释,容易绕晕 我用ICCAVR的时候,不知道哪个版本,注释没去掉,还把注释部分的给编译了 已经有好些年没有用AVR了,快10年了,挺回忆刚出来那段时光的 Maurice 发表于 2019-9-19 08:35
我用ICCAVR的时候,不知道哪个版本,注释没去掉,还把注释部分的给编译了
{:sweat:}
我喜欢在{} 符号后面这样注释,方便查看 { //1
{//2
。。。。。。
}//2
} //1
难道也是注释搞的鬼? xjjiang 发表于 2019-9-19 09:44
已经有好些年没有用AVR了,快10年了,挺回忆刚出来那段时光的
前10年选择没现在多。 好多人都用过avr pic summer2017 发表于 2019-9-19 10:59
我喜欢在{} 符号后面这样注释,方便查看 { //1
...
记得不是行注释,是段注释出的问题 summer2017 发表于 2019-9-18 23:56
好像跟我原来这个没区别吧??
if( Each_run_gap_pulse_value==0 )
{
这类逻辑判断,直接测试就能确认。 接几个LED做状态指示就能直观……{:lol:}
而出问题的,多半是判断的条件或者次序没弄好……毕竟人的思维与编译器的识别是有区别的 看到这里是不是觉得编译器很牛X?{:lol:}
页:
[1]