0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于ARM編譯器版本5的工程遷移與適配到ARM編譯器版本6.12

嵌入式那些事 ? 來源:嵌入式那些事 ? 2023-11-12 11:17 ? 次閱讀

為了描述方便,將ARM Compiler 5簡稱為AC5,將ARM Compiler 6.12簡稱AC6.12。

在公眾號中回復(fù)"arm編譯器升級文檔"可以獲取AC5升級到AC6.12的ARM官方文檔。

1、為什么要進(jìn)行ARM編譯器版本的更換

目前,AC5基本處于停止更新狀態(tài),如果想要使用AC5編譯器編譯新的ARM架構(gòu)或者內(nèi)核的代碼,基本是不可能了,因此自然要使用ARM Compiler 6來代替之前的ARM Compiler 5。

其實(shí),我自己覺得還有一個比較重要的原因,那就是AC6支持使用armclang編譯GNU語法格式的匯編代碼,這樣在以后的項(xiàng)目開發(fā)中,可以只編寫GNU語法格式的匯編代碼(不必像以前一樣還要再寫一份符合ARM語法格式的匯編代碼),這樣既可以使用ARM-GCC編譯工具鏈編譯這個項(xiàng)目,也可以使用ARM Compiler編譯這個項(xiàng)目,匯編代碼維護(hù)更加方便了。

2、AC6.12的組成

(1).armclang:armclang編譯器替代了AC5的armcc,并且具有如下優(yōu)點(diǎn):

  • 基于LLVM和Clang技術(shù);

  • 支持編譯GNU語法的匯編代碼;

  • 高度兼容當(dāng)初為GCC編譯的源代碼;

  • 實(shí)現(xiàn)包括ANSI/ISO C和C++,用于Arm架構(gòu)的ABI,用于64位Arm架構(gòu)的ABI以及Arm C語言擴(kuò)展(ACLE)等規(guī)范。

(2).armlink:功能豐富的專用嵌入式鏈接器,能夠?qū)ο蠛蛶旖M合在一起以生成可執(zhí)行文件。

(3).fromelf:鏡像文件轉(zhuǎn)換和反匯編功能。

(4).armar:壓縮程序。

(5).armasm:ARM語法的匯編代碼編譯器。

(6).ARM C和C++庫:ARM C庫經(jīng)過ARM公司的優(yōu)化有很好的的性能和代碼密度;ARM C++庫基于LLVM libc++項(xiàng)目。

下圖展示了ARM Compiler 6.12編譯工具鏈的整體結(jié)構(gòu):

fc221d00-8049-11ee-939d-92fbcf53809c.png

Snipaste_2019-12-05_14-30-03

3、ARM Compiler 5和ARM Compiler 6編譯工具鏈的差異

AC5和AC6的主要差異是AC6使用armclang代替了armcc,因此在AC6中就沒有armcc這個編譯工具了。并且armclang的編譯參數(shù)相對于之前的armcc的編譯參數(shù)也有許多不同。

下表列出了ARM Compiler 5和ARM Compiler 6之間各個工具的功能:

fc49582a-8049-11ee-939d-92fbcf53809c.png

Snipaste_2019-12-05_15-08-29

4、編譯工具鏈升級過程

其實(shí)將AC5更換為AC6.12編譯工具鏈,無非就是找出這兩個工具鏈的編譯參數(shù)的差異進(jìn)行修改即可。當(dāng)然了,基本上編譯參數(shù)變化還是挺大的,這里推薦大家參考如下手冊進(jìn)行編譯工具鏈升級。

參考手冊:《migration_and_compatibility_guide_100068_0612_00_en.pdf》。因?yàn)锳C5和AC6.12的差異主要體現(xiàn)在ARM Compiler 6使用armclang代替了armcc,因此這篇文章,可以重點(diǎn)關(guān)注Chapter 2和Chapter 3,當(dāng)然了也可以通過搜索一些編譯參數(shù)來快速定位。

5、我在升級過程遇到的問題

我在遷移一個項(xiàng)目使用AC6.12的過程中,主要還是參考《migration_and_compatibility_guide_100068_0612_00_en.pdf》文檔進(jìn)行參數(shù)修改,起初還算比較順利,但是涉及到匯編代碼的編譯過程中死活編譯會有問題。這里簡單的記錄下吧。我這里仍然使用armasm來編譯之前的ARM語法格式的匯編代碼。

修改匯編的編譯參數(shù)時,一定要注意編譯選項(xiàng)--cpreproc,該編譯選項(xiàng)在AC5的含義是命令armasm調(diào)用armcc預(yù)處理輸入的匯編源代碼;在AC6的含義是命令armasm調(diào)用armclang預(yù)處理輸入的匯編源代碼。

我的工程,在使用AC5編譯工具鏈時,在匯編過程中,使用的編譯參數(shù)配置和armcc的編譯參數(shù)配置是一樣的,并且也添加了編譯選項(xiàng)--cpreproc。

升級到AC6.12之后,因?yàn)閍rmclang的編譯參數(shù)和armcc的差異比較大,自然的就不能夠直接用于armasm的配置,因此我按照AC5的armasm配置作為AC6.12 armasm的配置,此時能夠進(jìn)行匯編,但是提示:armclang: fatal error: no target architecture given; use --target=arm-arm-none-eabi or --target=aarch64-arm-none-eabi

當(dāng)時我就在想,為什么我使用armasm編譯匯編代碼怎么會調(diào)用armclang呢,還以為編譯工程的腳本有問題,檢查了編譯腳本也沒發(fā)現(xiàn)問題,后來還是查看《migration_and_compatibility_guide_100068_0612_00_en.pdf》文檔才有所收獲。

原來在匯編過程中調(diào)用armclang是armasm的編譯選項(xiàng)--cpreproc在作怪,該編譯選項(xiàng)是命令armasm調(diào)用armclang預(yù)處理輸入的匯編源代碼。ARM Compile 6中armasm需要另一個編譯選項(xiàng)--cpreproc_opts,用于填寫armclang預(yù)處理匯編代碼時的一些配置參數(shù)。由于先前沒有配置--cpreproc_opts,當(dāng)然的在使用armclang進(jìn)行預(yù)處理時會提示armclang: fatal error: no target architecture given; use --target=arm-arm-none-eabi or --target=aarch64-arm-none-eabi。

問題解決辦法:對armasm新增編譯選項(xiàng)--cpreproc_opts,并且填寫上armclang預(yù)處理匯編代碼需要用到的一些配置信息。例如:

armasm --cpu=cortex-a9 --cpreproc --cpreproc_opts=--target=arm-arm-none-eabi,-mcpu=cortexa9,-D,DEF1,-D,DEF2 -I /path/to/includes1 -I /path/to/includes2 input.S

對于--cpreproc--cpreproc_opts編譯選項(xiàng),可參考《migration_and_compatibility_guide_100068_0612_00_en.pdf》文檔的3.3 Command-line options for preprocessing assembly source code。

6、下面簡單列舉一些編譯參數(shù)的差異

(1).對于armcc和armclang之間,編譯參數(shù)存在的差異如下:

AC5 Option AC6 Option 描述
--cpu=Cortex-M4 --target=arm-arm-none-eabi -mcpu=cortex-m4 Cortex-M4處理器的修改,其他處理器可能不一樣,請參考我這里提供的官方手冊.
--thumb -mthumb 支持thumb指令集
--fpu=fpv5_sp_d16 -mfloat-abi=hard -mfpu=fpv5_sp_d16 支持硬件浮點(diǎn)
--fpu=softvfp -mfloat-abi=soft -mfpu=none 軟件浮點(diǎn)
--unaligned_access -munaligned-access 設(shè)定處理器可以生成地址非對齊的數(shù)據(jù)
--apcs=interwork 沒有對應(yīng)的編譯選項(xiàng) 在AC6中總是允許ARM指令和Thumb指令一起使用,因此沒有對應(yīng)的編譯選項(xiàng).
--split_sections -ffunction-sections 生成的函數(shù)在自己的段中
--debug/-g -g 生成調(diào)試信息
--c99 --gnu -xc -std=gnu99 允許編譯器編譯帶有GNU擴(kuò)展的C99代碼
--cpp --gnu -xc++ -std=gnu++03 允許編譯器編譯帶有GNU擴(kuò)展的C++03代碼
--no_exceptions -fno-exceptions 禁止生成需要支持C++異常的代碼
--no_rtti -fno-rtti [ALPHA] 禁止生成需要支持C++ Run Time Type Information(RTTI)特征的代碼
-Otime 默認(rèn)支持 減少執(zhí)行時間的優(yōu)化,代價就是執(zhí)行文件的大小會增加
-O3 -Otime -Omax Highest optimization for performance
-O3 -Ospace -Oz Highest optimization for code size

(2).對于AC6使用armasm需要注意的事項(xiàng):

使用AC6編譯匯編代碼時,編譯選項(xiàng)和AC5基本差不多,這里再強(qiáng)調(diào)一下編譯選項(xiàng):--cpreproc。在AC6中如果使用了編譯選項(xiàng)--cpreproc,那么就必須附帶的使用編譯選項(xiàng)--cpreproc_opts,并且填寫上armclang預(yù)處理匯編代碼需要用到的一些配置信息,例如:

armasm --cpu=cortex-a9 --cpreproc --cpreproc_opts=--target=arm-arm-none-eabi,-mcpu=cortexa9,-D,DEF1,-D,DEF2 -I /path/to/includes1 -I /path/to/includes2 input.S

好了,我在這里簡單的記錄了下ARM Compiler 5升級到ARM Compiler 6.12的過程,給以后有需要的朋友留作參考吧。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9097

    瀏覽量

    367581
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49133
  • GNU
    GNU
    +關(guān)注

    關(guān)注

    0

    文章

    143

    瀏覽量

    17494

原文標(biāo)題:基于ARM編譯器版本5的工程遷移與適配到ARM編譯器版本6.12

文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Keil修改ARM編譯器及配置方法

    Keil MDK自 V5.36 版本之后,默認(rèn)就不帶 Arm Compiler V5版本編譯器。如果需要使用 V
    發(fā)表于 09-19 10:41 ?4675次閱讀
    Keil修改<b class='flag-5'>ARM</b><b class='flag-5'>編譯器</b>及配置方法

    ARM編譯器for Embedded Version 6.20移植和兼容性指南

    Arm?編譯器嵌入式遷移和兼容性指南為從舊版本Arm編譯器
    發(fā)表于 08-10 07:17

    Arm編譯器遷移和兼容性指南

    Arm?編譯器遷移和兼容性指南為從舊版本Arm編譯器遷移
    發(fā)表于 08-10 06:57

    ARM編譯器5.06版遷移與兼容性指南

    盡管不能保證不同版本ARM編譯器之間的兼容性,但有一些方法可以幫助您實(shí)現(xiàn)兼容性。 ARM編譯器生成的代碼符合
    發(fā)表于 08-21 07:50

    ARM編譯器5.06版入門指南

    的ARMLINK支持的所有功能。 如果您使用ARM編譯器作為獨(dú)立產(chǎn)品,則默認(rèn)使用32位版本。 對于DS-5中的ARM
    發(fā)表于 08-23 07:25

    ARM編譯器優(yōu)化版本1.0

    ARM編譯器armcc可以優(yōu)化您的代碼以實(shí)現(xiàn)小代碼和高性能。 本教程介紹了編譯器執(zhí)行的主要優(yōu)化技術(shù),并解釋了如何控制編譯器優(yōu)化。 本教程假定您已經(jīng)安裝并許可了
    發(fā)表于 08-28 07:11

    用于嵌入式FUSA的ARM編譯器移植和兼容性指南

    《用于Embedded FUSA的ARM?編譯器遷移與兼容性指南》為從舊版本ARM編譯器
    發(fā)表于 08-29 07:02

    編譯器_keil的優(yōu)化選項(xiàng)問題

    keil編譯器的優(yōu)化選項(xiàng)針對ARM,對STM32編譯的一些優(yōu)化的問題
    發(fā)表于 02-25 14:18 ?3次下載

    ARM最優(yōu)CC++編譯器用戶指南

    ARM最優(yōu)CC++編譯器用戶指南
    發(fā)表于 03-14 10:48 ?3次下載

    ARM匯編編譯器的使用

    10.4 ARM匯編編譯器的使用 armasm是ARM匯編語言的交叉編譯器,本節(jié)將詳細(xì)介紹它的使用方法。 armasm命令行語法格式如下。 armasm options inputfi
    發(fā)表于 10-19 10:14 ?5次下載

    關(guān)于KEIL ARM編譯器的使用介紹

    KEIL ARM編譯器的使用
    的頭像 發(fā)表于 07-10 10:50 ?6339次閱讀

    帶你認(rèn)識ARM最新的編譯器 AC6.12

    帶你認(rèn)識ARM最新的編譯器AC6.12
    的頭像 發(fā)表于 03-03 11:34 ?4569次閱讀

    你用的ARM處理該選擇哪個編譯器?

    現(xiàn)在的嵌入式開發(fā)大部分都是ARM處理了,從MCU級別的M0,M3,M4,M23,M33,到MPU級別的ARM9,ARM11,ARM-A5x
    發(fā)表于 12-01 13:36 ?1次下載
    你用的<b class='flag-5'>ARM</b>處理<b class='flag-5'>器</b>該選擇哪個<b class='flag-5'>編譯器</b>?

    交叉編譯器安裝教程

    交叉編譯器中“交叉”的意思就是在一個架構(gòu)上編譯另外一個架構(gòu)的代碼,相當(dāng)于兩種架構(gòu)“交叉”起來了。Ubuntu 自帶的 gcc 編譯器是針對 X86 架構(gòu)的,而我們現(xiàn)在要編譯的是
    的頭像 發(fā)表于 09-29 09:12 ?3514次閱讀

    使用ARMClang V6版本編譯器出現(xiàn)錯誤的解決方法

    很多STM32開發(fā)者使用ARM mdk IDE進(jìn)行開發(fā),我們知道ARM MDK IDE早已推出ARMClang V6版本編譯器了。不過,當(dāng)我們把在V
    的頭像 發(fā)表于 06-07 12:32 ?7042次閱讀
    使用ARMClang V6<b class='flag-5'>版本</b><b class='flag-5'>編譯器</b>出現(xiàn)錯誤的解決方法