运行 Atmel Studio 及其提供的 gcc 6.3.1 为 Atmel/Microchip SAMV70 (ARM Cortex-M7) 芯片构建固件。我有使用 . 将 4 字节输入数组与 4 字节本地数组进行比较的代码memcmp()
。当编译-O0
为禁用优化时,它可以正常工作。当编译-Os
为优化大小或使用-O3
最大优化时,编译器将memcmp()
调用替换为直接的 4 字节比较(通过检查反汇编进行验证)。不幸的是,优化有时还会将本地 4 字节数组移动到未对齐的起始地址,因此虽然可以正常工作,但由于未对齐访问 memcmp()
,直接比较会触发 a 。HardFault
在我看来,这是 100% 的编译器优化错误(可能是 gcc,可能是 Atmel 添加的),但我坚持使用提供的编译器,因此无法选择更新。所以这是我的实际问题:有没有办法保持优化启用但禁用此特定优化?否则,我会被迫强制本地 4 字节数组对齐 4 字节或寻找其他解决方法。
编译器版本:
gcc version 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437] (Atmel build: 508)
这是一个可能触发故障的示例函数:
bool example(uint8_t *input_data)
{
uint8_t local_data[4] = { 0x00, 0x01, 0x02, 0x03 };
return (memcmp(input_data, local_data, 4) == 0);
}
我的代码总是以 4 字节对齐的方式传递,input_data
所以这不是问题,但编译器优化再一次认为这是理所当然的,这是一种不好的形式。