日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux学习之ARM的三大工具链

發(fā)布時間:2025/3/21 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux学习之ARM的三大工具链 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

????學(xué)習(xí)linux的過程中,看到過多很多程序并且編譯過,使用過很多嵌入式集成開發(fā)平臺,如IAR,Keil MDK-ARM,DS-5等。有時候會遇到很奇怪的現(xiàn)象:對于同一種功能的代碼,不同的平臺下程序的框架大致相同,但是程序指令會不一樣;對源文件的編譯,連接等操作的指令也出出現(xiàn)不同;對于段section的含義表述相同呢,但是在編寫是語法不同;對于分散加載文件的含義表述相同,但是在編寫是語法不同;如上的等等問題都是因為:ARM的開發(fā)工具鏈的差異。

1. ARM現(xiàn)在主流的三大工具鏈

  • ARM RealView(armcc):ARM公司研發(fā)的一套包含編譯、調(diào)試和模擬的開發(fā)工具,需結(jié)合具體的開發(fā)平臺如uvision、eclipse或者CodeWarrior,形成集成開發(fā)環(huán)境來使用。uvision與 RealView 編譯工具的結(jié)合即成為REALVIEW MDKEclipse / Codewarrior與 RealView 編譯工具的結(jié)合即成為RVDS;

ADS

REALVIEW MDK

RVDS

公司

ARM

Keil(后被ARM收購)

ARM

版本

被RVDS取代

?持續(xù)更新

持續(xù)更新


???

破解情況

?有

工程管理

CodeWarrior IDE

nVision IDE

Eclipse/ CodeWarrior IDE

編譯器

ARM C compiler for ADS

ARM C/C++ Compiler (RVCT)

ARM C/C++ Compiler (RVCT)

調(diào)試器

ARM Extention Degugger(AXD)

NVision Degger

REALVIEW Degugger(RVD)

仿真器

ARMulator

nVision CPU & Peripheral Simulation

REALVIEW? ISS

硬件調(diào)試單元

Multi-ICE/wiggler

uLink /jlink

Realview ICE(RVI)/ Multi-ICE(3.1版本后不支持Multi-ICE)

支持調(diào)試協(xié)議

RDI


RDDI/RDI(3.1版本后不支持RDI)

  • IAR EWARM:Embedded Workbench for ARM 是IARSystems 公司為ARM 微處理器開發(fā)的一個集成開發(fā)環(huán)境。

其編譯器為IAR ARM C/C++ Compiler;匯編器為IAR ARM Assembler;連接器為IAR XLINK Linker。

  • GNU Compiler Collection(縮寫為GCC):GNU編譯器套件是GNU項目開發(fā)的編程語言編譯器GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本只能處理 C語言。GCC 很快地擴展,變得可處理 C++。后來又?jǐn)U展能夠支持更多編程語言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各類處理器架構(gòu)上的匯編語言等,所以改名GNU編譯器套件。GCC是一個編譯器套件,里面包含很多具體的工具,如GNU匯編器(as),GNU編譯器(cc等),GNU連接器(ld)等等,這些統(tǒng)稱為GUN工具鏈。使用GCC我認(rèn)為有2種方法:第一種是直接在linux開發(fā)環(huán)境下(如Ubuntu。Fedora等)安裝GCC等工具套件,然后直接使用;第二種是在windo平臺下,安裝相關(guān)開發(fā)平臺如Eclipse,然后其支持GCC等多種編譯器 。
[1] 關(guān)于GCC更加詳細(xì)的介請請參考:https://blog.csdn.net/oneqinglong/article/details/71108402和https://blog.csdn.net/ramacess/article/details/722662 [2] 在進(jìn)行l(wèi)inux開發(fā)時,對文件進(jìn)行編譯等操作用的都是arm-liux-gcc/ld等工具,那么gcc與arm-linux-gcc的交叉編譯請參見:https://blog.csdn.net/yz_cfm/article/details/76998958和https://www.cnblogs.com/zengkefu/p/6372282.html?utm_source=itdadao&utm_medium=referral(這個非常好)。


2.簡單例子:一個簡單的分散加載文件

(1)ARM RealView工具,REALVIEW MDK Keil平臺,分散加載文件為.scat:

這是一個標(biāo)準(zhǔn)的常用的分散加載文件,現(xiàn)在加注釋于后,方便以后查閱:

;****************************************************************************** ; SCATTER LOADING DEION ; ARM ; KEIL's uVision3 ; (RealView Microprocessor Developer Kit) ; Filename : LPC2378_Flash.scat ;****************************************************************************** LR_IROM1 0x00000000 0x00080000 ;; 第一個加載域,名字為LR_IROM1,起始 {                  ;;地址為0x0,大小為0x80000ER_IROM1 0x00000000 0x00080000 ;;加載域中的運行時域,名字為ER_IROM1 { ;; 起始地址為0x0,大小為0x80000vectors.o (VECT, +First) ;;將vectors.c編譯后生成的文件vectors.o中的代碼init.o (INIT) ;;以及init.o中的代碼* (+RO) ;;以及所有編譯生成的RO屬性的代碼全部存放在} ;;運行時域ER_IROM1指定的地址范圍內(nèi),存放方式:順序存放RW_IRAM1 0x40000000 0x0000e800  ;;這是第二個運行時域,功能同上 { ;;其中 *是代表具有()里面指定的屬性的全部數(shù)據(jù) *(+RW,+ZI) ;;與*功能相似的有.ANY,后面說明 } ;; The following declarations select the "two region model" ;;; A default __user_initial_stackheap() will be used ; ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {} ;;指定堆棧地址 ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {} }

(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-*/ /*定義內(nèi)部FLASH地址 */--/*定義內(nèi)部RAM地址 */ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;/*閃存起始地址*/ define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF;/*閃存結(jié)束地址---flash大小64k*/ define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;/*SRAM起始地址*/ define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF;/*SRAM結(jié)束地址---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字節(jié)對齊、大小__ICFEDIT_size_cstack__) define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; /* 下列語句定義所定義地址空間內(nèi)可完成的操作類型*/ initialize by copy { readwrite }; do not initialize { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; //__ICFEDIT_intvec_start__賦值給.intvec標(biāo)識符 place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP };

(3)GCC工具鏈,采用ld工具(交叉編譯采用arm-linux-ld),分散加載文件為.lds

SECTIONS { . = 0x50008000 //設(shè)置起始鏈接地址 . = ALIGN(4); //字節(jié)對齊設(shè)置 .text : { start.o (.text) /*設(shè)置代碼段的首文件*/ *(.text) //所有文件的代碼段 } . = ALIGN(4); //字節(jié)對齊設(shè)置 .data : { *(.data) //所有文件的數(shù)據(jù)段 } . = ALIGN(4); //字節(jié)對齊設(shè)置 bss_start = . ;//變量的使用 .bss : { *(.bss) //所有文件bss段 } bss_end = .; //變量的使用 }

3.簡單小結(jié)

? ? 根據(jù)上面的介紹,進(jìn)行嵌入式工程設(shè)計開發(fā)時,會遇到如上的問題,這取決于我們采用什么樣的嵌入式開發(fā)平臺;比如我們實驗室用的就有IAR和GCC兩種,其中IAR是用來編譯調(diào)試STM32程序的(一個大型的while(1)裸機程序),IAR可以與STM32芯片通過JTAG進(jìn)行在線調(diào)試,比較方便;GCC是在linux系統(tǒng)下安裝完成后直接使用的,并沒有安裝大型的開發(fā)平臺,這帶來了很多弊端:可以對uboot,kernel等文件編譯生成可執(zhí)行映像文件,但是在調(diào)試時很麻煩,只能把映像文件燒寫ARM板卡后,在板卡啟動時通過串口打印消息開看uboot和kernel文件是否正常。這種調(diào)試手段確實很落后,所以建議大家在盡心開發(fā)時,還是需要了解好相關(guān)的開發(fā)工具,工欲善其事,必先利其器。

????由于自身能力有限,本文章存在相關(guān)表述問題,希望大家能夠批評指正,相互交流,共同進(jìn)步!


總結(jié)

以上是生活随笔為你收集整理的linux学习之ARM的三大工具链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。