我在STM32CubeMx上生成了相同的项目,并添加了相同的代码
uint8_t* data = new uint8_t[16]
- 无限循环中的
HAL_Delay
和HAL_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 * 标志的含义不同,并且它们使用不同的优化器选项,但我不确定
1条答案
按热度按时间tf7tbtn21#
您正在比较两个完全不同的构建工具链,因此结果总是不同的。
凯尔
使用专有的
armclang
进行编译,使用armlink
进行链接。armclang
是clang
的一个分支,您可以在这里看到优化选项,但Arm有自己的here文档,因为它在顶部添加了一些专有的魔法酱料。臂GCC
使用GNU编译器集合作为基础,您可以找到优化级别here的文档。没有2个文档,因为Arm积极为Arm GCC做出贡献。