本帖最后由 万能的互联网 于 2026-6-26 05:20 编辑
偶然之间,刷到arm官网的一篇对嵌入式开发工具链的未来规划。具体内容就是要放弃ac6,也就是armclang工具链的更新,只做一些维护。
正文和链接,我也没有保存,一时找不到了。
接下来,我们看另一篇文章,关于ATfE工具链的未来规划。
嵌入式 Arm 工具链:下一代 Arm C/C++ 嵌入式编译器
Arm 正在推出嵌入式 Arm 工具链(Arm Toolchain for Embedded,简称 ATfE),这是一款嵌入式 C/C++ 交叉编译器。该工具链预计将于 2025 年 4 月正式发布,但目前已提供测试版 (Beta)。
Arm 开发嵌入式 C 或 C++ 交叉编译器已有超过 25 年的历史,在 1998 年至 2014 年间共推出了 6 代产品。这些是 Arm 架构的参考编译器,被广泛应用于无数基于 Arm 的嵌入式项目、架构探索、设计验证、平台启动 (bring-up)、库开发等领域。
在第六代编译器 Arm Compiler for Embedded(也许更广为人知的名字是 AC6)发布 10 年后,技术、Arm 架构,以及开发者和基于 Arm 的嵌入式项目的需求都发生了变化。为了满足当前和未来开发高性能 Arm 嵌入式项目的开发者的需求,Arm 推出了嵌入式 Arm 工具链 (ATfE):第七代 Arm 嵌入式 C/C++ 交叉编译器。对于这些项目,ATfE 提供了优于 AC6 的多项优势:该工具链预计于 2025 年 4 月发布,但目前已提供测试版。
支持 ATfE 的许可证将继续支持 AC6:这两款编译器将同时提供,并互为补充。这两款编译器将吸引不同的基于 Arm 的项目:开发者可以自由选择最适合其项目的编译器。
继续阅读以了解更多关于 ATfE 的信息,并下载测试版。
嵌入式 Arm 工具链 (Arm Toolchain for Embedded)
自 AC6 发布以来的十年里,技术并未停滞不前。Arm 架构在功能和性能上都有了显著的增长。基于 Arm 的设计在复杂性、功能和功耗方面都有所增加,运行在这些设计上的软件也是如此。人工智能开发现在已司空见惯,在嵌入式 Arm 项目中使用富操作系统(Rich Operating Systems)也变得普遍。C 和 C++ 语言标准在不断演进。Arm 及许多其他公司也一直在大力投资 LLVM 项目。今天对编译器的要求与 AC6 发布时的要求截然不同,就像当年对 AC6 的要求与 1998 年第一代 Arm 嵌入式编译器的要求大相径庭一样。
为了应对日益增长的复杂性和不断提高的需求所带来的挑战,并满足当前和未来基于 Arm 的嵌入式项目开发者的需求,嵌入式 Arm 编译器正在完成由 AC6 在 10 年前开启的向 LLVM 的迁移。从 AC5 遗留下来的剩余专有组件(链接器、C 库、binutils)将被淘汰,Arm 将转而加大对 LLVM 同等组件以及 Picolib C 库项目的投资。
因此,第七代 Arm 嵌入式 C/C++ 编译器将首次实现 100% 开源。为了区别于 AC6,并强调它是一个完整的编译工具链而不仅仅是一个编译器,第七代将被命名为嵌入式 Arm 工具链 (ATfE)。
相比 AC6 的优势
ATfE 旨在满足当前和未来从事高端 Arm 项目的开发者的需求。与 AC6 相比,嵌入式 Arm 工具链将提供诸多优势,包括:
优化重点放在 Arm 64 位 (AArch64) 内核的性能以及使用 Armv8.1-M 架构的项目上。这为复杂的高性能 Arm 平台(例如为人工智能项目开发的平台)带来了好处。
ATfE 将与 GNU 嵌入式 Arm 工具链保持高度兼容,特别是将支持 GNU-ld 链接器脚本格式。这降低了需要同时使用 ATfE 和 GCC 的项目的成本和开销,消除了开发团队必须精通多种编译器标准的需求,并简化了项目在编译器之间的迁移。
对于不需要 Arm 官方技术支持的用户,将提供一个免费使用版本,其性能和功能与专业商业版完全相同。
ATfE 将提供对 LLVM 项目中实用功能的访问,这是 AC6 无法做到的。例如代码/内存清理器 (sanitizers) 等安全功能,这有助于应对日益增长的与网络安全和内存安全相关的担忧与挑战。
未来,ATfE 将能够支持富操作系统,例如嵌入式 Linux、Zephyr 和 FreeRTOS。这对于功能安全 (Functional Safety) 开发尤为重要,Arm 将首次能够为在汽车等领域部署操作系统的项目提供经过安全认证的编译器。
版本划分 (Editions)
嵌入式 Arm 工具链将提供 4 个版本:
Arm Toolchain (源码版):在 GitHub 仓库中包含工具链的源代码和构建脚本,预计于 2025 年 4 月可用。认为从源码构建工具有价值的用户将能够自行构建。
Arm Toolchain for Embedded (ATfE 免费版):将是一个 100% 开源的工具链,可免费用于商业和非商业目的。二进制文件将由 Arm 构建并验证,通过 Arm 社区论坛提供支持。该版本预计于 2025 年 4 月发布,目前已提供测试版。
Arm Toolchain for Embedded Professional (ATfEP 专业版):在功能和优化方面与免费版 ATfE 完全相同,但是商业授权而非免费使用。该工具链将通过 Keil MDK 6、Arm Development Studio UBL Gold 和 Arm Success Kits 的基于用户的许可证 (UBL) 来启用。预计于 2025 年 4 月发布,目前已提供测试版。ATfEP 为专业开发团队提供了极具价值的附加功能:
由 Arm 提供官方技术支持,而非社区论坛支持。编译器是关键任务且高度复杂的工具(AC6 的技术参考手册长达 1000 多页),由既了解工具链又了解 Arm 架构的专家提供专业支持,可带来巨大价值。
通过 Arm Success Kits 早期访问计划,ATfEP 将提供对尚未发布的新一代 Arm 内核的支持。
ATfEP 将能够收集本地使用情况分析,识别谁使用了该工具链、使用了哪个版本以及使用频率。为了方便用户的 IT/管理专家,这些信息会存储在本地许可证服务器上,Arm 无法访问这些信息。这种使用情况信息是 Arm 合作伙伴的常见需求,有助于评估工具链的使用情况和交付价值、收集反馈和请求以帮助 Arm 确定未来开发的重点、跟踪工具链升级的部署情况,以及确保任何安全漏洞得到缓解等。
Arm Toolchain for Embedded FuSa (ATfEF 功能安全版):这是 ATfEP 的安全认证变体,预计于 2026 年底可用。随着 Arm Compiler for Embedded FuSa 6.22LTS 于 2024 年 10 月发布,这维持了 Arm 面向安全开发的嵌入式编译器每 2-3 年发布一次的历史节奏。
测试版 (Beta version)
尽管嵌入式 Arm 工具链预计于 2025 年 4 月公开发布,但目前已提供测试版。欢迎大家开始体验该工具链,我们非常感谢您能提供任何反馈!虽然该工具链已具备功能性,但它仍处于测试阶段,用户需要注意一些事项,包括:
可用的库变体受限。值得注意的是,目前仅提供位置相关的变体,不支持安全功能的库,不支持 C++ 线程,仅提供精准浮点 (Precise FP) 支持。库变体的范围将在未来的版本中扩展。
优化尚不成熟,目前的性能可能低于预期。
库启动代码 (Boot code) 功能尚不完整。例如,没有现有启动代码的项目将需要自行添加解包映像和初始化目标内存的函数。
测试版下载包可在此处获取。该软件包包含工具链二进制文件、用户与迁移指南、从 AC6 迁移过来的 Arm Development Studio 示例项目、链接器脚本概述指南,以及帮助迁移旧版 armasm 格式汇编文件的脚本。
AC6 的未来
计划于 2025 年 3 月发布的 6.24 版本将包含对 Armv9.6-A 架构版本的改进支持(继 6.23 版本中对该版本的测试版支持之后),并且这将是 AC6 的最后一个计划版本。我们预计未来仍会以大约每年一次的频率发布更新,但仅包含缺陷修复(不再提供新的架构支持、语言支持、优化、新功能等)。
所有支持 ATfE 专业版的许可证都将继续支持 AC6,用户可以自由选择最适合其项目的编译器。这与 10 年前 AC6 发布时 AC5 所面临的情况如出一辙:AC5 停止了新功能开发,但由于在某些项目中被认为比 AC6 更合适,因此 AC5 一直在现有和新项目中继续被使用。
对于满足以下条件的现有和新嵌入式项目,AC6 可能将继续保持吸引力:
已经在多处使用 AC6,且不希望迁移到其他编译器。 虽然从 AC6 迁移到 ATfE 的复杂程度不太可能像当年从 AC5 迁移到 AC6 那样高,但库和链接器脚本格式确实不同。迁移是必须的,而对于某些项目来说,迁移的成本和风险可能大于迁移到 ATfE 所带来的收益。
对最小代码体积有严格要求,特别是对于 Armv6-M 和 Armv7-M 项目。 ATfE 的优化重点是 AArch64 和 Armv8.1-M 内核的性能:它在最小代码体积方面的优化可能并不总是能达到 AC6 的水平。
依赖 AC6 分散加载文件 (scatter-loading file) 的价值,用于管理复杂的非托管内存布局。ATfE 采用了 GNU-ld 链接器脚本格式,不再支持分散加载 (scatter-loading) 功能。
简单总结一下,ATfE工具链的一些变化:
1)默认支持Picolibc 标准库,可选Newlibc nano标准库
2)重新使用回arm gcc的ld链接器脚本文件
3)理论上,可以紧跟LLVM项目的版本更新。但从github发布页来看,一般只更新大版本,基本上版本就是20 -> 21 -> 22这样
4)github发布的版本,开源免费,不需要许可证。Mac OS和Linux系统上,直接替代arm gcc
https://github.com/arm/arm-toolchain/releases
https://github.com/picolibc/picolibc
补充一点,armclang工具链没有提供单独的调试器程序,有人猜测集成在keil mdk软件上,但我不认同这个说法。
ATfE工具链也没有发布单独的调试器程序LLDB,可能是LLDB需要依赖python脚本,以后会不会发布LLDB就不得而知。
这一点不是什么问题,老规矩,使用arm gcc v15.2 rel1的GDB调试器就行!
接下来,使用at32f403a单片机搭建简单的SEGGER_RTT_printf项目,使用ATfE工具链 + Cmake生成工具 + Ninja构建工具。
这次使用Ninja这个以构建速度快而出名的工具,替代mingw32-make构建工具,小项目也确实能感觉出构建速度变快了。
由于at32f403a单片机的RDP1存在硬件漏洞,在受到电压毛刺攻击,会被非法读取出固件。就顺便简单实现对SLib的支持,希望厂家后续能在硬件上,彻底解决这个严重的安全问题,要不然用SLib太麻烦了,会累死人的!
雅特力AT32的SLib库,本质上就是XOM(仅执行存储器,Execute-Only Memory),与STM32的PCROP(专有代码读出保护,Proprietary Code Read-Out Protection)是相同的东西,都是基于flash控制器的保护功能。
这个功能并不是无法**的,已经爆出了3个安全漏洞,至少有1个是高危漏洞!但怎么说呢,使用这个功能,总比放任“固件裸奔”的要强。
产生仅执行代码,在cmakelists文件上,是比较简单的,对代码文件单独添加-mexecute-only编译链接参数即可。
产生符号定义文件,在armclang工具链上,也是非常简单的,只是在链接器上添加一句参数的事情。
但到了arm gcc与ATfE工具链,要产生符号定义文件,好像没有简单直接的方式。这里,使用脚本来实现。
ATfE工具链的符号定义文件,脚本输出的文件如下:
- /* ATfE/GCC Symbol Definitions For Execute-Only Code */
- PROVIDE(__dso_handle = 0x00000000);
- PROVIDE(_spim_init_length = 0x00000000);
- PROVIDE(_Min_Heap_Size = 0x00000200);
- PROVIDE(_Min_Stack_Size = 0x00000400);
- PROVIDE(g_pfnVectors = 0x08000000);
- PROVIDE(main = 0x8000185);
- PROVIDE(SEGGER_RTT_WriteNoLock = 0x80001ed);
- PROVIDE(SEGGER_RTT_Write = 0x800033d);
- PROVIDE(SEGGER_RTT_Init = 0x80003dd);
- PROVIDE(SEGGER_RTT_vprintf = 0x8000451);
- PROVIDE(_PrintUnsigned = 0x80008dd);
- PROVIDE(SEGGER_RTT_printf = 0x8000a59);
这个时代,已经发展到,不需要提供Cmakelists.txt文件了,真的没有必要!
工具链信息:
- "C:\Program Files\JetBrains\CLion 2026.1.3\bin\cmake\win\x64\bin\cmake.exe" -DCMAKE_BUILD_TYPE=Debug "-DCMAKE_MAKE_PROGRAM=C:/Program Files/JetBrains/CLion 2026.1.3/bin/ninja/win/x64/ninja.exe" -DCMAKE_C_COMPILER=C:/Toolchain/ATfE-22.1.0-Windows-x86_64/bin/clang.exe -DCMAKE_CXX_COMPILER=C:/Toolchain/ATfE-22.1.0-Windows-x86_64/bin/clang++.exe -G Ninja -S D:\TODO\project\CLion_ATfE_project -B D:\TODO\project\CLion_ATfE_project\cmake-build-debug-atfe
- -- The ASM compiler identification is Clang with GNU-like command-line
- -- Found assembler: C:/Toolchain/ATfE-22.1.0-Windows-x86_64/bin/clang.exe
- -- The C compiler identification is Clang 22.1.0
- -- The CXX compiler identification is Clang 22.1.0
- -- Detecting C compiler ABI info
- -- Detecting C compiler ABI info - done
- -- Check for working C compiler: C:/Toolchain/ATfE-22.1.0-Windows-x86_64/bin/clang.exe - skipped
- -- Detecting C compile features
- -- Detecting C compile features - done
- -- Detecting CXX compiler ABI info
- -- Detecting CXX compiler ABI info - done
- -- Check for working CXX compiler: C:/Toolchain/ATfE-22.1.0-Windows-x86_64/bin/clang++.exe - skipped
- -- Detecting CXX compile features
- -- Detecting CXX compile features - done
- -- Configuring done (1.4s)
- -- Generating done (0.0s)
- -- Build files have been written to: D:/TODO/project/CLion_ATfE_project/cmake-build-debug-atfe
- [已完成]
最后附上ATfE工具链 + Cmake生成工具 + Ninja构建工具的构建信息
- ====================[ 构建 | CLion_ATfE_project.elf | Debug-ATfE ]================
- "C:\Program Files\JetBrains\CLion 2026.1.3\bin\cmake\win\x64\bin\cmake.exe" --build D:\TODO\project\CLion_ATfE_project\cmake-build-debug-atfe --target CLion_ATfE_project.elf -j 18
- [1/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_emac.c.obj
- [2/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/d_app/src/main.c.obj
- [3/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/cmsis/cm4/device_support/system_at32f403a_407.c.obj
- [4/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_debug.c.obj
- [5/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/f_hal/src/hal_ms_tick.c.obj
- [6/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_crc.c.obj
- [7/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_bpr.c.obj
- [8/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_acc.c.obj
- [9/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_exint.c.obj
- [10/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_dma.c.obj
- [11/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_dac.c.obj
- [12/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/at32f403a_407_board/at32f403a_407_board.c.obj
- [13/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_adc.c.obj
- [14/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/e_component/SEGGER_RTT_V866/RTT/SEGGER_RTT_printf.c.obj
- [15/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_can.c.obj
- [16/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_crm.c.obj
- [17/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_pwc.c.obj
- [18/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_misc.c.obj
- [19/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_wdt.c.obj
- [20/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_rtc.c.obj
- [21/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_wwdt.c.obj
- [22/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_sdio.c.obj
- [23/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_gpio.c.obj
- [24/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/src/at32f403a_407_clock.c.obj
- [25/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_usart.c.obj
- [26/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/src/sysmem.c.obj
- [27/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_i2c.c.obj
- [28/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_spi.c.obj
- [29/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/src/syscalls.c.obj
- [30/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_xmc.c.obj
- [31/37] Building ASM object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/cmsis/cm4/device_support/startup/gcc/startup_at32f403a_407.s.obj
- [32/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/src/at32f403a_407_int.c.obj
- [33/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/e_component/SEGGER_RTT_V866/RTT/SEGGER_RTT.c.obj
- [34/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_usb.c.obj
- [35/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_flash.c.obj
- [36/37] Building C object CMakeFiles/CLion_ATfE_project.elf.dir/g_mcu/at32f403a/libraries/drivers/src/at32f403a_407_tmr.c.obj
- [37/37] Linking C executable CLion_ATfE_project.elf
- Memory region Used Size Region Size %age Used
- FLASH: 5260 B 1 MB 0.50%
- RAM: 2816 B 96 KB 2.86%
- SPIM: 0 GB 16 MB 0.00%
- text data bss dec hex filename
- 5208 52 2764 8024 1f58 D:/TODO/project/CLion_ATfE_project/cmake-build-debug-atfe/CLion_ATfE_project.elf
- ============================================================================================================
- 🚀 Build Artifacts Generated Successfully!
- ============================================================================================================
- [ELF Executable] : D:/TODO/project/CLion_ATfE_project/cmake-build-debug-atfe/CLion_ATfE_project.elf
- [HEX File] : D:/TODO/project/CLion_ATfE_project/cmake-build-debug-atfe/CLion_ATfE_project.hex
- [BIN File] : D:/TODO/project/CLion_ATfE_project/cmake-build-debug-atfe/CLion_ATfE_project.bin
- [ASM Disassembly] : D:/TODO/project/CLion_ATfE_project/cmake-build-debug-atfe/CLion_ATfE_project.asm
- [MAP File] : D:/TODO/project/CLion_ATfE_project/cmake-build-debug-atfe/CLion_ATfE_project.map
- [SYMBOLS File] : D:/TODO/project/CLion_ATfE_project/cmake-build-debug-atfe/CLion_ATfE_project_symbols.ld
- ============================================================================================================
- 构建 已完成
|