stm32编译过程

在学习c语言时我们都知道,我们编写的c语言程序在编译的时候有4个步骤,即 预处理、编译、汇编、链接。

预处理就是将代码中的宏定义 和头文件进行展开, 生成.i文件

编译就是根据不同的编译参数对程序进行优化,将源文件变成汇编代码,生成.s文件

汇编即将编译生成的汇编代码进一步生成目标代码,即.o文件

链接就是将生成的.o文件和其他一些相关的系统提供的.o文件以及库文件链接起来生成可执行文件。

我们编写的stm32程序都是c语言编写的,因此他们的编译过程和c语言差不多。

keil在对stm32代码进行编译时使用了2个编译命令armasm和armcc。

armcc命令即将c语言源代码进行预处理编译汇编生成.o文件。

armasm命令是将汇编代码进行编译生成.o文件。

这两个命令的使用在keil工程的MDK-ARM文件夹下面,比如在下面工程中:
在这里插入图片描述
上图中的bat文件就是keil工程使用的用来编译我们的keil程序的批处理脚本,打开这个脚本文件如下图:
在这里插入图片描述
如上图所示,keil的编译脚本使用了armasm和armcc分别对我们的c代码和汇编代码进行编译

之后使用armlink命令对armcc和armasm生成的.o文件进行链接,生成axf文件(也可生成elf文件)。

最后一行使用fromelf命令将生成的axf文件转化为可以下载到单片机中的hex文件或者bin文件。上图中是由axf文件转化为hex文件,如果要转化为bin文件可以使用以下方式:

fromelf.exe --bin -o xxx.bin xxx.axf

后记:

在写这边博客时我查阅了几篇博客,链接如下:

http://www.manongjc.com/article/41999.html MDK的编译过程及文件类型

https://www.cnblogs.com/zhangsx/p/zhangsx_keil_tools_usage.html MDK的编译工具

https://www.cnblogs.com/llxbl/p/10944160.html bin、hex、elf、axf文件的区别

在看第一篇博客,里面介绍连接器时是这么写的,“链接,链接器 armlink 把各个.o 文件及库文件链接成一个映像文件“.axf”或“.elf””,即armlink命令会将.o文件链接成axf文件或者elf文件,然后我打开我的keil工程,发现生成的文件是axf文件,没有elf文件。

然后我就查了下axf文件和elf文件的区别(见第三篇博客),里面是这么写的, “axf和elf都是编译器生成的可执行文件。区别是:ADS编译出来的是AXF文件。gcc编译出来的是ELF文件。两者虽然很像,但还是有差别的。这是文件格式的差别,不涉及调试格式。”, 看到这里就有点懵了,keil的编译器不是ac5吗,为什么会生成的是axf呢,网上没找到答案,估计是因为ac5和ads编译器差不多吧!!

btw, 我之前看到keil的编译链里面有armcc, 然后我一直以为keil使用的编译器是gcc, 以为armcc是gcc的一部分,后来我才知道,keil使用的编译器是keil自己的, 叫arm compiler,简称ac, 我现在使用的是ac5, 目前ac6已经出来了,但是还没有用过,据说编译速度比ac5要快,后面试试。AC5和AC6差异即迁移注意事项介绍见下面链接:

https://www.21ic.com/article/886398.html#:~:text=%E7%94%A8%E4%BA%8E%E7%BC%96%E8%AF%91Coterx-M%E5%A4%84%E7%90%86%E5%99%A8%E7%9A%84%E7%BC%96%E8%AF%91%E5%99%A8%E5%BE%88%E5%A4%9A%EF%BC%8CArm%20Compiler%E5%B0%B1%E6%98%AF%E5%85%B6%E4%B8%AD%E4%B8%80%E4%B8%AA%EF%BC%8C%E5%B8%B8%E7%94%A8%E4%BA%8EKeil%20MDK%E3%80%81%20Arm%20Development%20Studio%EF%BC%88DS-5%EF%BC%89%E4%B8%AD%EF%BC%8C%E8%BF%98%E5%8F%AF%E7%94%A8%E4%BD%9C%E7%8B%AC%E7%AB%8B%E5%B7%A5%E5%85%B7%E9%93%BE%E5%AE%89%E8%A3%85%E3%80%82%20%E5%BD%93%E7%84%B6%EF%BC%8C%E9%99%A4%E4%BA%86Arm%20Compiler%EF%BC%8C%E9%92%88%E5%AF%B9Coterx-M%E7%9A%84%E7%BC%96%E8%AF%91%E5%99%A8%E8%BF%98%E6%9C%89%E5%BE%88%E5%A4%9A%EF%BC%8C%E6%AF%94%E5%A6%82%EF%BC%9AGNU,Compiler%E3%80%81CCS%20Compiler%E7%AD%89%E3%80%82%20armclang%EF%BC%9A%E5%9F%BA%E4%BA%8ELLVM%E5%92%8CClang%E6%8A%80%E6%9C%AF%E7%9A%84%E7%BC%96%E8%AF%91%E5%99%A8%E5%92%8C%E9%9B%86%E6%88%90%E6%B1%87%E7%BC%96%E5%99%A8%E3%80%82%20armasm%EF%BC%9Aarmasm%E8%AF%AD%E6%B3%95%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81%E7%9A%84%E6%97%A7%E7%89%88%E6%B1%87%E7%BC%96%E7%A8%8B%E5%BA%8F%E3%80%82%20%E5%B0%86armclang%E9%9B%86%E6%88%90%E6%B1%87%E7%BC%96%E7%A8%8B%E5%BA%8F%E7%94%A8%E4%BA%8E%E6%89%80%E6%9C%89%E6%96%B0%E7%9A%84%E6%B1%87%E7%BC%96%E6%96%87%E4%BB%B6%E3%80%82%20armar%EF%BC%9A%E4%BD%BFELF%E7%9B%AE%E6%A0%87%E6%96%87%E4%BB%B6%E9%9B%86%E5%8F%AF%E4%BB%A5%E4%B8%80%E8%B5%B7%E6%94%B6%E9%9B%86%E3%80%82%20armlink%EF%BC%9A%E5%B0%86%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%BA%93%E7%BB%84%E5%90%88%E5%9C%A8%E4%B8%80%E8%B5%B7%E4%BB%A5%E7%94%9F%E6%88%90%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E7%9A%84%E9%93%BE%E6%8E%A5%E5%99%A8%E3%80%82%20fromelf%EF%BC%9A%E9%95%9C%E5%83%8F%E8%BD%AC%E6%8D%A2%E7%A8%8B%E5%BA%8F%E5%92%8C%E5%8F%8D%E6%B1%87%E7%BC%96%E7%A8%8B%E5%BA%8F%E3%80%82

版权声明:本文为CSDN博主「hugo33」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hugo33/article/details/122504319

在学习c语言时我们都知道,我们编写的c语言程序在编译的时候有4个步骤,即 预处理、编译、汇编、链接。

预处理就是将代码中的宏定义 和头文件进行展开, 生成.i文件

编译就是根据不同的编译参数对程序进行优化,将源文件变成汇编代码,生成.s文件

汇编即将编译生成的汇编代码进一步生成目标代码,即.o文件

链接就是将生成的.o文件和其他一些相关的系统提供的.o文件以及库文件链接起来生成可执行文件。

我们编写的stm32程序都是c语言编写的,因此他们的编译过程和c语言差不多。

keil在对stm32代码进行编译时使用了2个编译命令armasm和armcc。

armcc命令即将c语言源代码进行预处理编译汇编生成.o文件。

armasm命令是将汇编代码进行编译生成.o文件。

这两个命令的使用在keil工程的MDK-ARM文件夹下面,比如在下面工程中:
在这里插入图片描述
上图中的bat文件就是keil工程使用的用来编译我们的keil程序的批处理脚本,打开这个脚本文件如下图:
在这里插入图片描述
如上图所示,keil的编译脚本使用了armasm和armcc分别对我们的c代码和汇编代码进行编译

之后使用armlink命令对armcc和armasm生成的.o文件进行链接,生成axf文件(也可生成elf文件)。

最后一行使用fromelf命令将生成的axf文件转化为可以下载到单片机中的hex文件或者bin文件。上图中是由axf文件转化为hex文件,如果要转化为bin文件可以使用以下方式:

fromelf.exe --bin -o xxx.bin xxx.axf

后记:

在写这边博客时我查阅了几篇博客,链接如下:

http://www.manongjc.com/article/41999.html MDK的编译过程及文件类型

https://www.cnblogs.com/zhangsx/p/zhangsx_keil_tools_usage.html MDK的编译工具

https://www.cnblogs.com/llxbl/p/10944160.html bin、hex、elf、axf文件的区别

在看第一篇博客,里面介绍连接器时是这么写的,“链接,链接器 armlink 把各个.o 文件及库文件链接成一个映像文件“.axf”或“.elf””,即armlink命令会将.o文件链接成axf文件或者elf文件,然后我打开我的keil工程,发现生成的文件是axf文件,没有elf文件。

然后我就查了下axf文件和elf文件的区别(见第三篇博客),里面是这么写的, “axf和elf都是编译器生成的可执行文件。区别是:ADS编译出来的是AXF文件。gcc编译出来的是ELF文件。两者虽然很像,但还是有差别的。这是文件格式的差别,不涉及调试格式。”, 看到这里就有点懵了,keil的编译器不是ac5吗,为什么会生成的是axf呢,网上没找到答案,估计是因为ac5和ads编译器差不多吧!!

btw, 我之前看到keil的编译链里面有armcc, 然后我一直以为keil使用的编译器是gcc, 以为armcc是gcc的一部分,后来我才知道,keil使用的编译器是keil自己的, 叫arm compiler,简称ac, 我现在使用的是ac5, 目前ac6已经出来了,但是还没有用过,据说编译速度比ac5要快,后面试试。AC5和AC6差异即迁移注意事项介绍见下面链接:

https://www.21ic.com/article/886398.html#:~:text=%E7%94%A8%E4%BA%8E%E7%BC%96%E8%AF%91Coterx-M%E5%A4%84%E7%90%86%E5%99%A8%E7%9A%84%E7%BC%96%E8%AF%91%E5%99%A8%E5%BE%88%E5%A4%9A%EF%BC%8CArm%20Compiler%E5%B0%B1%E6%98%AF%E5%85%B6%E4%B8%AD%E4%B8%80%E4%B8%AA%EF%BC%8C%E5%B8%B8%E7%94%A8%E4%BA%8EKeil%20MDK%E3%80%81%20Arm%20Development%20Studio%EF%BC%88DS-5%EF%BC%89%E4%B8%AD%EF%BC%8C%E8%BF%98%E5%8F%AF%E7%94%A8%E4%BD%9C%E7%8B%AC%E7%AB%8B%E5%B7%A5%E5%85%B7%E9%93%BE%E5%AE%89%E8%A3%85%E3%80%82%20%E5%BD%93%E7%84%B6%EF%BC%8C%E9%99%A4%E4%BA%86Arm%20Compiler%EF%BC%8C%E9%92%88%E5%AF%B9Coterx-M%E7%9A%84%E7%BC%96%E8%AF%91%E5%99%A8%E8%BF%98%E6%9C%89%E5%BE%88%E5%A4%9A%EF%BC%8C%E6%AF%94%E5%A6%82%EF%BC%9AGNU,Compiler%E3%80%81CCS%20Compiler%E7%AD%89%E3%80%82%20armclang%EF%BC%9A%E5%9F%BA%E4%BA%8ELLVM%E5%92%8CClang%E6%8A%80%E6%9C%AF%E7%9A%84%E7%BC%96%E8%AF%91%E5%99%A8%E5%92%8C%E9%9B%86%E6%88%90%E6%B1%87%E7%BC%96%E5%99%A8%E3%80%82%20armasm%EF%BC%9Aarmasm%E8%AF%AD%E6%B3%95%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81%E7%9A%84%E6%97%A7%E7%89%88%E6%B1%87%E7%BC%96%E7%A8%8B%E5%BA%8F%E3%80%82%20%E5%B0%86armclang%E9%9B%86%E6%88%90%E6%B1%87%E7%BC%96%E7%A8%8B%E5%BA%8F%E7%94%A8%E4%BA%8E%E6%89%80%E6%9C%89%E6%96%B0%E7%9A%84%E6%B1%87%E7%BC%96%E6%96%87%E4%BB%B6%E3%80%82%20armar%EF%BC%9A%E4%BD%BFELF%E7%9B%AE%E6%A0%87%E6%96%87%E4%BB%B6%E9%9B%86%E5%8F%AF%E4%BB%A5%E4%B8%80%E8%B5%B7%E6%94%B6%E9%9B%86%E3%80%82%20armlink%EF%BC%9A%E5%B0%86%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%BA%93%E7%BB%84%E5%90%88%E5%9C%A8%E4%B8%80%E8%B5%B7%E4%BB%A5%E7%94%9F%E6%88%90%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E7%9A%84%E9%93%BE%E6%8E%A5%E5%99%A8%E3%80%82%20fromelf%EF%BC%9A%E9%95%9C%E5%83%8F%E8%BD%AC%E6%8D%A2%E7%A8%8B%E5%BA%8F%E5%92%8C%E5%8F%8D%E6%B1%87%E7%BC%96%E7%A8%8B%E5%BA%8F%E3%80%82

版权声明:本文为CSDN博主「hugo33」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hugo33/article/details/122504319

生成海报
点赞 0

hugo33

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

ESP32S2+ES8388移植过程及问题

电路图如下, 有点小瑕疵ES8388_VMID PIN10/19/20电容没有忘加,查资料应该不影响语言输出,可能噪音大,如果能导致不输出请告诉我一下。 ESP32S2管脚映射 这里主

STM32F4最小系统硬件设计

对于硬件工程师来讲,想要入门STM32相关的开发,我想除了深入阅读一下STM32的数据手册外,最实用且有效的方法就是自己实际做一个STM32的最小系统板了。本文将以一个小的STM32F427VG的电路最

HAL 层简介

简介: HAL层又称硬件抽象层,HAL层在Android体系中有着深远的意义,因为Android究竟是完 全开源还是完全不开源的秘密就在这一层·Google将硬件厂商的驱动程序放在这一层&#xff0c