MDK編譯過程簡介

郑智慧 2024-05-19 00:00 7次浏览 0 条评论 taohigo.com

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 的編譯過程如下圖所示:

  1. 編譯,MDK 軟件使用的編譯器是armcc 和armasm,它們根據每個c/c++和匯編源文件編譯成對應的以“.o”為後綴名的對象文件(Object Code,也稱目標文件),其內容主要是從源文件編譯得到的機器碼,包含瞭代碼、數據以及調試使用的信息;
  2. 鏈接,鏈接器armlink 把各個.o 文件及庫文件鏈接成一個映像文件“.axf”或“.elf”;
  3. 格式轉換,一般來說Windows 或Linux 系統使用鏈接器直接生成可執行映像文件elf後,內核根據該文件的信息加載後,就可以運行程序瞭,但在單片機平臺上,需要把該文件的內容加載到芯片上,所以還需要對鏈接器生成的elf 映像文件利用格式轉換器fromelf 轉換成“.bin”或“.hex”文件,交給下載器下載到芯片的FLASH 或ROM 中。

MDK編譯過程MDK編譯工程時的編譯提示

MDK編譯工程時的編譯提示可以分為六個部分:

  1. 提示信息的第一部分說明構建過程調用的編譯器。圖中的編譯器名字是“V5.05 update 2”,後面附帶瞭該編譯器所在的文件夾。在電腦上打開該路徑,可看到該編譯器包。
  2. 使用armasm編譯匯編文件。圖中列出瞭編譯startup 啟動文件時的提示,編譯後每個匯編源文件都對應有一個獨立的.o 文件。
  3. 使用armcc 編譯c/c++文件。圖中列出瞭工程中所有的c/c++文件的提示,同樣地,編譯後每個c/c++源文件都對應有一個獨立的.o 文件。
  4. 使用armlink 鏈接對象文件,根據程序的調用把各個.o 文件的內容鏈接起來,最後生成程序的axf 映像文件,並附帶程序各個域大小的說明,包括Code(代碼,存放在flash中)、RO-data(常量,存放在flash中)、RW-data(初始值非0的全局變量,存放在flash中,運行時加載到SRAM中)及ZI-data(初始值為0的全局變量,不存儲,運行時在SRAM中開辟對應空間)的大小。
  5. 使用fromelf 生成下載格式文件,它根據axf 映像文件轉化成hex 文件,並列出編譯過程出現的錯誤(Error)和警告(Warning)數量。
  6. 最後一段提示給出瞭整個構建過程消耗的時間。

參考

  1. ^百度百科-keil mdk https://baike.baidu.com/item/keil%20mdk/8053029?fr=aladdin
  2. ^米爾科技 http://www.myir-tech.com/product/mdk-arm.htm?bd_vid=11651149341045472177
  3. ^《零死角玩轉STM32—F103指南者》