Cortex-A7 MPCore 架构

张开发
2026/4/14 8:32:58 15 分钟阅读

分享文章

Cortex-A7 MPCore 架构
鉴于学习的硬件使用的是Cortex-A7架构本章学习该架构的相关知识。了解了 Cortex-A7 架构以后有利于我们后面的学习因为后面有很多例程涉及到 Cortex-A7 架构方面的知识比如处理器模型、 Cortex-A7 寄存器组等等。Cortex-A7 MPCore 简介Cortex-A7 MPcore 处理器支持 1~4 核通常是和 Cortex-A15 组成 big.LITTLE 架构的 Cortex-A15 作为大核负责高性能运算比如玩游戏啥的 Cortex-A7 负责普通应用因为 Cortex-A7 省电。 Cortex-A7 本身性能也不弱不要看它叫做 Cortex-A7 但是它可是比 Cortex-A8 性能要强大而且更省电。 ARM 官网对于 Cortex-A7 的说明如下“在 28nm 工艺下 Cortex-A7 可以运行在 1.2~1.6GHz并且单核面积不大于 0.45mm2(含有浮点单元、 NEON 和 32KB 的 L1 缓存)在典型场景下功耗小于 100mW 这使得它非常适合对功耗要求严格的移动设备这意味着 Cortex-A7 在获得与 Cortex-A9 相似性能的情况下其功耗更低”。Cortex-A7 MPCore 支持在一个处理器上选配 1~4 个内核 Cortex-A7 MPCore 多核配置如图所示Cortex-A7 MPCore 的 L1 可选择 8KB、 16KB、 32KB、 64KB L2 Cache 可以不配也可以选择 128KB、 256KB、 512KB、 1024KB。 I.MX6UL 配置了 32KB 的 L1 指令 Cache 和 32KB的 L1 数据 Cache以及 128KB 的 L2 Cache。 Cortex-A7MPCore 使用 ARMv7-A 架构主要特性如下①、 SIMDv2 扩展整形和浮点向量操作。②、提供了与 ARM VFPv4 体系结构兼容的高性能的单双精度浮点指令支持全功能的 IEEE754。③、支持大物理扩展(LPAE)最高可以访问 40 位存储地址也就是最高可以支持 1TB 的内存。④、支持硬件虚拟化。⑥、支持 Generic Interrupt Controller(GIC)V2.0。⑦、支持 NEON可以加速多媒体和信号处理算法。Cortex-A 处理器运行模型以前的 ARM 处理器有 7 中运行模型 User、 FIQ、 IRQ、 Supervisor(SVC)、 Abort、 Undef和 System其中 User 是非特权模式其余 6 中都是特权模式。但新的 Cortex-A 架构加入了 TrustZone 安全扩展所以就新加了一种运行模式 Monitor新的处理器架构还支持虚拟化扩展因此又加入了另一个运行模式 Hyp所以 Cortex-A7 处理器有 9 种处理模式如表所示除了 User(USR)用户模式以外其它 8 种运行模式都是特权模式这几个运行模式可以通过软件进行任意切换也可以通过中断或者异常来进行切换。大多数的程序都运行在用户模式用户模式下是不能访问系统所有资源的有些资源是受限的要想访问这些受限的资源就必须进行模式切换。但是用户模式是不能直接进行切换的用户模式下需要借助异常来完成模式切换当要切换模式的时候应用程序可以产生异常在异常的处理过程中完成处理器模式切换。当中断或者异常发生以后处理器就会进入到相应的异常模式种每一种模式都有一组寄存器供异常处理程序使用这样的目的是为了保证在进入异常模式以后用户模式下的寄存器不会被破坏。相比起STM32STM32 只有两种运行模式特权模式和非特权模式但是 Cortex-A 就有 9 种运行模式。Cortex-A 寄存器组本节我们要讲的是 Cortex-A 的内核寄存器组注意不是芯片的外设寄存器ARM 架构提供了 16 个 32 位的通用寄存器(R0~R15)供软件使用前 15 个(R0~R14)可以用作通用的数据存储 R15 是程序计数器 PC用来保存将要执行的指令。 ARM 还提供了一个当前程序状态寄存器 CPSR 和一个备份程序状态寄存器 SPSR SPSR 寄存器就是 CPSR 寄存器的备份。这 18 个寄存器如图所示9 种运行模式每一种运行模式都有一组与之对应的寄存器组。每一种模式可见的寄存器包括 15 个通用寄存器(R0~R14)、一两个程序状态寄存器和一个程序计数器 PC。在这些寄存器中有些是所有模式所共用的同一个物理寄存器有一些是各模式自己所独立拥有的各个模式所拥有的寄存器如下表所示图中浅色字体的是与 User 模式所共有的寄存器蓝绿色背景的是各个模式所独有的寄存器。可以看出在所有的模式中低寄存器组(R0~R7)是共享同一组物理寄存器的只是一些高寄存器组在不同的模式有自己独有的寄存器比如 FIQ 模式下 R8~R14 是独立的物理寄存器。假如某个程序在 FIQ 模式下访问 R13 寄存器那它实际访问的是寄存器 R13_fiq如果程序处于 SVC 模式下访问 R13 寄存器那它实际访问的是寄存器 R13_svc。总结一下 Cortex-A 内核寄存器组成如下①、 34 个通用寄存器包括 R15 程序计数器(PC)这些寄存器都是 32 位的。②、 8 个状态寄存器包括 CPSR 和 SPSR。③、 Hyp 模式下独有一个 ELR_Hyp 寄存器。理解1. 第一组R0 ~ R7 【全模式共用】比喻酒店大堂的公共储物柜。看图User、Sys、FIQ、IRQ…… 这几列R0 到 R7 下面的格子全部都是一样的。解释不管你当前是什么身份User/SVC/IRQ 等R0~R7 永远指向同一个物理柜子。结果如果你在 User 模式往 R0 放了个数据 100那你切到 IRQ 模式看 R0里面也是 100。大家共用容易被覆盖。2. 第二组R8 ~ R12 【大部分共用FIQ 独有】比喻普通楼层的淋浴间大家一般共用一套但 FIQ 是 VIP有独立淋浴间。看图User、Sys、IRQ、ABT、SVC、UND、MON 这些列里R8~R12 是同一套。但是FIQ 模式列下面写的是R8_fiq~R12_fiq和别人不一样。解释除了 FIQ 模式其他人用的是同一组高寄存器。FIQ 模式有自己独有的一组R8~R12。这就意味着 FIQ 快速中断来了不用花时间保存原来的数据直接用自己的新房间所以 FIQ 很快。3. 第三组R13 (SP) ~ R14 (LR) 【每个模式都独有】比喻每个模式的专属卧室 衣帽间。看图看 R13 (SP) 这一列User 是R13_usrIRQ 是SP_irqSVC 是SP_svc。每一列的后缀都不一样。R14 (LR) 也是一样IRQ 是LR_irqSVC 是LR_svc。解释R13 (栈指针 SP)每个模式都有自己的栈自己的地盘不能乱共用。比如 SVC 模式的栈不能覆盖 IRQ 的栈。R14 (链接寄存器 LR)每个模式发生异常时返回地址存在自己的 LR 里互不干扰。你图里的那句话“FIQ 访问 R13 是 R13_fiqSVC 访问 R13 是 R13_svc”。翻译你在不同身份模式下喊同一个名字 R13系统实际上会带你去不同的物理房间R13_usr / R13_fiq。4. 第四组R15 (PC) 【全模式共用】比喻酒店的总时钟 / 日历。看图所有模式列下面的 R15 都是一样的。解释程序计数器 PC全天下 CPU 只有一个大家都在看它指向哪里必须统一。5. 第五组CPSR / SPSR 【状态标志位】CPSR当前房间的总开关存当前是哪个模式、标志位。SPSR异常前的备份开关比如 IRQ 来了把原来的 CPSR 备份到 SPSR_irq 里恢复时再拿回来。通用寄存器R0~R15 就是通用寄存器通用寄存器可以分为以下三类①、 未备份寄存器即 R0~R7。②、 备份寄存器即 R8~R14。③、程序计数器 PC即 R15。未备份寄存器未备份寄存器指的是 R0~R7 这 8 个寄存器因为在所有的处理器模式下这 8 个寄存器都是同一个物理寄存器在不同的模式下这 8 个寄存器中的数据就会被破坏。所以这 8 个寄存器并没有被用作特殊用途。备份寄存器备份寄存器中的 R8~R12 这 5 个寄存器有两种物理寄存器在快速中断模式下(FIQ)它们对应着 Rx_irq(x8~12)物理寄存器其他模式下对应着 Rx(8~12)物理寄存器。 FIQ 是快速中断模式看名字就是知道这个中断模式要求快速执行 FIQ 模式下中断处理程序可以使用 R8~R12寄存器因为 FIQ 模式下的 R8~R12 是独立的因此中断处理程序可以不用执行保存和恢复中断现场的指令从而加速中断的执行过程。备份寄存器 R13 一共有 8 个物理寄存器其中一个是用户模式(User)和系统模式(Sys)共用的剩下的 7 个分别对应 7 种不同的模式。 R13 也叫做 SP用来做为栈指针。基本上每种模式都有一个自己的 R13 物理寄存器应用程序会初始化 R13使其指向该模式专用的栈地址这就是常说的初始化 SP 指针。备份寄存器 R14 一共有 7 个物理寄存器其中一个是用户模式(User)、系统模式(Sys)和超级监视模式(Hyp)所共有的剩下的 6 个分别对应 6 种不同的模式。 R14 也称为连接寄存器(LR) LR 寄存器在 ARM 中主要用作如下两种用途①、每种处理器模式使用 R14(LR)来存放当前子程序的返回地址如果使用 BL 或者 BLX来调用子函数的话 R14(LR)被设置成该子函数的返回地址在子函数中将 R14(LR)中的值赋给R15(PC)即可完成子函数返回比如在子程序中可以使用如下代码MOV PC, LR 寄存器 LR 中的值赋值给 PC实现跳转或者可以在子函数的入口出将 LR 入栈PUSH {LR} 将 LR 寄存器压栈在子函数的最后面出栈即可POP {PC}将上面压栈的 LR 寄存器数据出栈给 PC 寄存器严格意义上来讲应该是将LR-4 赋给 PC因为 3 级流水线这里只是演示代码。②、当异常发生以后该异常模式对应的 R14 寄存器被设置成该异常模式将要返回的地址R14 也可以当作普通寄存器使用。程序计数器 R15程序计数器 R15 也叫做 PC R15 保存着当前执行的指令地址值加 8 个字节这是因为 ARM 的流水线机制导致的。 ARM 处理器 3 级流水线取指-译码-执行这三级流水线循环执行比如当前正在执行第一条指令的同时也对第二条指令进行译码第三条指令也同时被取出存放在 R15(PC)中。我们喜欢以当前正在执行的指令作为参考点也就是以第一条指令为参考点那么 R15(PC)中存放的就是第三条指令换句话说就是 R15(PC)总是指向当前正在执行的指令地址再加上 2 条指令的地址。对于 32 位的 ARM 处理器每条指令是 4 个字节所以:R15 (PC)值 当前执行的程序位置 8 个字节。程序状态寄存器所有的处理器模式都共用一个 CPSR 物理寄存器因此 CPSR 可以在任何模式下被访问。CPSR 是当前程序状态寄存器该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志等一些状态位以及一些控制位。所有的处理器模式都共用一个 CPSR 必然会导致冲突为此除了 User 和 Sys 这两个模式以外其他 7 个模式每个都配备了一个专用的物理状态寄存器叫做 SPSR(备份程序状态寄存器)当特定的异常中断发生时 SPSR 寄存器用来保存当前程序状态寄存器(CPSR)的值当异常退出以后可以用 SPSR 中保存的值来恢复 CPSR。因为 User 和 Sys 这两个模式不是异常模式所以并没有配备 SPSR因此不能在 User 和 Sys 模式下访问 SPSR会导致不可预知的结果。由于 SPSR 是 CPSR 的备份因此 SPSR 和 CPSR 的寄存器结构相同如图所示CPSR寄存器N(bit31)当两个补码表示的 有符号整数运算的时候 N1 表示运算对的结果为负数 N0 表示结果为正数。Z(bit30)Z1 表示运算结果为零 Z0 表示运算结果不为零对于 CMP 指令 Z1 表示进行比较的两个数大小相等。C(bit29)在加法指令中当结果产生了进位则 C1表示无符号数运算发生上溢其它情况下 C0。在减法指令中当运算中发生借位则 C0表示无符号数运算发生下溢其它情况下 C1。对于包含移位操作的非加/减法运算指令 C 中包含最后一次溢出的位的数值对于其它非加/减运算指令 C 位的值通常不受影响。V(bit28)对于加/减法运算指令当操作数和运算结果表示为二进制的补码表示的带符号数时 V1 表示符号位溢出通常其他位不影响 V 位。Q(bit27)仅 ARM v5TE_J 架构支持表示饱和状态 Q1 表示累积饱和 Q0 表示累积不饱和。IT[1:0](bit26:25)和 IT[7:2](bit15:bit10)一起组成 IT[7:0]作为 IF-THEN 指令执行状态。J(bit24)仅 ARM_v5TE-J 架构支持 J1 表示处于 Jazelle 状态此位通常和 T(bit5)位一起表示当前所使用的指令集JT描述00ARM01Thumb11ThumbEE10JazelleGE[3:0](bit19:16)SIMD 指令有效大于或等于。IT[7:2](bit15:10)参考 IT[1:0]。E(bit9)大小端控制位 E1 表示大端模式 E0 表示小端模式。A(bit8)禁止异步中断位 A1 表示禁止异步中断。I(bit7)I1 禁止 IRQ I0 使能 IRQ。F(bit6)F1 禁止 FIQ F0 使能 FIQ。T(bit5)控制指令执行状态表明本指令是 ARM 指令还是 Thumb 指令通常和 J(bit24)一起表明指令类型参考 J(bit24)位。M[4:0]处理器模式控制位含义如表所示二编补充一点寄存器理解你CPU去内存大仓库取材料数据来加工但内存太远了跑一趟很慢。所以你在面前摆了 40 个工位寄存器把最常用的材料、半成品、工作计划表都放在手边这样干活就飞快。第一类通用寄存器 (R0-R12) —— 临时工位这是 13 个R0-R12可以随便用的临时工位。你可以把任何数字、地址暂时放在这里加减乘除。R0-R7普通工位任何时候都能用。R8-R12大部分时间也是普通工位。但有一种叫FIQ快速中断的紧急情况发生时CPU 会瞬间切换到另一套专属工位。这样它就不用花时间收拾你留下的烂摊子直接开工所以叫“快速”。一句话R0-R12 就是你的草稿纸随便写但小心被系统紧急任务给覆盖了。第二类专用寄存器 (R13, R14, R15) —— 特殊功能工位这三个不能乱用各有专职R13 (SP, Stack Pointer栈指针)功能指向栈内存的当前位置。白话栈就像一张堆纸。SP 指着“下一张空白纸在哪”。你要临时存点东西比如去厕所前把工作进度记下来就放在 SP 指的地方然后 SP 自动移到下一个空白处。回来时从 SP 指回的地方把进度取出来。重点每种工作模式比如用户态、中断态都有自己的专属 SP互不干扰。所以切换模式时不会弄乱别人的栈。R14 (LR, Link Register链接寄存器)功能记住回家的路。白话你正在 A 点干活突然要去 B 点执行一个子任务。出发前LR 会自动记下“A 点 8 个字节”这个地址因为流水线原因不是 A 点本身。在 B 点干完活执行MOV PC, LR就能跳回 LR 记录的地址继续 A 点的活。另一个用途发生异常比如中断时LR 会记下“异常返回后应该去哪”。这就像你正走路突然被绊了一下异常你的脑子记下“站稳后继续往前走”然后去处理绊倒这件事。R15 (PC, Program Counter程序计数器)功能指向当前正在执行的指令严格说是指向 8 字节处的指令因为流水线。白话PC 就像一个指挥棒指着 CPU 当前要执行哪一行代码。CPU 执行完一行PC 自动移到下一行。你也可以强行把某个地址写进 PC比如MOV PC, LR这就会让 CPU 跳去执行那个地址的代码实现函数调用或返回。总结R13 (SP)指向“栈顶”用于临时保存数据如函数局部变量、返回地址。R14 (LR)调用函数时自动保存返回地址。R15 (PC)指向当前执行的指令控制程序流程。第三类状态寄存器 (CPSR/SPSR) —— 记录器与快照这是一个32 位的状态面板每位是一个开关/标志记录着 CPU 当前的状态。CPSR (Current Program Status Register当前程序状态寄存器)功能实时反映 CPU 的运行状态。白话CPSR 就像汽车的仪表盘告诉你当前速度、油量、哪个灯亮了。它的主要位段位名称含义白话31N(Negative)上一步运算结果是负数吗是→1否→030Z(Zero)上一步运算结果是零吗是→1否→029C(Carry)加法产生进位/减法产生借位了吗产生→1/028V(oVerflow)有符号数运算溢出结果超出范围了吗溢出→17I(IRQ)普通中断总开关1关0开6F(FIQ)快速中断总开关1关0开5T(Thumb)当前是 ARM 指令集0还是 Thumb 指令集14-0M[4:0]当前 CPU 处于哪种模式用户、系统、中断、管理...SPSR (Saved Program Status Register保存的程序状态寄存器)功能当发生异常中断、错误等时自动保存CPSR 的快照。白话就像游戏里的自动存档。当 CPU 被紧急事件打断时它会把当前的 CPSR仪表盘状态存到 SPSR 里然后去处理紧急事件。处理完后再从 SPSR 恢复 CPSR就像读档一样CPU 就能回到打断前的状态继续运行。注意只有User和System模式没有 SPSR因为它们不是异常模式。一句话总结CPSR当前 CPU 状态仪表盘。SPSR异常发生时的 CPSR 备份用于恢复现场。整体串联一个函数调用的故事假设 CPU 正在执行main()R15 (PC)指着main()里的某条指令。R13 (SP)指着当前栈顶存放着main()的局部变量。CPSR的 I 和 F 位可能为 0开中断M 位是 0b10000用户模式。现在执行bl add_function调用加法函数CPU 自动把返回地址当前 PC 4 或 8存入R14 (LR)。把CPSR备份到SPSR如果切换模式。修改PC为add_function的地址跳转过去。可能切换模式如从 User 切到 SupervisorR13 (SP)自动切换到该模式的专属栈。在add_function里可以用PUSH {LR}把 R14 压入栈防止嵌套调用时丢失返回地址。计算结果放在 R0 里ARM 约定 R0 作为返回值。执行POP {PC}从栈中弹出之前保存的 LR 值到PC实现返回。如果切换了模式硬件会从SPSR恢复CPSR。CPU 回到main()继续执行所有状态恢复如初。你需要记住的核心R0-R12草稿纸随便用但要小心 FIQ 模式下的 R8-R12。R13 (SP)栈指针每种模式有自己的栈。R14 (LR)保存返回地址。R15 (PC)当前执行的指令地址。CPSRCPU 状态仪表盘标志位 模式 中断开关。SPSR异常时的 CPSR 自动备份用于恢复。对于写 ARM 汇编比如 led.s主要会用 R0-R12 来操作数据用 R14 (LR) 返回用 R15 (PC) 跳转。CPSR 的 N、Z、C、V 标志位会在你执行条件跳转如beq跳转到 label时自动被判断。文章部分内容参考正点原子教程

更多文章