1 MDK-ARM概述
Keil MDK,也称MDK-ARM、Realview MDK、I-MDK、uVision5 等。MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。MDK-ARM有四个可用版本,分别是MDK-Lite、MDK-Basic、MDK-Standard、MDK-Professional。所有版本均提供一个完善的C / C++开发环境,其中MDK-Professional还包含大量的中间库[1]。Keil MDK5分成MDK Core和Software Packs两部分。MDK Core主要包含uVision5 IDE集成开发环境和ARM Compiler5。Software Packs则可以在不更换MDK Core的情况下,单独管理(下载、更新、移除)设备支持包和中间件更新包。
MDK功能特点[2]
- 完美支持Cortex-M V8、Cortex-M、Cortex-R4、ARM7和ARM9系列器件。
- 可使用在安全性较高要求的应用中和工程需要编译器长期支持的环境
- 业行领先的ARM C/C++编译工具链
- 提供前期虚拟器模型,满足新架构下软件验证
- 稳定的Keil RTX ,小封装实时操作系统(带源码)
- μVision5 IDE集成开发环境,调试器和仿真环境
- TCP/IP网络套件提供多种的协议和各种应用
- 保证IoT应用安全连接到互联网需要
- 提供带标准驱动类的USB 设备和USB 主机栈
- 为带图形用户接口的嵌入式系统提供了完善的GUI库支持
- ULINKpro可实时分析运行中的应用程序,且能记录Cortex-M指令的每一次执行
- 关于程序运行的完整代码覆蓋率信息
- 执行分析工具和性能分析器可使程序得到最优化
- 大量的项目例程帮助你快速熟悉MDK-ARM强大的内置功能
- DS-MDK Streamline实现Cortex-A/Cortex-M异构下的性能分析
- 符合CMSIS (Cortex微控制器软件接口标准)
2 ARM编译工具简介
在MDK 的帮助手册《ARM Development Tools》有编译工具的详细讲解,点击MDK 界面的“help->uVision Help”菜单可打开该文件。ARM编译工具链包含:
- ARM编译器(armcc)
- ARM汇编器(armasm)
- ARM链接器(armLink)
- ARM工具(armar & fromelf)
2.1 armcc
armcc 用于把c/c++文件编译成ARM 指令代码,编译后会输出ELF 格式的O文件(对象、目标文件),在命令行中输入“armcc”回车可调用该工具,它会打印帮助说明(如果想在任意目录下都能运行armcc命令,需要将arm编译器所在文件夹加载到系统变量中)。帮助提示中分三部分,第一部分是armcc 版本信息,第二部分是命令的用法,第三部分是主要命令选项[3]。
armcc的帮助提示
打开MDK的Options for Targe->c/c++菜单,可看到MDK对编译器的控制命令:
MDK 的ARMCC 编译选项
从该图中的命令可看到,它调用了-c、-cpu –D –g –O1 等编译选项,当我们修改MDK的编译配置时,可看到该控制命令也会有相应的变化。然而我们无法在该编译选项框中输入命令,只能通过MDK 提供的选项修改。
2.2 armasm
armasm 是汇编器,它把汇编文件编译成O 文件。与armcc 类似,MDK 对armasm 的调用选项可在“Option for Target->Asm”页面进行配置。
armasm 与MDK 的编译选项
2.3 armlink
armlink 是链接器,它把各个O 文件链接组合在一起生成ELF 格式的AXF 文件,AXF文件是可执行的,下载器把该文件中的指令代码下载到芯片后,该芯片就能运行程序了;利用armlink 还可以控制程序存储到指定的ROM 或RAM 地址。在MDK 中可在“Option for Target->Linker”页面配置armlink 选项。
armlink 与MDK 的配置选项
2.4 armar 和 fromelf
armar 工具用于把工程打包成库文件,fromelf 可根据axf 文件生成hex、bin 文件,hex和bin 文件是大多数下载器支持的下载文件格式。
MDK 中,控制fromelf 生成hex 及控制armar 生成lib 的配置
3 编译过程简介
MDK 的编译过程如下图所示:
- 编译,MDK 软件使用的编译器是armcc 和armasm,它们根据每个c/c++和汇编源文件编译成对应的以“.o”为后缀名的对象文件(Object Code,也称目标文件),其内容主要是从源文件编译得到的机器码,包含了代码、数据以及调试使用的信息;
- 链接,链接器armlink 把各个.o 文件及库文件链接成一个映像文件“.axf”或“.elf”;
- 格式转换,一般来说Windows 或Linux 系统使用链接器直接生成可执行映像文件elf后,内核根据该文件的信息加载后,就可以运行程序了,但在单片机平台上,需要把该文件的内容加载到芯片上,所以还需要对链接器生成的elf 映像文件利用格式转换器fromelf 转换成“.bin”或“.hex”文件,交给下载器下载到芯片的FLASH 或ROM 中。
MDK编译过程MDK编译工程时的编译提示
MDK编译工程时的编译提示可以分为六个部分:
- 提示信息的第一部分说明构建过程调用的编译器。图中的编译器名字是“V5.05 update 2”,后面附带了该编译器所在的文件夹。在电脑上打开该路径,可看到该编译器包。
- 使用armasm编译汇编文件。图中列出了编译startup 启动文件时的提示,编译后每个汇编源文件都对应有一个独立的.o 文件。
- 使用armcc 编译c/c++文件。图中列出了工程中所有的c/c++文件的提示,同样地,编译后每个c/c++源文件都对应有一个独立的.o 文件。
- 使用armlink 链接对象文件,根据程序的调用把各个.o 文件的内容链接起来,最后生成程序的axf 映像文件,并附带程序各个域大小的说明,包括Code(代码,存放在flash中)、RO-data(常量,存放在flash中)、RW-data(初始值非0的全局变量,存放在flash中,运行时加载到SRAM中)及ZI-data(初始值为0的全局变量,不存储,运行时在SRAM中开辟对应空间)的大小。
- 使用fromelf 生成下载格式文件,它根据axf 映像文件转化成hex 文件,并列出编译过程出现的错误(Error)和警告(Warning)数量。
- 最后一段提示给出了整个构建过程消耗的时间。
参考
- ^百度百科-keil mdk https://baike.baidu.com/item/keil%20mdk/8053029?fr=aladdin
- ^米尔科技 http://www.myir-tech.com/product/mdk-arm.htm?bd_vid=11651149341045472177
- ^《零死角玩转STM32—F103指南者》