文章目录
前言
最近尝试了两种不同的方法都能够VScode编译生成STM32代码,有点好奇不同的编译方式的区别。文章从编译方式、编译速度、编译结果分别进行对比
一、工程简介
我使用STM32CUBEmx生成了一段代码,芯片选择STM32F108ZET6,初始化了GPIOB5、GPIOE5作为LDE控制引脚,其余外设配置保持默认。
主函数实现了一段跑马灯测试程序,内容如下:
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);//LED0翻转
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);//LED1翻转
HAL_Delay(2000);//延时2000ms
/* USER CODE BEGIN 3 */
}
二、MDK表现
1.编译方式
首先使用MDK进行编译,对MDK进行如下设置:
1、需要能够生成DEBUG信息、需要输出HEX文件、需要生成引用信息
2、系统优化等级为3级
另外,测试过程发现一个奇怪的情况,MDK打开Options for Target 的Utilities标签页的时候会卡死,等一会儿自己就恢复了,不知道大家遇见过没有。
2.编译结果
编译输出如下:
linking...
Program Size: Code=2860 RO-data=352 RW-data=16 ZI-data=1632
FromELF: creating hex file...
"LED\LED.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:22
编译输出文件大小如下:
三、VScode+OPENocd表现
1.编译方式
该方法为我初次尝试,具体参考B站视频 BV1Gt4y1D74k
2.编译结果
此处采用直接终端输入make的方法进行编译,编译器输出如下:
arm-none-eabi-size build/LED.elf
text data bss dec hex filename
3692 20 1572 5284 14a4 build/LED.elf
arm-none-eabi-objcopy -O ihex build/LED.elf build/LED.hex
arm-none-eabi-objcopy -O binary -S build/LED.elf build/LED.bin
这种方式同时输出了elf、hex、bin文件,算是小优点,编译器没有输出编译时间,不知道是不是我没设置好的问题,后面再研究一下。
编译输出文件大小如下:
三、VScode+扩展市场的Keil Assistant插件表现
1.编译方式
该方法为我初次尝试,具体参考B站视频 BV1xU4y1G7Xz
2.编译结果
VScode编译器输出如下:
> D:\MDK5\UV4\UV4.exe -b c:\Users\PC\Desktop\LED\MDK-ARM\LED.uvprojx -j0 -t LED -o c:\Users\PC\Desktop\LED\MDK-ARM\.vscode\uv4.log
Build target 'LED'
compiling main.c...
linking...
Program Size: Code=2860 RO-data=352 RW-data=16 ZI-data=1632
FromELF: creating hex file...
"LED\LED.axf" - 0 Error(s), 0 Warning(s).
这种方式直接调用了MDK原有的编译器,输出结果也完全一致,其次无法通过VScode调试有点不方便,但是这个方法是去使用VScode是最简单最快捷的一种方法,初学者建议此方法。
编译输出文件大小如下:
四、总结
测试使用三种方法编译同一段流水灯代码,横向对比结果如下:
方法 | 产生文件 | 编译速度 |
---|---|---|
MDK | .hex/.afx | 较快 |
VScode+OPENocd | .hex/.bin/.elf | 一般(但是编译工具环境配置非常复杂) |
VScode+Keil Assistant | /hex/.afx | 较快 |
新手入门建议使用MDK进行学习、编译,扎扎实实学基础,MDK资料一抓一大把,各种问题前辈都出现过,抄一抄就能用。
第二种方法适用于版权问题以及大佬搞活,第二种方法建立于开源编译器之上,能够绕过MDK版权纠纷,但是工程配置繁琐,对编译器原理有基础要求,且产生代码优化较差。
入门后希望简单配置更换编译器推荐第三种方法就能快速体验上手VScode,体验生产力升级的快感。这种方法的缺点是还是需要使用MDK进行DEBUG,但是MDK和VScode是可以同时编译同一个工程的,可以无缝切换,非常的NICE。