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编译的工具少了这一部分,这样就好办了,问题肯定出来启动文件这里。看了下控制启动文件是否参与编译的脚本,发现,确实缺少了针对llvm-arm这个工具链的处理。

1.jpg

添加上之后,继续编译,成功了,果然固件大小也变大了很大,达到了和gcc一样的量级。

1.jpg

这次下载成功了,而且程序也正常的运行起来了!

1.jpg

代码优化对比

比较一下代码体积(text段大小)

1.jpg

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • arm
    arm
    +关注

    关注

    131

    文章

    8155

    浏览量

    359247
  • ARM芯片
    +关注

    关注

    1

    文章

    98

    浏览量

    21116
  • 中断向量
    +关注

    关注

    0

    文章

    13

    浏览量

    8713
  • STM32F407
    +关注

    关注

    15

    文章

    170

    浏览量

    28743
  • RT-Thread
    +关注

    关注

    29

    文章

    1020

    浏览量

    38422
  • gcc编译器
    +关注

    关注

    0

    文章

    67

    浏览量

    3177
收藏 人收藏

    评论

    相关推荐

    用于嵌入式ARM C和C++库和浮点支持的ARM编译器用户指南

    Embedded 6的各种ARM®编译器功能的支持级别。 嵌入式6的
    发表于 08-25 06:33

    Embedded Pi开发板免费申请试用

    Embedded Pi开发板免费申请试用Embedded Pi是融合Raspberry Pi,ArduinoTM和32位嵌入式ARM三大社区的三合一平台,帮助用户最有效地发挥每个平台的优越性
    发表于 10-21 11:41

    Mac M1使用Vscode进行STM32项目开发折腾笔记

    STM32项目开发折腾笔记1. 安装Vscode2. 安装GNU Arm Embedded Toolchain3. 配置系统环境变量4. 打开工程快华强pcb置5.
    发表于 07-16 08:02

    linux系统的环境搭建方法

    arm-none-eabi交叉编译工具链。下载地址:GNU Toolchain | GNU Arm Embedded Toolchain Downloads – Arm DeveloperDownload the GNU
    发表于 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-none-eabi/5.4.1
    发表于 10-08 14:27

    使用SEGGER Embedded Studio开发RT-Thread系统

    Embedded Studio开发RT-Thread  本文所采用MCU为stm32f429IG,RT-thread版本为4.0.2,SES版本为4.52c  - 前期准备
    发表于 10-09 17:21

    Embedded Workbench for ARM training

    Embedded Workbench for ARM training
    发表于 10-27 09:38 10次下载
    <b>Embedded</b> Workbench for <b>ARM</b> training

    如何进行STM32开源开发环境的搭建与调试

    ARM Eclipse插件,与 YAGARTO GNU ARM Toolchain和J-link仿真调试器结合,就可以比较好地支持STM32开发与调试。
    发表于 04-29 18:24 4次下载
    如何进行<b>STM32</b>开源<b>开发</b>环境的搭建与调试

    ARM开发环境入门—STM32实例1

    ARM开发环境入门—STM32实例1
    发表于 11-21 17:51 18次下载
    <b>ARM</b><b>开发</b>环境入门—<b>STM32</b>实例1

    Makefile 近期学习的一些心得及其疑问

    arm-none-eabi交叉编译工具链。下载地址:GNU Toolchain | GNU Arm Embedded Toolchain Downloads – Arm DeveloperDownload the GNU
    发表于 12-04 14:36 0次下载
    Makefile 近期学习的一些心得及其疑问

    SEGGER Embedded Studio如何导入STM32CubeIDE工程?

    Embedded Studio(SES)是SEGGER公司开发的一款跨平台的ARM和RISC-V架构处理器集成开发环境(IDE),具有运行速度快,功能强等特点。SES内置Clang
    的头像 发表于 10-21 11:21 1896次阅读

    如何将Keil μVision工程迁移到SEGEGR Embedded Studio?

    Embedded Studio是SEGGER公司推出的一款跨平台(Windows/Linux/Mac)的集成开发环境,SEGGER Embedded Studio自带有两个工具链:SEGGER
    的头像 发表于 01-13 11:24 791次阅读

    什么是LLVMLLVM的优势和特点有哪些?

    LLVM是一个开源的编译器基础设施项目,它以"Low-Level Virtual Machine"的缩写命名,尽管名称中包含了"虚拟机"一词,但LLVM不仅仅是一个虚拟机,而是一个综合的编译器工具链。
    的头像 发表于 06-11 15:54 2668次阅读