ARM 架构的 MCU 用了好多年,进一步对于 ARM 架构也或多或少的有了一些了解。之前都是遇到啥问题直接去官网找对应的手册,一直没有系统的总结一下。是时候总结一下,以便进行下一步学习了!
总的来说,整个 ARM 可以分为两大部分:SoC 设计 和 ARM 平台软件开发。
ARM 文档
在了解 ARM 相关的各种概念之前,先来简单说一下 ARM 官方提供的文档的组织结构。其实,国外这些大公司对于文档的组织都是比较规范的,例如,ST 的 参考手册、数据手册、应用手册等等,ARM 文档也基本可以分为参考手册、用户指南。这么划分的目的就是为了让各部分更加独立。简单来说,参考手册仅介绍原理,用户指南介绍使用方法,两者相互独立。
- Arm Architecture Reference Manual :架构参考手册描述架构规范。是按照不同的架构版本分开的(如上图是 Armv8-A的架构参考手册),里面会详细介绍对应架构的细节。
- Technical Reference Manual (TRM) :这个是针对 ARM IP 的参考手册。 描述特定于该 ARM IP 的特性。
- Configuration and Integration Manual (CIM) :这个也是针对 ARM IP 的参考手册。描述如何将处理器集成到系统中。一般来说,这些信息只与 SoC 设计相关。仅对被授予了 IP 许可的合作方开放。
下表显示了在不同类型的文档中的内容:
上面说的文档都属于参考手册
ARM 的所有文档都放在专门为开发者提供了网站 Arm developer website 上,除此之外,ARM 的官方社区也是一个宝库,社区包含:博客(ARM 的设计师经常在上面分享一些文章)、论坛(里面有很多专业问题及设计师的解答)。
架构(Architecture)
架构(Architecture)指的是一些列的功能规范。ARM 架构 指的就是是基于 ARM 架构的处理器的功能规范,即 ARM CPU 架构。架构指定了处理器的行为方式,例如它有什么指令以及指令做什么。
可以将架构看作是硬件和软件之间的契约,描述了软件可以依赖硬件提供哪些功能。大体包含以下内容:
条目 | 说明 |
---|---|
指令集 | 每条指令的功能;指令如何在内存中表示(它的编码) |
寄存器组 | 有多少寄存器;寄存器的大小;寄存器的功能;寄存器的初始状态 |
异常模型 | 不同的权限级别;异常的类型;从异常中获取或返回时会发生什么 |
内存模型 | 内存访问是如何排序的;缓存是如何运作的,什么时候以及软件必须如何执行显式维护 |
调试、跟踪和分析 | 如何设置和触发断点;跟踪工具可以捕获什么信息,以什么格式捕获 |
ARM 架构 可以认为就是个专有名词,是 ARM 制定的一些列功能规范的统称。至今已经有发展了很多版。最初的 ARMv1、ARMv2,后来的 ARMv6、ARMv8;最新的 ARMv9。
每一代 ARM 架构 都有一个专门的文档(架构参考手册)来介绍该架构的具体细节。需要注意的是,架构参考手册是根据 Profile 来分开的,并不是一个统一的文档。例如,《Armv8-M Architecture Reference Manual》、《Armv8-A Architecture Reference Manual》等等。
微架构(Micro-Architecture)
ARM 架构不会介绍处理器是如何构建的或它是如何工作的。 处理器的构建和设计称为微架构。 微架构介绍了特定处理器的工作方式。微架构就是对于 ARM 架构的进一步的实现
微架构包括以下内容:
- 管道长度和布局
- 缓存的数量和大小
- 单个指令的循环计数
- 实现了哪些可选功能
一个 ARM 架构可以有多个不同的微架构以实现针对多种应用环境。例如,ARM 自己提供的各种 ARM 核就是一个个不同的微架构。
系统架构(System Architecture)
除了上面说的 ARM 架构之外,ARM 对构成现代芯片上系统(SoC)的许多组件都有类似的规范。ARM 系统架构定义了相关组件和接口,使硬件和软件更容易进行互操作。系统架构的整体框图如下图所示:
规范是软件兼容性的基础。根据规范构建硬件意味着可以编写与之相匹配的软件。根据规范编写软件意味着它可以在兼容的硬件上运行。ARM 架构是基础,通过指令集架构(Instruction Set Architecture,ISA)兼容性提供了一个通用的程序员模型。
基本系统架构(The Base System Architecture,BSA)规范描述了系统软件可以依赖的硬件系统架构。BSA 涵盖了处理器和系统架构的各个方面,例如中断控制器、计时器和操作系统需要的其他常见设备。这为标准操作系统、管理程序和固件提供了可靠的平台。
基本引导需求(The Base Boot Requirements,BBR)规范涵盖了基于 Arm 架构的系统以及操作系统和管理程序可以依赖的系统需求。该规范建立了固件接口要求,如 PSCI、SMCCC、UEFI、ACPI 和 SMBIOS。
其他标准可以建立在 BSA 的基础上,以提供特定于市场的标准化。 例如,服务器基础系统架构 (SBSA) 是针对服务器的 BSA 的补充。 SBSA 描述了服务器操作系统的硬件和功能要求。
-
Generic Interrupt Controller: 通用中断控制器(GIC) 规范定义了 Armv7-A/R 和 Armv8-A/R 的标准化中断控制器。通用中断控制器(GIC)从外设接收中断,按优先级排列它们,并将它们交付给适当的处理器核心。
目前,GIC 已经发展到了第四代。ARM 官方提供了 《ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification》和《Arm Generic Interrupt Controller Architecture Specification GIC architecture version 3 and 4》这两个文档来介绍 GIC。注意:M-Profile 使用的是 NVIC 中断控制器。
-
System Memory Management Unit: 系统内存管理单元(SMMU,有时也称为 IOMMU)为非处理器主机提供翻译服务。
目前,SMMU 已经发展到了第三代,ARM 官方提供了 《ARM System Memory Management Unit Architecture Specification - SMMU architecture version 2.0》和《Arm System Memory Management Unit Architecture Specification, SMMU architecture version 3》这两个文档来介绍 SMMU。 -
Generic Timer: 通用定时器为系统中的所有处理器提供公共参考系统计数。 这些计时器提供用于诸如操作系统调度程序滴答之类的功能。 通用定时器是 Arm 架构的一部分,但系统计数器是一个系统组件。
-
Server Base System Architecture and Trusted Base System Architecture: 服务器基础系统架构 (SBSA) 和可信基础系统架构 (TBSA) 为 SoC 开发人员提供系统设计指南。
-
Advanced Microcontroller Bus Architecture: 高级微控制器总线架构 (AMBA) 总线协议系列控制基于 Arm 的系统中组件的连接方式以及这些连接上的协议。
-
CoreSight Architecture: CoreSight 架构为实时调试和收集跟踪信息提供了系统范围的解决方案。
指令集架构
指令集架构(Instruction Set Architecture,ISA)是计算机抽象模型的一部分。它定义了软件如何控制 CPU。Arm ISA 允许开发人员编写符合 Arm 规范的软件和固件,以此实现在任何基于 Arm 的处理器上都可以以同样的方式执行它们。ARM 指令集架构有三种:
-
A64: A64 指令集是在 Armv8-A 中引入的,以支持 64 位架构。A64 指令集有固定的 32 位指令长度。主要的特性有:
- Clean decode table based on 5-bit register specifiers.
- Instruction semantics broadly similar to A32 and T32.
- 31 general-purpose 64-bit registers accessible at all times.
- No modal banking of general purpose registers for improved performance and energy.
- Program counter and stack pointer are not general purpose registers.
- Dedicated zero register available for most instructions.
-
A32: A32 指令集有固定的 32 位指令长度,并在 4 字节边界上对齐。A32 指令集就是在 Armv6 和 Armv7 架构中我们常说的 ARM 指令集,Armv8 及之后改名 A32 以与 A64 进行区分。 随着 Thumb-2 技术的引入,它的大部分功能都被纳入了 T32 中。
A32 指令主要被用于 A-profile 和 R-profile。 -
T32: T32 指令集最初是作为 16 位指令的补充集引入的,用于改进的用户代码的代码密度。随着时间的推移,T32 演变成 16 位和 32 位混合长度的指令集。因此,编译器可以在单个指令集中平衡性能和代码大小。
T32 指令集就是在在 Armv6 和 Armv7 架构中被我们所熟知的 Thumb 指令集,Armv8 及之后改名为 T32。 T32 支持所有架构的 Profile,并且是 M-Profile 架构所支持的唯一指令集。
指令集是架构参数手册中一个重要的章节,详细的介绍可以在对应版本的架构参考手册中找到。
以上这三种指令集被称为 ARM 基础指令集(ARM Base ISAs),除此之外,ARM 还提供指令集扩展:自定义指令、DSP、浮点等等。其中以我用的最多的浮点来简单说明一下。
ARM 浮点处理
最近项目中用到了大量的浮点运算,且要求的时间精度较高,但是在使用过程中发现,总是会超过时间限制。最终经过测试发现,程序中的浮点运算 sqrt
占用了大量时间,单个执行 sqrt
需要 30多个微妙。
我实际用的是基于 Cortex-m4f 核的 MCU,主频 128M,感觉单个执行 sqrt
需要时间有些过长于是开始在 ARM 官网找资料,结合 CMSIS 的代码,开始一步一步定位问题:
- 首先,根据 ARM 手册, Cortex-m4f 内核集成了浮点运算单元(FPU)和 DSP,实现单精度浮点算术运算,支持所有 ARM 单精度数据处理指令和数据类型,支持完整 DSP 指令集。
- 检查 CMSIS 代码中的相关配置也没有问题
- 接着查看 CMSIS 提供的专用 DSP 驱动库,在众多接口中偶然发现
arm_sqrt_f32
这个接口,其位于 CMSIS 的arm_math.h
中,具体定义如下:/** * @brief Floating-point square root function. * @param[in] in input value. * @param[out] *pOut square root of input value. * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if * <code>in</code> is negative value and returns zero output for negative values. */ static __INLINE arm_status arm_sqrt_f32( float32_t in, float32_t * pOut) { if(in >= 0.0f) { // #if __FPU_USED #if (__FPU_USED == 1) && defined ( __CC_ARM ) *pOut = __sqrtf(in); #else *pOut = sqrtf(in); #endif return (ARM_MATH_SUCCESS); } else { *pOut = 0.0f; return (ARM_MATH_ARGUMENT_ERROR); } }
从上面的定义不难看出,我们需要使用 ARM 顶一个的各种浮点运算接口才可以正常使用 浮点运算单元。
总结一下在使用浮点运算是需要注意一下几点:
- Cortex-M4 中集成的浮点运算单元是单精度浮点运算单元。因此,所有的浮点数运算最好都使用
float
类型,常数一定加上 f 后缀。(部分 Cortex-M7 集成了 双精度浮点运算单元) - 使用
arm_math.h
及 DSP 库中定义的相关浮点数运算接口。例如,C 语言的sqrt
可以使用arm_sqrt_f32
代替,三角函数sin
可以使用arm_sin
代替等等。注意,使用arm_math.h
及 DSP 库中相关接口时需要配置一些宏值。
ARM IP
ARM 不仅仅制定规范,还会在规范的基础上进一步设计,这些设计被称为 IP(Intellectual Property,知识产权)。ARM IP 有很多种:Processors(也就是我们平时说 ARM 核)、Graphics and Multimedia、System IP、Physical IP、Security IP、Subsystem。
Processors
Processors 即 ARM 核,也即 ARM CPU。就是一些可重复利用的、具有特定功能的集成电路模块。下图显示了 ARM 架构以及 ARM 核对应的关系:
从上如图中我们可以不难看出如下几点:
- ARM 架构版本很多,但是并不是每个 ARM 架构都有实际的实现。甚至于 ARM 自己也没有实现部分版本的架构
- 有部分第三方公司也基于 ARM 架构设计了自己的核心,例如苹果公司。这是由于 苹果公司具有 ARM 架构的授权。
ARM 为自己设计的核起了一个统一的品牌名字:Arm Cortex,同时针对不同的应用场景,分为了 Application Processors(应用处理器)Arm Cortex-A、Real-time Processors (实时处理器)Arm Cortex-R、Microcontroller Processors(微控制器处理器)Arm Cortex-M 三种不同的 Profile 。
除了以上我们比较常见的 ARM 核,ARM 还设计了其他一些处理器
System IP
Arm System IP 使系统设计人员能够配置和构建高性能、高能效的 SoC,同时通过行业标准 AMBA 接口将 Arm 处理器与他们自己的 IP 元素相结合,从而进一步区分。
AMBA(高级微控制器总线架构)是一种免费提供的开放标准,用于连接和管理片上系统 (SoC) 中的功能模块。 它有助于多处理器设计的一次性开发,具有大量控制器和外设。
Physical IP
Arm Artisan Physical IP 提供业界最全面、最先进的物理IP解决方案。使用 Arm ArtisanPhysical IP 可以有效地实现复杂的 SoC 设计。
Graphics and Multimedia Processors
- Arm Mali GPU IP
- Mali Camera Image Signal Processors (ISPs)
授权方式
从很多资料中,我们都能找到这样一句话 “ARM 本身并不制造和销售芯片,而是将设计授权给其他公司”。在多年发展中,ARM 逐渐形成了多种授权方式(等级),不同的授权方式,被授权方的权限不同。
ARM 主要有三种授权等级:使用层级授权、 内核层级授权和架构/指令集层级授权,其中指令集层级授权等级最高,企业可以对 ARM 指令集进行改造以实现自行设计处理器,如苹果在 ARM v7-A 架构基础上开发出苹果 Swift 架构,其他如高通 Krait、Marvell 等都是基于 ARM 指令集或微架构进行的改造所得。
Arm core licensees
前面我们介绍了 ARM 本身设计了很多 ARM 核,Core licensees 就是把这些核授权给购买者,购买者可以使用这些核来构建自己的 MCU、SoC。
Arm architectural licensees
牛逼的公司还可以购买 ARM 架构许可,使用 ARM 指令集设计自己的 CPU 核。这些核心必须完全符合 ARM 架构。其中,最为人所致的就是苹果公司。2013 年,Arm 表示大约有15 家公司被授予架构许可。
Built on ARM Cortex Technology licence
2016 年 2 月,ARM 宣布了 Built on ARM Cortex Technology 许可证,通常简称为 Built on Cortex (BoC) 许可证。该许可证允许授权公司与 ARM 合作,并对 ARM Cortex 的设计进行修改。这些设计修改不会与其他公司共享。其中比较为人所知的就是高通。
ARM Flexible Access
2019 年 7 月16 日,ARM 宣布了 ARM Flexible Access。ARM Flexible Access 为开发提供了对包括 ARM IP 的无限访问。
其他
除了上面说的这些,ARM 自己设计的其他 IP 也有对应的授权方式。例如,Mali licensees 授权给第三方使用 ARM 设计的 GPU。
参考
- https://developer.arm.com/
- https://en.wikipedia.org/wiki/ARM_architecture