RT-Thread studio和Keil MDK同样的代码,生成的目标文件相差这么大?
RT-thread studio开发环境
前几年就看到了这个开发环境,当时下载下来安装一试,觉得不是很好用,学习成本很高,支持的芯片也不多,支持的调试工具也没几个。于是这期间一直使用VScode编辑器和MDK编译调试器的组合。直到看到有帖子推荐这个开发环境,才又重新安装试一下。
打开软件,确实很有进步的一点就是功能愈发丰富了。支持的芯片开发板也越来越多。编辑器的功能也很好用,调试也比较方便。
之前用MDK,编辑难受,建工程真的痛苦,界面真上古。但调试真好用呀。
后来尝试过VScode+PlatformIO的方式,也还不错,就是环境难以安装,调试没有那么友好。
RT-thread studio中令人惊艳的功能
- 可以和MDK、IAR、STM32CubeMX、PlatformIO直接对接。
- 建立工程真的很方便。
- 如果使用操作系统RT-thread,很多好用的组件可以使用。
- 界面真挺舒服。
- 相当强大的生态。
为什么ST的单片机销量这么猛,STM32CubeMX功不可没,太强了。
目标文件大的问题
首先上代码:
#include <stdio.h>
#include <board.h>
#include "CRC.h"
int main(void)
{
uint8_t CRC_data[]={0x12,0x34,0x23,0x45,0x34,0x56,0x45,0x67,0x56,0x78,0x67,0x89};
uint16_t CRC_res;
CRC_res = CRC_16(CRC_data, sizeof(CRC_data)/sizeof(CRC_data[0]));
printf("CRC result = %x\r\n", CRC_res);
while (1)
{
printf("Hello RT-Thread!\r\n");
wait_ms(1000);
}
return 0;
}
就这么点东西,编译出来的大小吓我一跳。
arm-none-eabi-size --format=berkeley "rtthread.elf"
text data bss dec hex filename
34252 2504 1184 37940 9434 rtthread.elf
Used Size(B) Used Size(KB)
Flash: 36756 B 35.89 KB
RAM: 3688 B 3.60 KB
16:21:39 Build Finished. 0 errors, 0 warnings. (took 708ms)
你没看错,仅仅只有使用到一个串口外设和RCC时钟的情况下,代码竟然有37K。
问题解决
后来查看了官方的手册。原因如下,在构建配置窗口下。
勾选上红色框内的勾以后再次编译,编译结果如下。
arm-none-eabi-size --format=berkeley "rtthread.elf"
text data bss dec hex filename
11404 496 1140 13040 32f0 rtthread.elf
Used Size(B) Used Size(KB)
Flash: 11900 B 11.62 KB
RAM: 1636 B 1.60 KB
16:19:41 Build Finished. 0 errors, 0 warnings. (took 2s.669ms)
当然这里只能使用printf输出整数,比如整数值,字符串等。如果要输出小数,还需要勾选Use float with nano printf选项。
问题原因
MDK使用的是ARMCC编译器,而RT-thread Studio使用的GCC编译器。
MDK的工程配置界面有一个勾选Use MicroLIB选项。这个MicroLIB是Keil针对系统自带的printf等函数做的针对嵌入式系统的优化。如果使用了"stdio.h","string.h"等库,勾选MicroLIB,你会发现目标文件大小有惊喜。
而GCC是开源库,调用的自然不是像MDK中那样针对嵌入式领域被优化的函数。
所以,使用了一个printf函数,造成代码大小翻了一倍的问题就出现了。