Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32
LLVM
星火1号_spark_星火一号_开发板
使用 LLVM-embedded-toolchain-for-Arm-17.0.1 开发STM32
发布于 2023-10-20 15:02:00 浏览:1237
订阅该版
[tocm] 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号为例。 ### 资料准备 1. 下载 RT-Thread 最新源码:https://github.com/RT-Thread/rt-thread 2. 下载LLVM-embedded-toolchain-for-Arm最新发布版,可在发布界面下载 https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/tag/release-17.0.1。 3. ENV工具:https://github.com/RT-Thread/env-windows/releases/tag/v1.4.1 ### 适配LLVM工具链 由于RT-Thread内核和构建工具已经支持了这款工具链,因此只需要修改我们当前使用的BSP即可。 主要工作就是修改rtconfig.py 添加llvm-arm的编译参数 由于目前RT-Thread主仓库已经有两个BSP支持了这个工具链,我们可以参考现有的。 - STM32潘多拉:https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/stm32l475-atk-pandora/rtconfig.py - 瑞萨hmi-board:https://github.com/RT-Thread/rt-thread/blob/master/bsp/renesas/ra6m3-hmi-board/rtconfig.py 打开星火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:\Users\XXYYZZ' 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:\Progrem\LLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64\bin' ``` 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.bin\n' + SIZE + ' $TARGET \n' ``` ### 编译工程 使用 env 工具打开当前 bsp,设定要使用的工具链和对应的路径。 ``` set RTT_CC=llvm-arm set RTT_EXEC_PATH=D:\Progrem\LLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64\bin ``` 然后运行 scons 命令,执行编译 ``` scons ``` 发现编译报错了,看起来是原来的链接脚本不太规范,llvm检测比较严格。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20231020/584539fca3f6ded966ed2404ff3075fe.png) 我们打开对应的文件,在 `=` 后面加一个空格,再次编译。 又出现了一个错误。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20231020/62135a06ac99c2b1b451951d3c1559ec.png) 这次是提示 `.eh_frame` 和 `.data` 两个段的地址发生了冲突。对比了下stm32l475-atk-pandora 和星火1号bsp的链接脚本文件。 发现星火1号的链接脚本缺少了`.eh_frame` 段的定义。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20231020/30e974763e6adfa2c601707c215440f7.png.webp) 我们添加是缺少的定义,继续编译。编译成功! ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20231020/872d9cbf6284bf554c0264f5a61bd74d.png) 然后拖入到星火1号的 U 盘,咦!没下载成功,提示下载失败了。。。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20231020/67bc6d469dafeb9f52e4955c03fa1a24.png) 然后,尝试了下使用gcc编译出来的bin文件,咦!下载成功了。这说明我们LLVM的工具链编译出来的文件缺少有问题! 使用比较工具,比较这两个bin文件,一打开就发现了不对劲的地方。LLVM编译出来的bin文件,前面缺少了一块。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20231020/fde613696e1c42d45d7b5c63a40cf20b.png.webp) 仔细一看,这不是前面的中断向量表吗,原来是LLVM编译的工具少了这一部分,这样就好办了,问题肯定出来启动文件这里。看了下控制启动文件是否参与编译的脚本,发现,确实缺少了针对llvm-arm这个工具链的处理。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20231020/75f4191d25a18cf32a2ffd06ff077d59.png.webp) 添加上之后,继续编译,成功了,果然固件大小也变大了很大,达到了和gcc一样的量级。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20231020/7dfbe341ff0a4855f6015a1b47db9969.png) 这次下载成功了,而且程序也正常的运行起来了! ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20231020/e2faaee358a80eaeef85b9624f728fa0.png) ### 代码优化对比 比较一下代码体积(text段大小) | 工具链 | O0 | O1 | O2 | O3 |Os | | ------------ | ------------ | ------------ | ------------ | ------------ |------------ | | GCC10.3.1 | 77968 | 55748 | 55868 | 59804 | 50812 | | llvm17.0.1 | 74648 | 56552 | 63124 | 67428 |53768 | ### Coremark 对比 | 工具链 | O0 | O1 | O2 | O3 |Os | | ------------ | ------------ | ------------ | ------------ | ------------ |------------ | | GCC10.3.1 | 97 | 327 | 416 | **454** | 294 | | llvm17.0.1 | 102 | 360 | 384 | 416 |**357** |
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
flyboy
Do my self();
文章
9
回答
509
被采纳
12
关注TA
发私信
相关文章
1
裸机工程移植 RT-Thread
2
Keil MDK 移植 RT-Thread Nano
3
移植 Nano,rt_thread_mdelay()延迟时间不对
4
裸机工程移植 RT-Thread内核
5
关于利用0x68000000作为扩展sram?
6
STM32F413 SD 卡写入速度提升方法
7
STM32 RTC 闹钟
8
http_ota 提示no memory
9
studio中怎么把PB3 和PA15引脚设置为普通IO口使用?
10
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部