【ARM 嵌入式 编译系列 2.3 -- GCC 中指定 ARMv8-M 的 Thumb 指令集参数详细介绍】

本文介绍了ARMv8-M架构及其Thumb指令集在嵌入式开发中的应用,详细讲解了如何在Makefile中配置GCC以生成针对ARMv8-M的优化代码,包括使用-mthumb、-march、-nostartfiles和-ffreestanding参数。后续内容将涉及ARM嵌入式C编程的其他主题。
摘要由CSDN通过智能技术生成


请阅读【ARM GCC 编译专栏导读】


上篇文章:【ARM 嵌入式 编译系列 2.2 – 如何在Makefile 中添加编译时间 | 编译作者| 编译 git id】
下篇文章:【ARM 嵌入式 C 入门及渐进 3 – GCC attribute((weak)) 弱符号使用】

ARMv8-M 架构

ARMv8-M 架构是 ARMv8 架构的一个专为微控制器设计的小型化变种,它与 ARM Cortex-M 系列处理器关系密切。ARMv8-M 架构继续支持 ARM 的 Thumb 指令集,包括基础的 Thumb 指令(也称为 Thumb-1)和更高级的 Thumb-2 指令扩展。

Thumb 指令集

Thumb 指令集是 ARM 架构的一个特性,旨在提供更好的代码密度,也就是说,让程序占用更少的内存空间。Thumb 指令集通过使用 16 位宽的指令来实现(尽管在 Thumb-2 扩展中引入了一些 32 位宽的指令),而标准的 ARM 指令通常是 32 位宽的。这种压缩的指令集对于内存受限的嵌入式系统非常有用。

ARMv8-M 与 Thumb

在 ARMv8-M 中,所有的指令都是使用 Thumb 指令集来执行的,不存在传统的 32 位 ARM 指令集模式。这是一个重要的区别,因为在某些较早的 ARM 架构中,如 ARMv7,处理器可以在 ARM 模式(32 位指令)和 Thumb 模式(16 位和 32 位混合指令)之间切换。

ARMv8-M 架构进一步扩展了 Thumb 指令集,添加了更多的指令和功能来提高性能,同时保持了低功耗的特点。其中包括:

  • Thumb-2 指令集:一个增强的指令集,包括 32 位的指令以及更复杂的处理能力。
  • TrustZone for ARMv8-M:一种安全技术,为嵌入式设备提供了类似于更大 ARMv8-A 处理器的安全特性。

当你使用如 GCC 这样的交叉编译器为 ARMv8-M 架构的微控制器编译代码时,你会使用 -mthumb 选项来指示编译器生成 Thumb 指令集的代码,因为这是 ARMv8-M 支持的唯一指令集模式。同时,你可以使用 -march=armv8-m.main 或其他 ARMv8-M 相关的架构选项来针对具体的 ARMv8-M 架构生成代码。

ARMv8-M 架构专为提供高性能和低功耗的嵌入式和物联网(IoT)设备所设计,而 Thumb 指令集在实现这些目标方面起着关键作用。

-mthumb

  • 描述:这个参数告诉编译器生成 Thumb 指令集的代码,而不是 ARM 指令集的代码。Thumb 指令集是 ARM 指令集的一个子集,它使用较短的指令(大多数是 16 位)以减少代码的大小,从而可以在内存受限的系统中获得更好的代码密度。但是,它可能牺牲了一些性能,因为 Thumb 指令在某些情况下可能不如标准 ARM 指令集那么强大或灵活。
  • 示例用途:在需要缩小程序二进制大小的嵌入式系统中使用。

-march=armv8-m.main

  • 描述:该参数指定目标架构,告诉编译器生成针对特定处理器架构的代码。在这个例子中,armv8-m.main 指 ARMv8-M 主要(main)配置,它是 ARMv8-M 架构的一个变种,支持更多的硬件和软件功能,比如硬件浮点支持。
  • 示例用途:当你正在为符合 ARMv8-M 架构的具体处理器编写代码时使用。

-nostartfiles

  • 描述:这个参数告诉链接器不要使用标准的系统启动文件(startfiles),这些文件通常包含了启动代码(如设置栈、初始化全局变量等),这段代码在执行 main 函数之前运行。在嵌入式或裸机环境中,开发者通常需要自定义启动代码,因为标准的启动代码不适合这些环境。
  • 示例用途:在需要完全控制程序启动过程(如嵌入式系统启动)的情况下使用。

-ffreestanding

  • 描述:此参数告诉编译器编译的是一个“freestanding”环境代码,即环境可能不支持标准库中的所有功能。它允许编译器生成不依赖于标准库(如libc)的代码,这对于操作系统内核或嵌入式系统开发非常重要,其中可能不提供完整的标准库支持。
  • 示例用途:在编写操作系统内核或不依赖标准库的嵌入式应用程序时使用。

参数配置示例

假设你正在为一个 ARMv8-M 架构的嵌入式系统编写程序,并且你需要完全控制程序的启动序列,同时希望优化程序大小。你可以使用以下命令来编译你的代码:

arm-none-eabi-gcc -mthumb -march=armv8-m.main -nostartfiles -ffreestanding -o my_program main.c

这条命令行将使用 Thumb 指令集编译 main.c 文件,针对 ARMv8-M 主要配置生成代码,并排除标准启动文件,同时假定一个 freestanding 环境,最后输出一个名为 my_program 的可执行文件。

在 Makefile 中可以通过 CFLAGS 进行配置:

CPUTARMV8 = -mthumb -march=armv8-m.main -mfloat-abi=hard -mfpu=fpv5-sp-d16
CFLAGS := $(CPUTARMV8) -g -O0 -nostartfiles -ffreestanding -Wall -Werror

上篇文章:【ARM 嵌入式 编译系列 2.2 – 如何在Makefile 中添加编译时间 | 编译作者| 编译 git id】
下篇文章:【ARM 嵌入式 C 入门及渐进 3 – GCC attribute((weak)) 弱符号使用】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公讲 ARM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值