LLVM-embedded-toolchain-for-Arm 是一個(gè) ARM 公司開(kāi)源的適用于 32 位ARM芯片的工具鏈,支持多種ARM指令集架構(gòu),包括最新的 CM85 內(nèi)核。由于是基于 LLVM 和 picolibc構(gòu)建出的工具鏈,因此在代碼體積和執(zhí)行效率上都很有競(jìng)爭(zhēng)力,甚至可以和商用閉源的工具鏈進(jìn)行 PK。
支持的架構(gòu)
Armv6-M
Armv7-M
Armv7E-M
Armv8-M Mainline
Armv8.1-M Mainline
Armv4T (experimental)
Armv5TE (experimental)
Armv6 (experimental, using the Armv5TE library variant)
AArch64 armv8.0 (experimental)
這篇文章教大家,如何在 RT-Thread 上,使用最新發(fā)布的 LLVM-embedded-toolchain-for-Arm-17.0.1 版本開(kāi)發(fā)stm32,以星火1號(hào)為例。
適配LLVM工具鏈
由于RT-Thread內(nèi)核和構(gòu)建工具已經(jīng)支持了這款工具鏈,因此只需要修改我們當(dāng)前使用的BSP即可。
主要工作就是修改rtconfig.py 添加llvm-arm的編譯參數(shù)
由于目前RT-Thread主倉(cāng)庫(kù)已經(jīng)有兩個(gè)BSP支持了這個(gè)工具鏈,我們可以參考現(xiàn)有的。
打開(kāi)星火1號(hào)對(duì)應(yīng)的BSP,目錄為:bsp/stm32/stm32f407-rt-spark。然后使用文本編輯工具(如:VSCode)打開(kāi)rtconfig.py文件。
1.在CROSS_TOOL配置的地方添加 llvm-arm 相關(guān)信息:
cross_tool provides the cross compiler
EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR
if CROSS_TOOL == 'gcc':
PLATFORM = 'gcc'
EXEC_PATH = r'C:UsersXXYYZZ'
elif CROSS_TOOL == 'keil':
PLATFORM = 'armcc'
EXEC_PATH = r'C:/Keil_v5'
elif CROSS_TOOL == 'iar':
PLATFORM = 'iccarm'
EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3'
elif CROSS_TOOL == 'llvm-arm': # 新添加的部分
PLATFORM = 'llvm-arm'
EXEC_PATH = r'D:ProgremLLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64bin'
2.完善具體的編譯參數(shù)
if PLATFORM == 'gcc':
toolchains ...
elif PLATFORM == 'armcc':
toolchains ...
elif PLATFORM == 'armclang':
toolchains ...
elif PLATFORM == 'iccarm':
toolchains ...
elif PLATFORM == 'llvm-arm': # 新添加的部分
toolchains
PREFIX = 'llvm-'
CC = 'clang'
AS = 'clang'
AR = PREFIX + 'ar'
CXX = 'clang++'
LINK = 'clang'
TARGET_EXT = 'elf'
SIZE = PREFIX + 'size'
OBJDUMP = PREFIX + 'objdump'
OBJCPY = PREFIX + 'objcopy'
DEVICE = ' --target=arm-none-eabihf -mfloat-abi=hard -march=armv7em -mfpu=fpv4-sp-d16'
DEVICE += ' -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti'
CFLAGS = DEVICE
AFLAGS = ' -c' + DEVICE + ' -Wa,-mimplicit-it=thumb ' ## -x assembler-with-cpp
LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-u,Reset_Handler -lcrt0 -T board/linker_scripts/link.lds'
CPATH = ''
LPATH = ''
if BUILD == 'debug':
CFLAGS += ' -O0 -gdwarf-2 -g'
AFLAGS += ' -gdwarf-2'
else:
CFLAGS += ' -O2'
CXXFLAGS = CFLAGS
POST_ACTION = OBJCPY + ' -O binary **TARGET rtthread.binn' + SIZE + ' **TARGET n'
編譯工程
使用 env 工具打開(kāi)當(dāng)前 bsp,設(shè)定要使用的工具鏈和對(duì)應(yīng)的路徑。
set RTT_CC=llvm-arm
set RTT_EXEC_PATH=D:ProgremLLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64bin
然后運(yùn)行 scons 命令,執(zhí)行編譯
scons
發(fā)現(xiàn)編譯報(bào)錯(cuò)了,看起來(lái)是原來(lái)的鏈接腳本不太規(guī)范,llvm檢測(cè)比較嚴(yán)格。

我們打開(kāi)對(duì)應(yīng)的文件,在 = 后面加一個(gè)空格,再次編譯。
又出現(xiàn)了一個(gè)錯(cuò)誤。

這次是提示 .eh_frame 和 .data 兩個(gè)段的地址發(fā)生了沖突。對(duì)比了下stm32l475-atk-pandora 和星火1號(hào)bsp的鏈接腳本文件。
發(fā)現(xiàn)星火1號(hào)的鏈接腳本缺少了.eh_frame 段的定義。

我們添加是缺少的定義,繼續(xù)編譯。編譯成功!

然后拖入到星火1號(hào)的 U 盤,咦!沒(méi)下載成功,提示下載失敗了。。。

然后,嘗試了下使用gcc編譯出來(lái)的bin文件,咦!下載成功了。這說(shuō)明我們LLVM的工具鏈編譯出來(lái)的文件缺少有問(wèn)題!
使用比較工具,比較這兩個(gè)bin文件,一打開(kāi)就發(fā)現(xiàn)了不對(duì)勁的地方。LLVM編譯出來(lái)的bin文件,前面缺少了一塊。

仔細(xì)一看,這不是前面的中斷向量表嗎,原來(lái)是LLVM編譯的工具少了這一部分,這樣就好辦了,問(wèn)題肯定出來(lái)啟動(dòng)文件這里??戳讼驴刂茊?dòng)文件是否參與編譯的腳本,發(fā)現(xiàn),確實(shí)缺少了針對(duì)llvm-arm這個(gè)工具鏈的處理。

添加上之后,繼續(xù)編譯,成功了,果然固件大小也變大了很大,達(dá)到了和gcc一樣的量級(jí)。

這次下載成功了,而且程序也正常的運(yùn)行起來(lái)了!

代碼優(yōu)化對(duì)比
比較一下代碼體積(text段大?。?/p>

-
ARM
+關(guān)注
關(guān)注
135文章
9507瀏覽量
389082 -
ARM芯片
+關(guān)注
關(guān)注
1文章
128瀏覽量
22622 -
中斷向量
+關(guān)注
關(guān)注
0文章
14瀏覽量
9194 -
STM32F407
+關(guān)注
關(guān)注
15文章
189瀏覽量
31419 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1546瀏覽量
44319 -
gcc編譯器
+關(guān)注
關(guān)注
0文章
78瀏覽量
3922
發(fā)布評(píng)論請(qǐng)先 登錄
Eclipse環(huán)境STM32工程編譯報(bào)錯(cuò)undefined references to `assert_failed\'的原因?
【CPKCOR-RA8D1】AI人臉檢測(cè)(安裝對(duì)應(yīng)版本的FSP及LLVM)
Embedded Pi開(kāi)發(fā)板免費(fèi)申請(qǐng)?jiān)囉?/a>
Embedded Pi開(kāi)發(fā)板免費(fèi)申請(qǐng)?jiān)囉?/a>
linux系統(tǒng)的環(huán)境搭建方法
STM32F407外部有1M sram怎么修改lds文件
使用SEGGER Embedded Studio開(kāi)發(fā)RT-Thread系統(tǒng)
如何將Keil μVision工程遷移到SEGEGR Embedded Studio?
ARM教程之ARM常用開(kāi)發(fā)工具及相應(yīng)開(kāi)發(fā)環(huán)境配置資料說(shuō)明
如何進(jìn)行STM32開(kāi)源開(kāi)發(fā)環(huán)境的搭建與調(diào)試
ARM開(kāi)發(fā)環(huán)境入門—STM32實(shí)例1
Makefile 近期學(xué)習(xí)的一些心得及其疑問(wèn)

使用LLVM-embedded-toolchain-for-Arm-17.0.1開(kāi)發(fā)STM32
評(píng)論