arm-gcc编译的代码比armclang上的大

t5fffqht  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(182)

我在STM32CubeMx上生成了相同的项目,并添加了相同的代码

  • uint8_t* data = new uint8_t[16]
  • 无限循环中的HAL_DelayHAL_GPIO_TogglePin

用于Keil MDK项目和作为Makefile项目。在这两个项目中,main.c均更改为main.cpp
整个用户代码如下所示:

uint8_t* data;
    
    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
      MX_GPIO_Init();
      MX_USART3_UART_Init();
      MX_USB_OTG_FS_PCD_Init();
    
      data = new uint8_t[16];
      for(int i = 0; i < 16; i++)data[i] = i+1;
      
      while (1)
      {
        HAL_GPIO_TogglePin(LD3_GPIO_Port, GPIO_PIN_14);
        HAL_Delay(500);
      }
    }

在Keil中我使用armclang v6.19,在Makefile项目中我使用arm-none-eabi-gcc v12.2.1 20221205
我检查了使用不同优化标志的编译结果,结果如下:

  • O0

凯尔:

Program Size: Code=11950 RO-data=510 RW-data=12 ZI-data=3012

武装部队-海湾合作委员会:

text    data     bss     dec     hex 
 17572     100    3268   20940    51cc
  • 臭氧

凯尔:

Program Size: Code=8238 RO-data=510 RW-data=12 ZI-data=3012

武装部队-海湾合作委员会:

text    data     bss     dec     hex
 12448     100    3268   15816    3dc8
  • Oozie

凯尔:

Program Size: Code=6822 RO-data=510 RW-data=12 ZI-data=3012

武装部队-海湾合作委员会:

text    data     bss     dec     hex
 11876     100    3268   15244    3b8c

出现这种差异的原因是什么?我该如何解决?
我猜想,这些编译器中-O * 标志的含义不同,并且它们使用不同的优化器选项,但我不确定

tf7tbtn2

tf7tbtn21#

您正在比较两个完全不同的构建工具链,因此结果总是不同的。

凯尔

使用专有的armclang进行编译,使用armlink进行链接。armclangclang的一个分支,您可以在这里看到优化选项,但Arm有自己的here文档,因为它在顶部添加了一些专有的魔法酱料。

臂GCC

使用GNU编译器集合作为基础,您可以找到优化级别here的文档。没有2个文档,因为Arm积极为Arm GCC做出贡献。

相关问题