linux学习之ARM的三大工具链
前言
????學習linux的過程中,看到過多很多程序并且編譯過,使用過很多嵌入式集成開發平臺,如IAR,Keil MDK-ARM,DS-5等。有時候會遇到很奇怪的現象:對于同一種功能的代碼,不同的平臺下程序的框架大致相同,但是程序指令會不一樣;對源文件的編譯,連接等操作的指令也出出現不同;對于段section的含義表述相同呢,但是在編寫是語法不同;對于分散加載文件的含義表述相同,但是在編寫是語法不同;如上的等等問題都是因為:ARM的開發工具鏈的差異。
1. ARM現在主流的三大工具鏈
- ARM RealView(armcc):ARM公司研發的一套包含編譯、調試和模擬的開發工具,需結合具體的開發平臺如uvision、eclipse或者CodeWarrior,形成集成開發環境來使用。uvision與 RealView 編譯工具的結合即成為REALVIEW MDK;Eclipse / Codewarrior與 RealView 編譯工具的結合即成為RVDS;
ADS | REALVIEW MDK | RVDS | |
公司 | ARM | Keil(后被ARM收購) | ARM |
版本 | 被RVDS取代 | ?持續更新 | 持續更新 |
| ? | ? | ? |
破解情況 | 有 | ?有 | 有 |
工程管理 | CodeWarrior IDE | nVision IDE | Eclipse/ CodeWarrior IDE |
編譯器 | ARM C compiler for ADS | ARM C/C++ Compiler (RVCT) | ARM C/C++ Compiler (RVCT) |
調試器 | ARM Extention Degugger(AXD) | NVision Degger | REALVIEW Degugger(RVD) |
仿真器 | ARMulator | nVision CPU & Peripheral Simulation | REALVIEW? ISS |
硬件調試單元 | Multi-ICE/wiggler | uLink /jlink | Realview ICE(RVI)/ Multi-ICE(3.1版本后不支持Multi-ICE) |
支持調試協議 | RDI | RDDI/RDI(3.1版本后不支持RDI) |
- IAR EWARM:Embedded Workbench for ARM 是IARSystems 公司為ARM 微處理器開發的一個集成開發環境。
其編譯器為IAR ARM C/C++ Compiler;匯編器為IAR ARM Assembler;連接器為IAR XLINK Linker。
- GNU Compiler Collection(縮寫為GCC):GNU編譯器套件是GNU項目開發的編程語言編譯器。GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本只能處理 C語言。GCC 很快地擴展,變得可處理 C++。后來又擴展能夠支持更多編程語言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各類處理器架構上的匯編語言等,所以改名GNU編譯器套件。GCC是一個編譯器套件,里面包含很多具體的工具,如GNU匯編器(as),GNU編譯器(cc等),GNU連接器(ld)等等,這些統稱為GUN工具鏈。使用GCC我認為有2種方法:第一種是直接在linux開發環境下(如Ubuntu。Fedora等)安裝GCC等工具套件,然后直接使用;第二種是在windo平臺下,安裝相關開發平臺如Eclipse,然后其支持GCC等多種編譯器 。
2.簡單例子:一個簡單的分散加載文件
(1)ARM RealView工具,REALVIEW MDK Keil平臺,分散加載文件為.scat:
這是一個標準的常用的分散加載文件,現在加注釋于后,方便以后查閱:
(2)IAR EWARM工具,IRA平臺,分散加載文件為.scf:
/*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000;/*中斷向量表開始地址*/ /*-Memory Regions-*/ /*定義內部FLASH地址 */--/*定義內部RAM地址 */ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;/*閃存起始地址*/ define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF;/*閃存結束地址---flash大小64k*/ define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;/*SRAM起始地址*/ define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF;/*SRAM結束地址---SRAM大小20k*/ /*-Sizes-*//* 棧和堆大小*/ define symbol __ICFEDIT_size_cstack__ = 0x800; /*棧大小*/ define symbol __ICFEDIT_size_heap__ = 0x800;/*堆大小*/ /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };//CSTACK塊屬性(8字節對齊、大小__ICFEDIT_size_cstack__) define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; /* 下列語句定義所定義地址空間內可完成的操作類型*/ initialize by copy { readwrite }; do not initialize { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; //__ICFEDIT_intvec_start__賦值給.intvec標識符 place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP };(3)GCC工具鏈,采用ld工具(交叉編譯采用arm-linux-ld),分散加載文件為.lds
SECTIONS { . = 0x50008000 //設置起始鏈接地址 . = ALIGN(4); //字節對齊設置 .text : { start.o (.text) /*設置代碼段的首文件*/ *(.text) //所有文件的代碼段 } . = ALIGN(4); //字節對齊設置 .data : { *(.data) //所有文件的數據段 } . = ALIGN(4); //字節對齊設置 bss_start = . ;//變量的使用 .bss : { *(.bss) //所有文件bss段 } bss_end = .; //變量的使用 }3.簡單小結
? ? 根據上面的介紹,進行嵌入式工程設計開發時,會遇到如上的問題,這取決于我們采用什么樣的嵌入式開發平臺;比如我們實驗室用的就有IAR和GCC兩種,其中IAR是用來編譯調試STM32程序的(一個大型的while(1)裸機程序),IAR可以與STM32芯片通過JTAG進行在線調試,比較方便;GCC是在linux系統下安裝完成后直接使用的,并沒有安裝大型的開發平臺,這帶來了很多弊端:可以對uboot,kernel等文件編譯生成可執行映像文件,但是在調試時很麻煩,只能把映像文件燒寫ARM板卡后,在板卡啟動時通過串口打印消息開看uboot和kernel文件是否正常。這種調試手段確實很落后,所以建議大家在盡心開發時,還是需要了解好相關的開發工具,工欲善其事,必先利其器。
????由于自身能力有限,本文章存在相關表述問題,希望大家能夠批評指正,相互交流,共同進步!
總結
以上是生活随笔為你收集整理的linux学习之ARM的三大工具链的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F4启动流程分析
- 下一篇: 几个有用的配置文件