為了描述方便,將ARM Compiler 5簡(jiǎn)稱(chēng)為AC5,將ARM Compiler 6.12簡(jiǎn)稱(chēng)AC6.12。
在公眾號(hào)中回復(fù)"arm編譯器升級(jí)文檔"可以獲取AC5升級(jí)到AC6.12的ARM官方文檔。
1、為什么要進(jìn)行ARM編譯器版本的更換
目前,AC5基本處于停止更新?tīng)顟B(tài),如果想要使用AC5編譯器編譯新的ARM架構(gòu)或者內(nèi)核的代碼,基本是不可能了,因此自然要使用ARM Compiler 6來(lái)代替之前的ARM Compiler 5。
其實(shí),我自己覺(jué)得還有一個(gè)比較重要的原因,那就是AC6支持使用armclang編譯GNU語(yǔ)法格式的匯編代碼,這樣在以后的項(xiàng)目開(kāi)發(fā)中,可以只編寫(xiě)GNU語(yǔ)法格式的匯編代碼(不必像以前一樣還要再寫(xiě)一份符合ARM語(yǔ)法格式的匯編代碼),這樣既可以使用ARM-GCC編譯工具鏈編譯這個(gè)項(xiàng)目,也可以使用ARM Compiler編譯這個(gè)項(xiàng)目,匯編代碼維護(hù)更加方便了。
2、AC6.12的組成
(1).armclang:armclang編譯器替代了AC5的armcc,并且具有如下優(yōu)點(diǎn):
-
基于LLVM和Clang技術(shù);
-
支持編譯GNU語(yǔ)法的匯編代碼;
-
高度兼容當(dāng)初為GCC編譯的源代碼;
-
實(shí)現(xiàn)包括ANSI/ISO C和C++,用于Arm架構(gòu)的ABI,用于64位Arm架構(gòu)的ABI以及Arm C語(yǔ)言擴(kuò)展(ACLE)等規(guī)范。
(2).armlink:功能豐富的專(zhuān)用嵌入式鏈接器,能夠?qū)?duì)象和庫(kù)組合在一起以生成可執(zhí)行文件。
(3).fromelf:鏡像文件轉(zhuǎn)換和反匯編功能。
(4).armar:壓縮程序。
(5).armasm:ARM語(yǔ)法的匯編代碼編譯器。
(6).ARM C和C++庫(kù):ARM C庫(kù)經(jīng)過(guò)ARM公司的優(yōu)化有很好的的性能和代碼密度;ARM C++庫(kù)基于LLVM libc++項(xiàng)目。
下圖展示了ARM Compiler 6.12編譯工具鏈的整體結(jié)構(gòu):

3、ARM Compiler 5和ARM Compiler 6編譯工具鏈的差異
AC5和AC6的主要差異是AC6使用armclang代替了armcc,因此在AC6中就沒(méi)有armcc這個(gè)編譯工具了。并且armclang的編譯參數(shù)相對(duì)于之前的armcc的編譯參數(shù)也有許多不同。
下表列出了ARM Compiler 5和ARM Compiler 6之間各個(gè)工具的功能:

4、編譯工具鏈升級(jí)過(guò)程
其實(shí)將AC5更換為AC6.12編譯工具鏈,無(wú)非就是找出這兩個(gè)工具鏈的編譯參數(shù)的差異進(jìn)行修改即可。當(dāng)然了,基本上編譯參數(shù)變化還是挺大的,這里推薦大家參考如下手冊(cè)進(jìn)行編譯工具鏈升級(jí)。
參考手冊(cè):《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)然了也可以通過(guò)搜索一些編譯參數(shù)來(lái)快速定位。
5、我在升級(jí)過(guò)程遇到的問(wèn)題
我在遷移一個(gè)項(xiàng)目使用AC6.12的過(guò)程中,主要還是參考《migration_and_compatibility_guide_100068_0612_00_en.pdf》文檔進(jìn)行參數(shù)修改,起初還算比較順利,但是涉及到匯編代碼的編譯過(guò)程中死活編譯會(huì)有問(wèn)題。這里簡(jiǎn)單的記錄下吧。我這里仍然使用armasm來(lái)編譯之前的ARM語(yǔ)法格式的匯編代碼。
修改匯編的編譯參數(shù)時(shí),一定要注意編譯選項(xiàng)--cpreproc,該編譯選項(xiàng)在AC5的含義是命令armasm調(diào)用armcc預(yù)處理輸入的匯編源代碼;在AC6的含義是命令armasm調(diào)用armclang預(yù)處理輸入的匯編源代碼。
我的工程,在使用AC5編譯工具鏈時(shí),在匯編過(guò)程中,使用的編譯參數(shù)配置和armcc的編譯參數(shù)配置是一樣的,并且也添加了編譯選項(xiàng)--cpreproc。
升級(jí)到AC6.12之后,因?yàn)閍rmclang的編譯參數(shù)和armcc的差異比較大,自然的就不能夠直接用于armasm的配置,因此我按照AC5的armasm配置作為AC6.12 armasm的配置,此時(shí)能夠進(jìn)行匯編,但是提示:armclang: fatal error: no target architecture given; use --target=arm-arm-none-eabi or --target=aarch64-arm-none-eabi。
當(dāng)時(shí)我就在想,為什么我使用armasm編譯匯編代碼怎么會(huì)調(diào)用armclang呢,還以為編譯工程的腳本有問(wèn)題,檢查了編譯腳本也沒(méi)發(fā)現(xiàn)問(wèn)題,后來(lái)還是查看《migration_and_compatibility_guide_100068_0612_00_en.pdf》文檔才有所收獲。
原來(lái)在匯編過(guò)程中調(diào)用armclang是armasm的編譯選項(xiàng)--cpreproc在作怪,該編譯選項(xiàng)是命令armasm調(diào)用armclang預(yù)處理輸入的匯編源代碼。ARM Compile 6中armasm需要另一個(gè)編譯選項(xiàng)--cpreproc_opts,用于填寫(xiě)armclang預(yù)處理匯編代碼時(shí)的一些配置參數(shù)。由于先前沒(méi)有配置--cpreproc_opts,當(dāng)然的在使用armclang進(jìn)行預(yù)處理時(shí)會(huì)提示armclang: fatal error: no target architecture given; use --target=arm-arm-none-eabi or --target=aarch64-arm-none-eabi。
問(wèn)題解決辦法:對(duì)armasm新增編譯選項(xiàng)--cpreproc_opts,并且填寫(xiě)上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
對(duì)于--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、下面簡(jiǎn)單列舉一些編譯參數(shù)的差異
(1).對(duì)于armcc和armclang之間,編譯參數(shù)存在的差異如下:
| AC5 Option | AC6 Option | 描述 |
| --cpu=Cortex-M4 | --target=arm-arm-none-eabi -mcpu=cortex-m4 | Cortex-M4處理器的修改,其他處理器可能不一樣,請(qǐng)參考我這里提供的官方手冊(cè). |
| --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è)定處理器可以生成地址非對(duì)齊的數(shù)據(jù) |
| --apcs=interwork | 沒(méi)有對(duì)應(yīng)的編譯選項(xiàng) | 在AC6中總是允許ARM指令和Thumb指令一起使用,因此沒(méi)有對(duì)應(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í)行時(shí)間的優(yōu)化,代價(jià)就是執(zhí)行文件的大小會(huì)增加 |
| -O3 -Otime | -Omax | Highest optimization for performance |
| -O3 -Ospace | -Oz | Highest optimization for code size |
(2).對(duì)于AC6使用armasm需要注意的事項(xiàng):
使用AC6編譯匯編代碼時(shí),編譯選項(xiàng)和AC5基本差不多,這里再?gòu)?qiáng)調(diào)一下編譯選項(xiàng):--cpreproc。在AC6中如果使用了編譯選項(xiàng)--cpreproc,那么就必須附帶的使用編譯選項(xiàng)--cpreproc_opts,并且填寫(xiě)上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
好了,我在這里簡(jiǎn)單的記錄了下ARM Compiler 5升級(jí)到ARM Compiler 6.12的過(guò)程,給以后有需要的朋友留作參考吧。
-
ARM
+關(guān)注
關(guān)注
135文章
9580瀏覽量
393296 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51862 -
GNU
+關(guān)注
關(guān)注
0文章
144瀏覽量
18361
原文標(biāo)題:基于ARM編譯器版本5的工程遷移與適配到ARM編譯器版本6.12
文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Keil修改ARM編譯器及配置方法
ARM編譯器5.06版遷移與兼容性指南
ARM編譯器5.06版入門(mén)指南
ARM編譯器優(yōu)化版本1.0
編譯器_keil的優(yōu)化選項(xiàng)問(wèn)題
ARM匯編編譯器的使用
你用的ARM處理器該選擇哪個(gè)編譯器?
交叉編譯器安裝教程
使用ARMClang V6版本編譯器出現(xiàn)錯(cuò)誤的解決方法
基于ARM編譯器版本5的工程遷移與適配到ARM編譯器版本6.12
評(píng)論