这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » if(a==1)与if(a!=1)的实现区别?

共32条 2/4 1 2 3 4 跳转至
高工
2013-05-09 14:14:32     打赏
11楼
换一下位置就可以了,代码一应该是将语句(1)在第一次运行的时候优化掉了,以至于后期一直执行else后的语句(2),编译器太强大了

高工
2013-05-09 14:15:34     打赏
12楼
这种问题是我代码的错误,怪自己没有认真检查啊

高工
2013-05-09 14:18:22     打赏
13楼

不知道编译器还有这么强大的功能呢,以后可得小心了,多谢楼主的指点啊。

函数之所以读取输出管教的值是因为我想在中断中反转输出管脚。

这个如果操作寄存器的话来的更直接一些吧



专家
2013-05-09 14:18:58     打赏
14楼
遇到这种情况一般要设置断点查看变量的值,再做进一步判断。

高工
2013-05-09 14:21:07     打赏
15楼
对头,程序一由于编译器的优化功能在第一次执行if语句的时候将语句(1)优化掉了,以至于后期一直运行语句(2),多谢楼主指点,问题得到解决了,以后会注意编译器优化问题的,3Q

高工
2013-05-09 14:22:56     打赏
16楼
设置断点并单步执行了,只是没有注意到编译器的优化问题,受教育了,多谢楼主指点

专家
2013-05-09 14:27:14     打赏
17楼
编译器确实有时候会出这样的问题,不容易想得到。

高工
2013-05-09 15:23:02     打赏
18楼
主要还是自己写代码不认真,辛苦大家了

工程师
2013-05-09 16:40:16     打赏
19楼

应该不是编译器的问题,是函数GPIO_SetBits()与硬件之间的问题。

编译器不可能主动去改变程序的运行逻辑,除非有漏洞。


硬件中应该有个握手信号,限制了第一次启动必须先运行GPIO_SetBits()进行激活,如先运行reset将被一直禁止。

因此只要第一次运行的是GPIO_SetBits(),后面的无论先运行谁都不会被编译器优化掉,都能得到正确结果。


这是芯片寄存器的设置的一种有先后顺序的思想,跟芯片的功能的实现和时序有关。芯片手册应该有相应的说明,驱动程序就针对这些细节问题



高工
2013-05-09 17:18:07     打赏
20楼

也有可能不是优化的问题,若if(?==0)同样会执行紧接的辅零的操作,如下图:

然而if语句(?==1)的话就会绕过辅1的语句,一直执行辅零的语句,如下图:

正确代码应该如下图所示:

至于为什么会有的“优化”有的而又未“优化”,这样的话又绕到最初的问题了?


共32条 2/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]