分享

深入浅出谈ARM® Cortex®

 昵称55828825 2023-06-27 发布于北京

内容提要

引言

1. 为什么要在CPU内核架构中引入缓存?

2. 缓存的作用

3. ARM Cortex-M4 / Cortex-M7 CPU架构内存系统

4. 缓存相关基础概念详解

总结

引言

多年来,大多数基于精简指令集(RSIC) CPU(比如8051内核、PIC内核以及ARM Cortex M0/M0+和M4内核)的嵌入式MCU通常都未配备高速缓存。随着 ARMv7 架构的推出,缓存在 ARMv7-A 系列(例如 Cortex-A8 等)中得到支持,但在 ARMv7-M 微控制器(例如 Cortex-M3 和 Cortex-M4)的核心设计中不支持。然而,当 Cortex-M7 发布时,它打破了这种模式,为更小的嵌入式微控制器提供缓存支持。

这个系列将分为三个部分进行介绍:

一、缓存的基本原理

二、缓存替换策略

三、如何优化应用软件以更好利用缓存

1. 为什么要在CPU内核架构中引入缓存?

随着半导体工艺的进步,摩尔定理带来了更高集成度的同时,也允许CPU内核运行更高的主频,但是以Flash和SRAM为主的传统存储器(也称作主存-main memory)却受工作结构/原理的限制,工作频率/读写访问速度不能匹配高速内核运行时对指令和数据的访问速度,从而出现控制器芯片性能瓶颈。

缓存的目的是提高高速CPU内核对内存访问的平均速度和效率。最直接和最明显的好处之一就是能够显著提高应用程序性能,这反过来又可以带来增强的功耗模型。高速缓存已在基于处理器的高端系统中使用多年(可追溯到上世纪60 年代)。

缓存开发和使用背后的驱动是程序的局部性(locality)原则。

缓存根据两个局部性原则运行:

  • 空间局部性(Spatial locality):应用程序/代码编译结果顺序存储,访问一个内存位置之后很可能会访问相邻的位置。

  • 时间局部性(Temporal locality):应用程序/代码执行时,很可能在短时间内重复访问内存区域。

另外值得注意的是顺序性——鉴于已经对特定位置s进行了引用,很可能在接下来的几个引用中,将引用s + 1的位置。顺序性是空间局部性的一种受限类型,可以看作是它的一个子集。

在高端现代芯片系统中,可以有多种形式的缓存,比如x86架构PC上常见的网络缓存和磁盘缓存,但本文将重点关注以ARM Cortex-M7为代表的嵌入式微控制器(MCU)的主存(Flash和SRAM)缓存。

此外,主存缓存也可以是分层的,即处理器和主存之间有多个缓存,通常也称为 L1、L2、L3 等,其中 L1 离处理器内核最近。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

2. 缓存的作用

将高速缓存理解为缓存的最简单方法是放置在中央处理器单元 (CPU) 和主存储器之间的小型高速缓冲区,用于存储最近引用到主存储器的块。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

一旦我们使用缓存,每次内存读取都会导致以下两种结果之一:

  • 缓存命中(cache hit)——地址的内存已经在缓存中。

  • 缓存未命中(cache miss)——内存访问不在缓存中,因此我们必须到主内存去访问它。

核心处理器架构通常会提供支持的缓存实现。在最简单的形式中,有两种主要的CPU处理器架构:哈佛(Harvard)和冯诺依曼(Von Neumann)架构。冯诺依曼架构只有一个总线用于数据传输和指令取指,因此不同的取指必须交错,因为它们不能同时执行。哈佛架构具有独立的指令和数据总线,允许在两个总线上同时执行传输。

冯诺依曼架构通常有一个统一的缓存,既存储指令又存储数据。由于哈佛架构具有单独的指令和数据总线,因此逻辑上它们通常具有单独的指令和数据缓存。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

Cortex-M7 是哈佛架构的变体,称为改良哈佛(Modified Harvard)。和哈佛一样,它提供独立的指令和数据总线,但这些总线访问统一的内存空间;允许像访问数据空间一样访问指令存储器的内容。这意味着修改后的哈佛可以同时支持统一和哈佛(单独)缓存。

另外值得注意的是,ARMv7-M 系列内核都基于加载/存储架构。重要的是,这意味着唯一允许的数据存储器访问是通过加载和存储操作 (LDR/STR),并且所有算法数据操作都使用通用寄存器 (r0-r12) 执行。

3. ARM Cortex-M4 / Cortex-M7 CPU架构内存系统

与其他 ARM 系列不同,ARMv7-M 架构将内存映射预先划分为 8 x 512MB 的部分,然后分配给代码/Flash、RAM、外设和系统空间。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

Cortex-M4 和 Cortex-M7 共享相同的系统内存映射,但具有完全不同的内存系统。在 Cortex-M4 上,用户会看到位于地址 0x00000000 的片上 Flash 和位于地址 0x20000000 的片上 SRAM。但是,对于 Cortex-M7,指令和数据地址区域有两个不同之处。

首先,Cortex-M7内核配备了本地(L1)指令缓存(I-Cache)和数据缓存(D-Cache)。

其次,Cortex-M7内存系统还支持连接本地紧耦合内存(TCM),用于存储指令和数据,分别称为ITCM和DTCM。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

4. 缓存相关基础概念详解

如前所述,缓存是主内存和中央处理单元之间的本地高速缓冲区。在 ARM Thumb-2 ISA(指令集架构)中,加载和存储操作可以将字节、半字(2 个字节)或字(4 个字节)甚至双字(8字节,Cortex-M7支持)传输到内存和从内存中传出。但是由于空间局部性,缓存控制器不会仅仅缓冲对某个位置的单个读取,而是会拉入当前访问的内存周围的许多字。从主存到缓存的单次传输中的字数称为缓存行长度(cache line length),读入缓存的过程称为行填充(linefill)。

行长度因设计而异,但在 Cortex-M7 上固定为8 个字/word(即32 字节/byte)。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

出于内存访问的原因,现在每个高速缓存行都以 32 字节的边界地址为界。因此,从地址 0x0000000c 读取的内存与地址 0x00000018 位于同一缓存行中。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

这意味着,对于一个 8 字(word,1 word = 4 bytes)高速缓存行,如果我们屏蔽低5位,那么同一高速缓存行中的所有地址将评估为相同的结果。将此结果右移五位,将获得每个地址的唯一索引(例如 ((address & ~0x1f)>>5) )。

在剩下的底部 5 位中,位 4-2 索引高速缓存行中的字,位 1-0则提供字内的一个字节(当需要字节和半字访问时)。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

因此,从地址0x0000004c读取的字偏移量与0x0000000c相同,但会驻留在不同的高速缓存行索引中,地址0x00000078和0x00000018也是如此。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

当然,这种模型只有在我们的缓存大小与闪存/SRAM 大小相同的情况下才有效,这会破坏对象(并且不具有成本效益)。因此,缓存大小将明显小于可用的 Flash/SRAM;因此需要修改索引模型。

Cortex-M7 上的缓存是可选的,大小可以是 4KB、8KB、16KB、32KB 或 64KB。请注意,指令和数据缓存的大小可能不同。

假设我们有最小的可用缓存大小(4KB),那么我们可以计算独立缓存行的数量。对于一个32字节的高速缓存行(cache line),这给我们留下了一组128个唯一的高速缓存行,从而为我们提供了索引 [0-127]的7位,每个缓存行(cache line)都有自己唯一的索引。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

为了计算地址的索引,只需要简单地屏蔽位 11-5并右移5个位置((address & 0xfe0)>>5)。但是,这意味着,在一个典型的 Flash 地址范围内,有多个地址将被映射到同一个索引,例如:

(0x0000004c&0xFe0)>>5= index2, word3

(0x0000204c&0xFe0)>>5= index2, word3

因此,如果我们读取了地址0x0000004c,那么缓存控制器将使用字节0x00000040-0x0000005F填充缓存行 2。除了存储的内存值之外,缓存控制器还存储地址标签和行。标签是地址的剩余部分(即(address & ~0xfe0) >> 12)。

新知达人, 深入浅出谈ARM® Cortex®-M7缓存(一):缓存的基本原理

所以对于以上两个地址,我们现在得到:

0x0000004c:index2, word3, tag0

0x0000204c : index 2, word 3, tag 2

如果我们随后从不同的地址0x0000204c读取,这将匹配相同的缓存索引(index)。但是高速缓存控制器也会将高速缓存行地址标签(tag)与实际地址标签进行比较,这当然不匹配,从而确保高速缓存控制器不会将内存从高速缓存返回给处理器。当标签不匹配时,这被称为缓存未命中(cache miss),在这种情况下,缓存控制器就需要一个行动计划——也称为策略(policy)。

总结

以上就是《深入浅出谈ARM® Cortex®-M7缓存》的第一部分内容,希望大家能够掌握现代高速CPU内核配备高速cache的原因以及相关的基础概念,以便进一步学习和理解后续对于第二部分(缓存替换策略)和第三部分(如何优化应用软件以更好利用缓存)的内容。

参考文章(点击文章链接即可直接跳转阅读):

1.Introduction to the ARM® Cortex®-M7 Cache – Part 1 Cache Basics,By Niall Cooling

2.Introduction to the ARM® Cortex®-M7 Cache – Part 2 Cache Replacement Policy,By Niall Cooling

3.Introduction to the ARM® Cortex®-M7 Cache – Part 3 Optimising software to use cache,By Niall Cooling

4.ARM® Cortex® -M7: Bringing High Performance to the Cortex-M Processor Series,By Ian Johnson Senior Product Manager, ARM.

5.《浅谈嵌入式MCU CPU内核之ARM Cortex-M7内核高性能(Dual Issue ISA--双发指令)实现要点解析》,Enwei Hu,“汽车电子expert成长之路”微信公众号

Enwei Hu(胡恩伟)

2022年8月31日于山城重庆

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多