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
    +关注

    关注

    134

    文章

    8651

    浏览量

    361816
  • ARM芯片
    +关注

    关注

    1

    文章

    122

    浏览量

    21258
  • 中断向量
    +关注

    关注

    0

    文章

    14

    浏览量

    8862
  • STM32F407
    +关注

    关注

    15

    文章

    187

    浏览量

    28973
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38877
  • gcc编译器
    +关注

    关注

    0

    文章

    77

    浏览量

    3233
收藏 人收藏

    评论

    相关推荐

    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-21 11:41

    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

    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 2589次阅读

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

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