1+1=10

记记笔记,放松一下...

ARM开发环境小记

接前面STM32小记,继续学习ARM开发环境。

东西似乎比较杂,简单搜集记录一下。以免忘了....

Keil MDK-ARM

关注一下它的编译器,armcc已经太老了,使用armclang。

Keil ,取自其创始人的名字,德国人,发音 /kɑɪl/ - 其中 "kɑɪ" 发音类似于英语单词 "kite"。似乎在国内 /keɪl/或/ki:l/ 也能接受?

Keil MDK-ARM 是一个强大的微控制器开发环境,专为 ARM Cortex-M 微处理器设计。它提供了包括 µVision IDE、编译器、调试器和必要的中间件组件。具有高级的代码编辑功能、项目管理工具和强大的调试功能。它也支持 RTOS(实时操作系统)和提供了广泛的中间件库。

  • 1982年,Keil Elektronic GmbH在德国成立,专注于8051微处理器的开发工具。
  • 1990年代末,随着ARM架构兴起,Keil开始开发面向ARM的编译器和调试工具。
  • 2005年,ARM公司收购了Keil。
  • Keil MDK-ARM:随着 ARM 微控制器的普及,Keil 发布了 Microcontroller Development Kit (MDK),专为 ARM Cortex-M 和 Cortex-R 系列设计。
  • 2014年:Keil MDK-ARM 版本5发布,引入了许多新功能和改进,包括对 ARM Cortex-M 内核的全面支持,以及全新的软件包管理功能。

注意:Keil 有4套东西

  • Keil MDK:Keil for ARM,Keil MDK-ARM,用于ARM微处理器
  • Keil PK51:Keil C51, 用于 8051微处理器
  • Keil PK166:Keil C166,用于 XC16x, C16x, ST10微处理器
  • Keil DK251:Keil C251,用于 C251微处理器

不用于商业开发的话,Keil MDK社区版本 可以免费使用,社区版之前叫做MDK Lite版本。

keil MDK 编译器

  • ARM Compiler 5:armcc
  • ARM Compiler 6:armclang
日期 Keil MDK 版本 默认编译器 备注
2016年5月 5.22 ARM Compiler 5 首次引入 ARM Compiler 6,但非默认
2017年6月 5.24 ARM Compiler 5 强烈推荐迁移到 ARM Compiler 6
2018年 5.25 ARM Compiler 6 ARM Compiler 6 成为默认编译器
2022年 5.34 ARM Compiler 6 不再包含 ARM Compiler 5,需要手动配置

Gun GCC工具链

STM32CubeIDE是一个专用于STM32的免费的开发环境,它使用的时GUN GCC工具链。在其安装目录下 STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gun-tools-for-stm32.... 下面,可以看到arm-none-eabi 字样。

用于ARM的GCC工具链,2014年之前是Sourcery GCC,2010起 Linaro成立后提供 GCC工具链下载,后来由ARM官方提供GCC工具链下载。

ARM官网

在ARM官网,我们可以看到其为4种target在不同的操作系统下都提供了GUN交叉编译工具链。这4种target列成表格如下:

Target Triple 架构 系统 ABI 浮点支持 主要用途
arm-none-eabi AArch32 Bare-metal EABI 硬件/软件(可选) 嵌入式系统(如微控制器)
arm-none-linux-gnueabihf AArch32 GNU/Linux GNU EABI with hard-float 硬件浮点 嵌入式Linux系统,需要硬件浮点支持
aarch64-none-elf AArch64 Bare-metal ELF 硬件浮点 高性能嵌入式系统,无操作系统
aarch64-none-linux-gnu AArch64 GNU/Linux GNU 硬件浮点 服务器或高端嵌入式系统运行Linux

注意:

  • aarch64都支持硬件浮点,所以ABI无需体现浮点特性。
  • aarch32用于嵌入式Linux系统时,需要硬件浮点支持。ABI种的hf代表硬件浮点(Hard Float)。

软件包名字(以Window下为例),挺长的(当前2024年4月):

  • arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-arm-none-eabi.zip
  • arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-arm-none-linux-gnueabihf.zip
  • arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-aarch64-none-elf.zip
  • arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-aarch64-none-linux-gnu.zip

Ubuntu

Ubuntu官方仓库提供如下软件包:

  • gcc-arm-linux-gnueabi
  • gcc-arm-linux-gnueabihf
  • gcc-arm-none-eabi
  • gcc-aarch64-linux-gnu

对应target分别为(可查看其gcc对应的名字,比如arm-linux-guneabi-gcc):

  • arm-linux-guneabi
  • arm-linux-gnueabihf
  • arm-none-eabi
  • aarch64-linux-gnu

由于Arm GNU Toolchain releases已经在ARM官网提供,PPA GNU Arm Embedded Toolchain in Launchpad 已经不再使用。Ubuntu仓库和Arm官方用的应该是一样的

arm-none-eabi对应源码包(ubuntu24.04):

  • gcc-arm-none-eabi_13.2.rel1.orig.tar.bz2

地址:

  • http://hk.archive.ubuntu.com/ubuntu/pool/universe/g/gcc-arm-none-eabi/
  • http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-arm-none-eabi/

Linaro

Linaro 是一个非盈利组织,成立于 2010 年,专注于开发开源软件项目,特别是那些运行在基于 ARM 架构的设备上的项目。Linaro 的目标是提升 ARM 生态系统的软件质量、提高开发效率以及优化相关软件性能,以便更好地支持和利用 ARM 处理器的特性。

二进制包只提供到GCC7.5,时间也截止到2019年。(后面应该都是转到了ARM官方的GCC工具链)

  • aarch64-elf
  • aarch64-linux-gnu
  • aarch64_be-elf
  • aarch64_be-linux-gnu
  • arm-eabi
  • arm-linux-gnueabi
  • arm-linux-gnueabihf
  • armeb-eabi
  • armeb-linux-gnueabi
  • armeb-linux-gnueabihf
  • armv8l-linux-gnueabihf

Target Triple

没有统一的规定,一般来说,这个前缀代表TARGET平台:比如 CPU-PLATFORM-OS 组合,或 arch [-vendor] [-os] [-(gnu)eabi]

基本格式如下(注意,没有严格标准!!!):

arch-[vendor]-[os]-api

说明:

  • arch:代表目标的体系架构。即想要编译的代码将运行在哪种类型的处理器上。例如,arm、aarch64、x86等。
  • vendor:可选部分。指的是工具链供应商,这可以是任何组织或个人。不指定vendor,通常意味着没有特定的供应商,工具链是通用的。
  • os:也是可选部分。指定目标操作系统。这有助于工具链生成适应特定操作系统的代码,例如针对其系统调用、库函数等。none表示没有操作系统,这通常用于裸机(bare-metal)编程
  • api:对ARM来说,eabi,guneabihf, guneabi 等。其中,带gnu表示有linux系统,使用glibc库;不带gnu的是裸机,使用newlib库。

在从源码构建GCC交叉工具链时,在configure时可以指定build, host与target:

configure --build=xxxx --host=xxx  --target=xxxx
  • 如果build、host、target 三者一样,叫做native
  • 如果build与host一样,但与target不一样,叫做cross(交叉编译)。如果target指定为foo-bar,那么生成gcc则命名为 foo-bar-gcc

另外,有时会创建各种链接,比如飞思卡尔的gcc工具链:arm-fsl-linux-gnueabi-*,有时会创建arm-none-linux-guneabi-*arm-linux-* 来指向它。

历史

Sourcery G++ Lite (arm-none-linux-gnueabi)

网上不少中文资料都指向这个东西,但是官网似乎很隐蔽,原来它时间线:

  • 由Codesourcery 公司开发
  • 公司被Mentor收购
  • 终止该项目开发
  • Mentor被Siemens 收购

arm-none-linux-gnueabi是Codesourcery公司基于GCC推出的ARM交叉编译工具。包括

  • GNU C 和 C++编译器
  • GNU 汇编和链接器
  • C 和 C++运行库
  • GNU 调试器

可用于交叉编译ARM系统中各个环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和应用程序。它提供有Linux、Windows下的预编译二进制。

比如Linux下预编译包,其软件包命名如下:

  • arm-2006q1-6-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
  • arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
  • arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
  • arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
  • arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

软件包的日期在2010年命名上稍有区别,应该和Codesourcery被Mentor收购有关。

2014.05-29 是该工具包最后一个版本,工具包内个软件的版本信息如下:

  • GCC 4.8.3
  • GNU二进制工具 2.24.51
  • GDB 7.7.50
  • GNU C库 2.18
  • Linux内核头文件 3.13

IAR Embedded Workbench

先放上,以免忘了。

IAR Embedded Workbench 是一个集成开发环境和工具链,支持包括 STM32 在内的多种 ARM Cortex-M 微控制器。它以其编译器优化技术和高效的代码生成而闻名。提供了高级的代码优化功能,包括对代码大小和执行速度的优化,以及全面的调试工具。

IAR Embedded Workbench 使用的编译器通常被称为 IAR C/C++ Compiler。这个编译器是 IAR Systems 提供的,专门为嵌入式系统的开发设计。IAR C/C++ Compiler 针对多种微处理器架构提供优化,支持包括 ARM、AVR、MSP430、RX、RISC-V、8051 等多种流行的微控制器。

LLVM工具链

先放上:

Arduino

Arduino /ɑːrˈdwiːnoʊ/ 是一个开源电子原型平台,由硬件(物理编程板)和软件(Arduino IDE)两部分组成。它是设计用来让艺术家、设计师、爱好者和任何对创造互动对象或环境感兴趣的人更容易接入到电子和编程世界中。

Arduido IDE

Arduino IDE 使用的编译器依赖于目标硬件平台。对于基于不同微控制器的开发板,Arduino IDE 使用不同的工具链来处理代码的编译和上传。

  • 对于基于AVR的Arduino开发版(Arguino Uno, Mega等),Arduino IDE 使用 arv-gcc编译器。

  • 对于基于ARM的Arduibo 开发版(Arduino Due, Zero, MKR等),Arduino IDE使用 arm-none-eabi-gcc编译器

在 ARM Cortex-M 微控制器开发中,有 CMSIS、SPL、HAL 和 LL 不同的个东西。

CMSIS 是 ARM主导的,而SPL(STM32标准库)、HAL和LL是ST主导的,用于STM32*。

特性 CMSIS SPL HAL LL (Low-Layer)
定义 ARM 提供的标准化软件接口,简化 Cortex-M 系列微控制器的开发。 STMicroelectronics 提供的标准外设库,用于 STM32 微控制器。 STMicroelectronics 提供的硬件抽象层库,用于 STM32 微控制器。 STMicroelectronics 提供的低层次硬件接口库,用于 STM32 微控制器。
标准化 提供一致的接口,适用于不同厂商的 Cortex-M 微控制器。 针对 STM32 系列微控制器,提供一致的外设接口。 针对 STM32 系列微控制器,提供一致的外设接口。 针对 STM32 系列微控制器,提供一致的外设接口。
组件化 包括 CMSIS-Core、CMSIS-DSP、CMSIS-RTOS、CMSIS-Driver 等多个组件。 包含各类外设驱动函数。 包含各类外设驱动函数。 包含各类外设驱动函数。
抽象层级 低级:直接访问 Cortex-M 内核和基本外设寄存器。 中级:提供对 STM32 外设的高级抽象。 高级:提供对 STM32 外设的高级抽象。 低级:提供对 STM32 外设的直接访问。
代码可读性 需要对 Cortex-M 内核有较深理解。 提供较为简洁的 API,适合快速开发。 提供较为简洁的 API,适合快速开发。 代码量较大,适合需要精细控制的场景。
性能优化 提供优化的 DSP 和 RTOS 支持。 性能较高,但抽象层次较低。 易于使用,但可能在某些情况下性能不如 LL。 性能高,适合对时间和资源要求严格的应用。
适用场景 - 系统初始化、异常处理、内核寄存器操作。 - 高性能计算(CMSIS-DSP)。
- RTOS 开发(CMSIS-RTOS)。
- STM32 微控制器的基本外设配置和操作。 - STM32 微控制器的基本外设配置和操作。 - 需要高性能和精细控制的嵌入式应用。
集成工具 与 ARM 的开发工具链紧密集成。 与 STM32 标准库和开发工具链紧密集成。 与 STM32CubeMX 工具紧密集成,可自动生成初始化代码。 与 STM32CubeMX 工具紧密集成,可自动生成初始化代码。

CMSIS

CMSIS (Cortex Microcontroller Software Interface Standard)

CMSIS 是由 ARM 提供的一个软件接口标准,旨在使软件复用、可移植性和开发效率最大化。CMSIS 定义了一系列与硬件无关的接口,使得开发者可以编写与特定微控制器无关的应用软件。

HAL (Hardware Abstraction Layer)

HAL 是“硬件抽象层”的英文缩写,通常由微控制器制造商提供,用于简化直接通过寄存器访问硬件资源的复杂性。HAL 为应用程序和硬件设备之间提供了一个抽象的接口,使得应用程序可以不依赖于底层硬件的具体实现。

LL (Low Layer)

LL 是“低层”(Low Layer)的简称,也是由微控制器制造商提供的库,它提供了比 HAL 更接近硬件的抽象层。LL 库允许更精细的硬件控制,并且通常比 HAL 更为高效,但使用起来比 HAL 更复杂。

SPL (Standard Peripheral Library)

ST 标准外设库(Standard Peripheral Library),通常简称为 SPL,是由 STMicroelectronics 提供的一套用于 STM32 微控制器的硬件抽象层(HAL)库。它为用户提供了一组函数,用于配置和控制 STM32 微控制器的各种外设,如 GPIO、USART、SPI、I2C、ADC 等。

尽管STM32Cube HAL 库是 ST 推出的新一代库,SPL 仍然在一些老旧项目和特定需求中被广泛使用!

参考

EE arm