ARM的介绍
- ARM架构与开发环境概述
- [一. ARM的介绍](#一. ARM的介绍)
- [二. 什么是裸机编程](#二. 什么是裸机编程)
- [三. ARM内核的发展](#三. ARM内核的发展)
- [四. Cortex-A 核裸机开发环境和 Cortex-M 开发环境的差异](#四. Cortex-A 核裸机开发环境和 Cortex-M 开发环境的差异)
- [五. ARM Cortex-A7内核结构](#五. ARM Cortex-A7内核结构)
-
- [5.1. Cortex-A7内核工作模式](#5.1. Cortex-A7内核工作模式)
- [5.2. Cortex-A7处理器寄存器组织](#5.2. Cortex-A7处理器寄存器组织)
- [六. ARM Cortex-A7内核处理器存储系统与流水线的分析](#六. ARM Cortex-A7内核处理器存储系统与流水线的分析)
-
- [6.1. 存储系统概述](#6.1. 存储系统概述)
- [6.2. 存储管理单元 MMU](#6.2. 存储管理单元 MMU)
- [6.3. 流水线的概念与原理](#6.3. 流水线的概念与原理)
- [6.4. 流水线分类](#6.4. 流水线分类)
- [七. ARM 微处理器指令系统](#七. ARM 微处理器指令系统)
-
- [7.1. ARM处理器寻址方式](#7.1. ARM处理器寻址方式)
- [7.2. ARM处理器指令集](#7.2. ARM处理器指令集)
- [八. Cortex-A7开发环境搭建](#八. Cortex-A7开发环境搭建)
ARM架构与开发环境概述
ARM架构包含三大系列:Cortex-M(微控制器)、Cortex-A(应用处理器)和Cortex-R(实时处理器)。Cortex-M面向低功耗嵌入式设备,Cortex-A支持复杂操作系统,Cortex-R用于硬实时控制。ARM寄存器组织包含43个32位寄存器,工作模式决定可访问的寄存器组。存储系统采用多级架构,包含MMU实现虚拟内存管理。处理器采用流水线技术,三级和五级流水线通过并行执行提高效率,但访存指令和互锁会影响性能。Cortex-A7裸机开发环境与Cortex-M不同,需特殊仿真器和工具链支持。
ARM寄存器组织结构:

开发板连接方式:

一. ARM的介绍
ARM⼀般有两个含义:
第⼀:就是ARM公司,ARM公司不⽣产CPU,只进⾏CPU的机架设计
第⼆:ARM架构,ARM架构就是我们通常所说的Cortex-M,Cortex-A,Cortex-R
Cortex-M系列(微控制器)
定位:面向低功耗、低成本嵌入式系统,如物联网设备、传感器、智能家居等
特点:
无内存管理单元(MMU),不支持复杂操作系统(通常运行FreeRTOS或裸机程序)
低功耗设计,深度睡眠模式下功耗可低于1μA。
实时性强,中断响应快(如STM32系列的中断向量表固化在启动文件中)
典型芯片:M0、M3、M4、M7
Cortex-A系列(应用处理器)
定位:高性能通用计算,如智能手机、平板电脑、服务器等
特点:
支持复杂操作系统(Linux/Android)和多核配置,集成MMU
64位架构(如`A53/A57`),支持虚拟化、NEON SIMD加速
高功耗,需搭配散热设计。
典型芯片:A53、A72、A76、X925(超高性能定制)
Cortex-R系列(实时处理器)
定位:硬实时场景,如汽车电子(ABS/引擎控制)、工业PLC、存储控制器
特点:
中断延迟<1μs,支持锁步核(Lockstep)冗余设计,满足功能安全标准(ISO 26262 ASIL-D)• 11。
内存保护单元(MPU)防止任务干扰
高可靠性,支持ECC内存纠错。
典型芯片:R4、R52、R82
二. 什么是裸机编程
裸机编程⼀般是指在操作系统没有运⾏之前的⼀段代码,可以是汇编语⾔实现,也可以是C语⾔实现,
bootloader是⼀个裸机程序,在ubunu上运⾏的程序不是裸机程序,因为ubuntu是⼀个操作系统,
在ubuntu上运⾏的程序是依赖于系统才能运⾏的。
三. ARM内核的发展

ARM产品在指令集架构有ARMV4、ARMV7和ARMV8;在ARMV7之前所对应的CPU核⼼名称是ARM7、ARM9、ARM11这种命名⽅式,
在ARMV7的时候,对CPU核⼼名称进⾏了调整,改⽤Cortex-A、Cortex-M和Cortex-R来进⾏命令,A系列主要⽤于运⾏操作系统,
性能较好,M系列相较于A系列性能没有A系列⾼,通常⽤于单⽚机开发,R系列主要⽤于实时控制⽅⾯,ARMV8架构⽀持了64bit的指令集。
指令集通常是指ARMV7指令ARMV8指令等这些指令集架构,这部分定义了整体的架构,例如定义了ARM的⼯作模式,中断的处理⽅法。
CPU核⼼是指令集的具体实现,例如CoreX-A7就是根据ARMV7指令集来实现的CPU核⼼。
⽽ STM32MP157 则是意法半导体公司根据Corex-A7的CPU核⼼设计出来的款SoC,SoC就是⼀个芯片内部除了
有CPU之外,还集成了很多的控制器单元,例如LCD控制器单元和UART控制器单元等等。
四. Cortex-A 核裸机开发环境和 Cortex-M 开发环境的差异
Cortex-M内核的芯片的裸机开发,一般都有比较好的集成开发环境和仿真器,比如常见的通用集成开发环境有:
Kei1、IAR,以及一些半导体厂商特有的STM32CubeIDE(ST)、MCUXpressOIDE(NXP)等。
仿真器有通用的 Ulink、Jink,以及一些半导体厂商特有的STlink(ST)、L.PClink(NXP)等。
Cortex-A 内核的芯片的裸机开发,对仿真器和开发环境的要求都很高,根据 ARM 应用处理的发展,给大家总结下
几个主流 Cortex-A 内核,和对应的几个主流教学芯片平台的裸机开发环境。

五. ARM Cortex-A7内核结构
5.1. Cortex-A7内核工作模式
Cortex-A7 基于ARMv7-A架构,共有9种工作模式,如下图:

5.2. Cortex-A7处理器寄存器组织
Cortex-A7 处理器共有9种不同的处理器模式,在每一种处理器模式中都有一组相应的器存器组,如下图所示,列出了 Cortex-A7 处理器的寄存器组织和模式关系概要。

1、在寄存器组织的图中,每个小方块是一个寄存器,每个寄存器都是 32位的。
2、寄存器没有地址,访问寄存器通过编号进行访问,
r0-r15,cpsr,spsr。3、
banked(灰色方框)类型的寄存器属于私有的寄存器,而非 banked 类型的寄存器属于公有的寄存器4、
user模式和system模式最多可以访问 17 个寄存器, HYP 模式最多可以访问 19 个寄存器,其他的模式可以访问18个寄存器。5、寄存器组织中只有43个寄存器,共计172字节,因此在开发中尽量不要定义register类型的变量,原因就是寄存器个数有限,寄存器类型的变量不可以进行取地址的操作,原因是寄存器没有地址。
6、当前处理器的模式决定着哪组寄存器可操作,任何模式都可以存取下列寄存器。
- 相应的
R0~R12、相应的R13(Stack Pointer,SP,栈指向)和R14(the Link Register,LR,链路寄存器)。- 相应的
R15(PC)、相应的CPSR。特权模式(除 System模式外)还可以存取相应的SPSR。只有HYP 模式可以存取ELR hyp。7、通用寄存器根据其分组与否可分为以下两类:
- 未分组寄存器(
Unbanked Register),包括R0~-R7。对应下图的Low Registers。- 分组寄存器(
Banked Register),包括R8~R12。对应下图的High Register。

六. ARM Cortex-A7内核处理器存储系统与流水线的分析
6.1. 存储系统概述
ARM的存储器系统是有多级构成的,可以分为:内核级、芯片级、板卡级、外设级,如下图所示:

6.2. 存储管理单元 MMU
在创建多任务嵌入式系统时,最好用一个简单的方式来编写、装载及运行各自独立的任务。目前大多数嵌入式系统不使用自己定制的控制系统,而使用操作系统来简化上述过程。较高级的操作系统基于硬件的存储管理单元(MMU)来完成上述操作。
MMU提供了一个关键服务是使各个任务作为各自独立的程序在自己的私有存储空间中运行。在带MMU的操作系统控制下,运行的任务无须知道与其他无关的任务的存储需求情况,这就简化了各个任务的设计。
MMU提供了一些资源以允许使用虚拟存储器(将系统物理存储器重新编号,可将其看成一个独立于系统物理存储器的存储空间)。MMU作为转换器,将程序和数据的虚拟地址(编译时的连接地址)转换成物理地址,虚拟地址由编译器和连接器在定位程序时分配:物理地址用来访问实际的主存硬件模块(物理上存在的区域)。

6.3. 流水线的概念与原理
处理器按照一系列步骤来执行每一条指令,典型的步骤如下:
1、从存储器读取指令(fetch)。
2、译码以识别它属于哪一条指令(decode)。
3、从指令中提取指令的操作数(这些操作数往往存在于寄存器reg中)。
4、将操作数进行组合以得到结果或存储器地址(ALU)。
5、如果需要,则访问存储器以存储数据(mem)。
6、将结果写回到寄存器堆(reg)。
例如:下面的加法指令
add r3, r2, r1#去除r2和r1的值相加,存入r3

6.4. 流水线分类
三级流水线把一条指令的执行分为了3个步骤:
取指:把存储器中的指令取到处理器中
译码:就是把处理器中存放的指令进行识别并对应出的操作
执行:把译码处理的操作进行运算得到结果并写回到寄存器中
PC指针其实是指向当前正在被解释的那条指令。由于流水线存在一条指令分为取指、译码、执行。那么我们执行的是当前PC-8当指令是简单的数据处理指令时,流水线平均每个时钟周期完成一级流水线步骤,那么执行一条完整的三级流水线处理周期完成。但是当遇到需要访问内存时由于访问内存需要额外的时钟周期去完成相应的操作,所以三级流水线在遇到访存指令时会增加一条指令执行的时间。

上例中用6个时钟周期执行了6条指令,所有的操作都在寄存器中(单周期执行),指令周期数(CPI)= 1。
在三级流水线中,如果遇到
LDR、STR命令,需要访问内存,如下图所示:

上例中用6个时钟周期执行了 4 条指令,指令周期数(CPI)= 1.5
五级流水线解决的问题:
要实现更高性能的处理器就要提高时钟频率,而提高时钟频率的要求就需要精简每级流水线的复杂度
对于三级流水线中遇到访存指令时会引起流水线暂停的现象。
五级流水线分为以下步骤:取指、译码、执行、缓存/数据、回写
五级流水线或者更高的流水线,还是遵循三级流水线的 PC 计算办法,即当前执行阶段指令=PC-8
影响流水线性能的因素
互锁:即在程序执行过程中,一条指令的结果要被用到下条指令的操作数时产生。

七. ARM 微处理器指令系统
ARM 指令集可以分为跳转指令、数据处理指令、程序状态寄存器传输指令、Load/Store指令、协处> 理器指令和异常中断产生指令。根据使用的指令类型不同,指令的寻址方式分为数据处理指令寻址
方式和内存访问指令寻址方式。
本章主要介绍 ARM 汇编语言。主要内容如下:
ARM 处理器的寻址方式。
ARM 处理器的指令集
指令的组成:
<opcode> {<c>} {s} <Rd>,<Rn>,<shifter_operand>指令解析:
<opcode>:要执行的指令
{<c>}:为指令执行的条件码。当忽略时,指令为无条件执行。
{(S)}:决定指令的操作是否影响 CPSR。在异常返回时,如果操作的目标是PC寄存器时,S 标志会同时将 SPSR 寄存器恢复到 CPSR 中。
<Rd>:为目标寄存器。
<Rn>:操作数所在的寄存器。
<shifer_operand>有 11 种形式,如表所示。


7.1. ARM处理器寻址方式
数据处理指令寻址方式:
(1) 立即数寻址方式。
(2) 寄存器寻址方式。
(3) 寄存器移位寻址方式。
LSL逻辑左移:移位后,寄存器空出的低位用0补充,高位丢弃。
LSR逻辑右移:移位后,寄存器空出的高位用0补充,地位丢弃
ASR算数右移:在移位的过程中保证符号位不变
ROR循环右移:当低位数据右移之后在高位补充
RRX带扩展右移:就是在移位过程中空出的高位由 CPSR 的C位补充
内存访问指令寻址方式:
- (1) 字及无符号字节的 Load/Store 指令的寻址方式。
- (2) 杂类 Load/Store 指令的寻址方式。
- (3) 批量 Load/Store 指令的寻址方式。
- (4) 协处理器 Load/Store 指令的寻址方式。
7.2. ARM处理器指令集
1》数据操作指令:
助 记 符 操 作 行 为
MOV 数据传送
MVN 数据取反传送
AND 逻辑与 Rd:=Rn AND op2
EOR 逻辑异或 Rd:=Rn EOR op2
SUB 减 Rd:=Rn − op2
RSB 翻转减 Rd:=op2 − Rn
ADD 加 Rd:=Rn + op2
ADC 带进位的加 Rd:=Rn + op2 + C
SBC 带进位的减 Rd:=Rn− op2 + C − 1
RSC 带进位的翻转减 Rd:=op2 − Rn + C − 1
TST 测试 Rn AND op2并更新标志位
TEQ 测试相等 Rn EOR op2并更新标志位
CMP 比较 Rn−op2并更新标志位
CMN 负数比较 Rn+op2并更新标志位
ORR 逻辑或 Rd:=Rn OR op2
BIC 位清 0 Rd:=Rn AND NOT(op2)
具体使用规则和案例参考:开发教程
2》乘法指令:
操作码 助 记 符 意 义 操 作
[23∶21]
000 MUL 乘(保留 32位结果) Rd:=(Rm×Rs)[31∶0]
001 MLA 乘---累加(保留 32位结果) Rd:=(Rm×Rs+Rn)[31∶0]
100 UMULL 无符号数长乘 RdHi:RdLo:=Rm×Rs
101 UMLAL 无符号长乘---累加 RdHi:RdLo:+=Rm×Rs
110 SMULL 有符号数长乘 RdHi:RdLo:=Rm×Rs
111 SMLAL 有符号数长乘---累加 RdHi:RdLo:+=Rm×Rs
具体使用规则和案例参考:开发教程
3》内存访问(Load/Store)指令:
Load/Store 内存访问指令在 ARM 寄存器和存储器之间传送数据。ARM 指令中有 3 种基本的数据传送
指令。
(1)单寄存器 Load/Store 指令(Single Register),这些指令在 ARM寄存器和存储器之间提供更
灵活的单数据项传送方式。数据项可以是字节、16位半字或 32位字。
(2)多寄存器 Load/Store 内存访问指令。这些指令的灵活性比单寄存器传送指令差,但可以使大
量的数据更有效地传送。它们用于进程的进入和退出、保存和恢复工作寄存器及复制存储器中的一块数
据。
(3)单寄存器交换指令(Single Register Swap)。这些指令允许寄存器和存储器中的数值进行交
换,在一条指令中有效地完成 Load/Store 操作。它们在用户级编程中很少用到。它的主要用途是在多处
理器系统中实现信号量(Semaphores)的操作,以保证不会同时访问公用的数据结构。
(4)单寄存器的 Load/Store 指令,这种指令用于把单一的数据传入或者传出一个寄存器。支持的
数据类型有字节(8位)、半字(16位)和字(32位)。
实例:
LDR R1,[R0,#0x12] ;将 R0+12 地址处的数据读出,保存到 R1 中(R0 的值不变)
LDR R1,[R0] ;将 R0 地址处的数据读出,保存到 R1 中(零偏移)
LDR R1,[R0,R2] ;将 R0+R2 地址的数据读出,保存到 R1 中(R0 的值不变)
LDR R1,[R0,R2,LSL #2] ;将 R0+R2×4 地址处的数据读出,保存到 R1 中(R0、R2 的值不变)
LDR Rd,label ;label 为程序标号,label 必须是当前指令的-4~4KB 范围内
LDR Rd,[Rn],#0x04 ;Rn 的值用做传输数据的存储地址。在数据传送后,将偏移量0x04 与 Rn 相加,
结果写回到 Rn 中。Rn 不允许是 R15
具体使用规则和案例参考:开发教程

4》 跳转指令
助 记 符 说 明 操 作
B 跳转指令 pc←label
BL 带返回的连接跳转 pc←label(lr←BL 后面的第一条指令)
BX 跳转并切换状态 pc←Rm&0xfffffffe, T←Rm&1
BLX 带返回的跳转并切换状态 pc←lable, T←1 pc←Rm&0xfffffffe, T←Rm&1 lr←BL 后面的第一条指令
例1:
B LABLE : ;跳转到LABLE处执行
ADD R1,R2,#4 ;这三条语句不执行
ADD R3,R2,#8
SUB R3,R3,R1
LABLE:
SUB R1,R2,#8
例2:
MOV R0,#10 ;给R0赋10
LOOP:
SUBS R0,#1 ;R0减1
BNE LOOP ;如果上一条语句,R0不等于1,跳转到LOOP,如果相等执行后面的语句
八. Cortex-A7开发环境搭建
参考:FS-MP1A开发教程-2020-09-22.pdf
1,调试终端 :
MobaXterm / xshell7
2,CORTEXA7 相关工具安装
3,Eclispse 与 OpenOCD
4,调试串口的使用
将这几个问题发给 AI 即有完整的流程
以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!