<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用LLVM-embedded-toolchain-for-Arm-17.0.1開發STM32

冬至子 ? 來源:flyboy ? 作者:flyboy ? 2023-10-23 16:46 ? 次閱讀

LLVM-embedded-toolchain-for-Arm 是一個 ARM 公司開源的適用于 32 位ARM芯片的工具鏈,支持多種ARM指令集架構,包括最新的 CM85 內核。由于是基于 LLVM 和 picolibc構建出的工具鏈,因此在代碼體積和執行效率上都很有競爭力,甚至可以和商用閉源的工具鏈進行 PK。

支持的架構
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 上,使用最新發布的 LLVM-embedded-toolchain-for-Arm-17.0.1 版本開發stm32,以星火1號為例。

適配LLVM工具鏈

由于RT-Thread內核和構建工具已經支持了這款工具鏈,因此只需要修改我們當前使用的BSP即可。

主要工作就是修改rtconfig.py 添加llvm-arm的編譯參數
由于目前RT-Thread主倉庫已經有兩個BSP支持了這個工具鏈,我們可以參考現有的。

打開星火1號對應的BSP,目錄為:bsp/stm32/stm32f407-rt-spark。然后使用文本編輯工具(如:VSCode)打開rtconfig.py文件。

1.在CROSS_TOOL配置的地方添加 llvm-arm 相關信息

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.完善具體的編譯參數

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 工具打開當前 bsp,設定要使用的工具鏈和對應的路徑。

set RTT_CC=llvm-arm
set RTT_EXEC_PATH=D:ProgremLLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64bin

然后運行 scons 命令,執行編譯

scons

發現編譯報錯了,看起來是原來的鏈接腳本不太規范,llvm檢測比較嚴格。

1.jpg

我們打開對應的文件,在 = 后面加一個空格,再次編譯。

又出現了一個錯誤。

1.jpg

這次是提示 .eh_frame 和 .data 兩個段的地址發生了沖突。對比了下stm32l475-atk-pandora 和星火1號bsp的鏈接腳本文件。

發現星火1號的鏈接腳本缺少了.eh_frame 段的定義。

1.jpg

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

1.jpg

然后拖入到星火1號的 U 盤,咦!沒下載成功,提示下載失敗了。。。

1.jpg

然后,嘗試了下使用gcc編譯出來的bin文件,咦!下載成功了。這說明我們LLVM的工具鏈編譯出來的文件缺少有問題!

使用比較工具,比較這兩個bin文件,一打開就發現了不對勁的地方。LLVM編譯出來的bin文件,前面缺少了一塊。

1.jpg

仔細一看,這不是前面的中斷向量表嗎,原來是LLVM編譯的工具少了這一部分,這樣就好辦了,問題肯定出來啟動文件這里??戳讼驴刂茊游募欠駞⑴c編譯的腳本,發現,確實缺少了針對llvm-arm這個工具鏈的處理。

1.jpg

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

1.jpg

這次下載成功了,而且程序也正常的運行起來了!

1.jpg

代碼優化對比

比較一下代碼體積(text段大?。?/p>

1.jpg

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    8708

    瀏覽量

    362609
  • ARM芯片
    +關注

    關注

    1

    文章

    125

    瀏覽量

    21287
  • 中斷向量
    +關注

    關注

    0

    文章

    14

    瀏覽量

    8869
  • STM32F407
    +關注

    關注

    15

    文章

    187

    瀏覽量

    29071
  • RT-Thread
    +關注

    關注

    31

    文章

    1176

    瀏覽量

    38993
  • gcc編譯器
    +關注

    關注

    0

    文章

    78

    瀏覽量

    3247
收藏 人收藏

    評論

    相關推薦

    Eclipse環境STM32工程編譯報錯undefined references to `assert_failed\'的原因?

    用Eclipse環境創建一個STM32F407工程。編譯時出現錯誤。c:/program files (x86)/gnu arm embedded toolchain/9
    發表于 03-20 07:51

    Embedded Pi開發板免費申請試用

    Embedded Pi開發板免費申請試用Embedded Pi是融合Raspberry Pi,ArduinoTM和32位嵌入式ARM三大社區的三合一平臺,幫助用戶最有效地發揮每個平臺的
    發表于 10-28 11:12

    linux系統的環境搭建方法

    搭建環境開始一、環境搭建首先下載arm-none-eabi交叉編譯工具鏈。下載地址:GNU Toolchain | GNU Arm Embedded
    發表于 02-07 08:14

    STM32F407外部有1M sram怎么修改lds文件

    /toolchain_support_packages/arm/gnu_tools_for_arm_embedded_processors/5.4.1/bin/../lib/gcc/arm
    發表于 10-08 14:27

    使用SEGGER Embedded Studio開發RT-Thread系統

    1、使用SEGGER Embedded Studio開發RT-Thread  本文所采用MCU為stm32f429IG,RT-thread版本為4.0.2,SES版本為4.52c  - 前期準備
    發表于 10-09 17:21

    如何將Keil μVision工程遷移到SEGEGR Embedded Studio?

    和GCC,也支持外部工具鏈,如Clang/LLVM、IAR或ARM/KEIL編譯器。我們以一個基于Keil μVision 5.32的項目為例,介紹如何將其遷移到SES 中。操作步驟打開Embedded
    發表于 01-31 14:00

    stm32-stm8_embedded_software_sol_全英

    stm32-stm8_embedded_software_solutions
    發表于 11-09 18:27 ?14次下載

    ARM Cortex_M3為基礎的STM32開發板的設計與實現

    ARM Cortex_M3為基礎的STM32開發板的設計與實現
    發表于 09-29 08:41 ?7次下載
    以<b class='flag-5'>ARM</b> Cortex_M3為基礎的<b class='flag-5'>STM32</b><b class='flag-5'>開發</b>板的設計與實現

    Embedded Workbench for ARM training

    Embedded Workbench for ARM training
    發表于 10-27 09:38 ?10次下載
    <b class='flag-5'>Embedded</b> Workbench for <b class='flag-5'>ARM</b> training

    如何進行STM32開源開發環境的搭建與調試

    的Eclipse。在Eclipse中添加GNU ARM Eclipse插件,與 YAGARTO GNU ARM Toolchain和J-link仿真調試器結合,就可以比較好地支持STM32
    發表于 04-29 18:24 ?4次下載
    如何進行<b class='flag-5'>STM32</b>開源<b class='flag-5'>開發</b>環境的搭建與調試

    Mac M1使用Vscode進行STM32項目開發

    Mac M1使用Vscode進行STM32項目開發折騰筆記1. 安裝Vscode2. 安裝GNU Arm Embedded Toolchain
    發表于 11-03 15:06 ?18次下載
    Mac M1使用Vscode進行<b class='flag-5'>STM32</b>項目<b class='flag-5'>開發</b>

    ARM開發環境入門—STM32實例1

    ARM開發環境入門—STM32實例1
    發表于 11-21 17:51 ?18次下載
    <b class='flag-5'>ARM</b><b class='flag-5'>開發</b>環境入門—<b class='flag-5'>STM32</b>實例1

    Makefile 近期學習的一些心得及其疑問

    搭建環境開始一、環境搭建首先下載arm-none-eabi交叉編譯工具鏈。下載地址:GNU Toolchain | GNU Arm Embedded
    發表于 12-04 14:36 ?0次下載
    Makefile 近期學習的一些心得及其疑問

    SEGGER Embedded Studio如何導入STM32CubeIDE工程?

    SEGGER Embedded Studio(SES)是SEGGER公司開發的一款跨平臺的ARM和RISC-V架構處理器集成開發環境(IDE),具有運行速度快,功能強等特點。SES內置
    的頭像 發表于 10-21 11:21 ?2742次閱讀

    如何將Keil μVision工程遷移到SEGEGR Embedded Studio?

    Embedded Studio是SEGGER公司推出的一款跨平臺(Windows/Linux/Mac)的集成開發環境,SEGGER Embedded Studio自帶有兩個工具鏈:SEGGER
    的頭像 發表于 01-13 11:24 ?1425次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>