我有一个项目,我使用TWI接口与某些设备进行通信。 像我的许多其他项目一样,这个项目正在使用很久以前编写的用于通信的库,并且可靠。 有趣的是,在这个项目的中间,avr-gcc决定优化每个向变量赋值0的指令。 我们来看看他的代码:
_hd44780_data.expander_data[0] = 0x06;
_hd44780_data.expander_data[1] = 0x00;
_hd44780_data.expander_data[2] = 0x1F;
twi_write(HD44780_EXPANDER, _hd44780_data.expander_data,
3, &_hd44780_data.twi_status);
gcc切断_hd44780_data.expander_data[1] = 0x00;
下面的代码,工作正常。
_hd44780_data.expander_data[0] = 0x06;
_hd44780_data.expander_data[1] = 0x05;
_hd44780_data.expander_data[1] -= 0x05;
_hd44780_data.expander_data[2] = 0x1F;
twi_write(HD44780_EXPANDER, _hd44780_data.expander_data,
3, &_hd44780_data.twi_status);
我认为它与优化有关。 我正在使用avr-gcc(WinAVR 20100110)4.3.3 这些是我的CFLAGS:
CFLAGS += -Os -mcall-prologues
CFLAGS += -ffreestanding
CFLAGS += -funit-at-a-time
CFLAGS += -finline-functions
CFLAGS += -fkeep-inline-functions
CFLAGS += -funsigned-char
CFLAGS += -funsigned-bitfields
CFLAGS += -fpack-struct
CFLAGS += -fshort-enums
CFLAGS += -Wall
CFLAGS += --std=gnu99
CFLAGS += -Wstrict-prototypes
CFLAGS += -mrelax
另一个是这个“优化”包括所有指令,不仅包括数组赋值。对我来说最令人费解的是,这种行为发生在项目的中间。另一件事是,这种“优化”不仅包括所有指令,还包括阵列分配。对我来说最令人费解的是,这种行为发生在项目的中间。我没有更改任何标志,我没有更新工具链。
但古代中国人的谚语说:“对你们两个人来说,编译是对的。”所以如果有人能指出我可能出错的地方,我们将不胜感激。