MDK中ARM编译工具的原理

来源:互联网 发布:淘宝收藏加购有什么用 编辑:程序博客网 时间:2024/06/05 19:04

使用RealView 编译工具,对应用程序的开发:

1,主应用程序的c/c++源代码编译(ARMCC)。

2,近硬件组件汇编源代码(ARMASM),例如中断或启动文件。

3,将所有对象连接在一起,以生成印象(ARMLINK)。

4,将印象转换成纯二进制、intel HEX以及MOTOROLA-S格式的闪存格式(FROMELF)

下图展示出来如何链接ARM编译工具以及开发典型的应用程序

如在使用MDK编译stm32工程时,会注意到输出文件中存在的._i,._d等各类文件,这些文件即是

编译过程的中间文件。熟悉编译器的会知道在OUTPUT配置选项卡中存在一个Create Batch File选项

将会在工程目录下面生成一个.bat文件,记事本打开:

SET PATH=D:\Keil\ARM\ARMCC\bin\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\SET CPU_TYPE=STM32F103ZESET CPU_VENDOR=STMicroelectronicsSET UV2_TARGET=applicationSET CPU_CLOCK=0x007A1200"D:\Keil\ARM\ARMCC\bin\ArmCC" --Via ".\output\main.__i""D:\Keil\ARM\ARMCC\bin\ArmCC" --Via ".\output\stm32f10x_it.__i""D:\Keil\ARM\ARMCC\bin\ArmCC" --Via ".\output\system_stm32f10x.__i""D:\Keil\ARM\ARMCC\bin\ArmCC" --Via ".\output\usart.__i""D:\Keil\ARM\ARMCC\bin\ArmCC" --Via ".\output\core_cm3.__i""D:\Keil\ARM\ARMCC\bin\ArmAsm" --Via ".\output\startup_stm32f10x_hd._ia""D:\Keil\ARM\ARMCC\bin\ArmCC" --Via ".\output\misc.__i""D:\Keil\ARM\ARMCC\bin\ArmCC" --Via ".\output\stm32f10x_gpio.__i""D:\Keil\ARM\ARMCC\bin\ArmCC" --Via ".\output\stm32f10x_rcc.__i""D:\Keil\ARM\ARMCC\bin\ArmLink" --Via ".\output\application.lnp"D:\Keil\ARM\ARMCC\bin\fromelf.exe ".\output\application.axf" --i32combined --output ".\output\application.hex"D:\Keil\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\application.bin .\output\application.axf

整个编译过程是依据这个文件来实现的,使用ARMCC和ARMASM去编译工程中的.C和.A文件,编译后文件为.O,如上图。
接下来使用ARMLINK去将所有的.O文件链接起来,在mdk中链接完成后生成的是axf文件,也即是后来格式转换需要用的

文件。在bat文件后面两行既是使用FROMELF将axf转成hex后再转成文件。

接下来分析下._i文件:

-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I.\driver -I.\user -I..\core -I..\lib\inc -I..\lib\src -I D:\Keil\ARM\RV31\INC -I D:\Keil\ARM\CMSIS\Include -I D:\Keil\ARM\Inc\ST\STM32F10x -DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD -o ".\output\main.o" --omf_browse ".\output\main.crf" --depend ".\output\main.d" "user\main.c"

很明显的看出来这个是ARM编译工具的命令代码,详细的参考RealView®编译工具指南。-c为c文件编译,cpu类型是Cortex-M3
-I引入#include查询需要的目录,-D中定义整个工程预编译宏定义 接下来就是输出.o文件了。使用MDK会发现每个C或A文件对应有个._i

文件的存在。

接下来分析下lnp是怎么连接的,当然工具使用的是ARMLINK,现在看下lnp的真面目:

--cpu Cortex-M3 ".\output\main.o" ".\output\stm32f10x_it.o" ".\output\system_stm32f10x.o" ".\output\usart.o" ".\output\core_cm3.o" ".\output\startup_stm32f10x_hd.o" ".\output\misc.o" ".\output\stm32f10x_gpio.o" ".\output\stm32f10x_rcc.o" ".\output\stm32f10x_usart.o" ".\output\stm32f10x_flash.o" --strict --scatter ".\output\application.sct" --summary_stderr --info summarysizes --map --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers  --list ".\application.map" -o .\output\application.axf

首先列出所有需要连接的.O文件,生成map和axf文件,详细的参考ARMLINK链接工具指南。
当AXF文件生成了意味着编译过程已经完成,剩下的就是对文件转换的过程,不赘述。

至此当离开了编译器环境,手动编译单片机程序应该是没什么问题了,虽然一系列过程比较复杂,

但是对于单单使用工具来说,了解其工作原理还是有必要的。

原创粉丝点击