不知道编译器还有这么强大的功能呢,以后可得小心了,多谢楼主的指点啊。
函数之所以读取输出管教的值是因为我想在中断中反转输出管脚。
这个如果操作寄存器的话来的更直接一些吧
应该不是编译器的问题,是函数GPIO_SetBits()与硬件之间的问题。
编译器不可能主动去改变程序的运行逻辑,除非有漏洞。
硬件中应该有个握手信号,限制了第一次启动必须先运行GPIO_SetBits()进行激活,如先运行reset将被一直禁止。
因此只要第一次运行的是GPIO_SetBits(),后面的无论先运行谁都不会被编译器优化掉,都能得到正确结果。
这是芯片寄存器的设置的一种有先后顺序的思想,跟芯片的功能的实现和时序有关。芯片手册应该有相应的说明,驱动程序就针对这些细节问题
也有可能不是优化的问题,若if(?==0)同样会执行紧接的辅零的操作,如下图:
然而if语句(?==1)的话就会绕过辅1的语句,一直执行辅零的语句,如下图:
正确代码应该如下图所示:
至于为什么会有的“优化”有的而又未“优化”,这样的话又绕到最初的问题了?