ARM 嵌入式开发 ---知识点

一、计算机 CPU 分类

计算机 CPU 主要分为两大类:复杂指令集(CISC)和精简指令集(RISC)。

1. CISC(Complex Instruction Set Computer)------复杂指令集

代表架构:x86(如 Intel、AMD 处理器)。

特点:指令功能多、芯片复杂、成本高、体积大、功耗大。

2. RISC(Reduced Instruction Set Computer)------精简指令集

代表架构:8051、MIPS、ARM 等。

特点:指令功能少、芯片简单、成本低、体积小、功耗低。

ARM 公司设计 RISC 精简指令集架构 CPU(分版本),授权给半导体公司生产。例如:STM32F103 由意法半导体(ST)生产,CPU 由 ARM 公司设计。

二、ARM 内核版本

1. ARM 经典内核

ARM7、ARM9、ARM11 等。

2. Cortex 系列

  • Cortex-A(Application):应用领域

Cortex-A5(摩托罗拉智能机)、Cortex-A7(IMX6ULL、STM32MP157)、Cortex-A8(Samsung Galaxy Note)、Cortex-A9(Samsung Exynos 4412)、Cortex-A725(玄戒 o1)等

  • Cortex-R(Real-Time):实时性领域,如汽车电子。
  • Cortex-M(MCU):单片机控制领域

如 Cortex-M3(STM32F103)、Cortex-M4(STM32F407、STM32MP157)

以 Cortex-A7 为例,它是 32 位处理器。对于ARM裸机开发,需要用汇编语言进行编写。

三、ARM 寄存器

1. 通用寄存器

内核共有 16 个通用寄存器(R0~R12、SP、LR、PC),用于存放数据。

  • PC(R15):Program Counter 程序计数器,本质是一个指针,指向当前程序正在执行指令的下一条指令。
  • LR(R14):Link Register 链接寄存器,保存函数的返回地址。
  • SP(R13):Stack Pointer 栈指针寄存器,管理栈区空间。

2. 状态寄存器

  • CPSR:Current Program Status Register 当前程序状态寄存器,记录程序运行到某一步时的相关状态(溢出、借位、进位等)。
  • SPSR:Save Program Status Register 保存/备份程序状态寄存器,保存异常发生时 CPSR 寄存器中的值。

四、CPU 核心部件

1. ALU

ALU(Arithmetic Logic Unit)算术逻辑单元,完成算术运算。

2. MMU

MMU(Memory Management Unit)内存管理单元,将程序中的虚拟地址转换为物理地址。裸机开发时关闭 MMU,Linux 驱动开发时打开 MMU。

3. CACHE

CACHE 高速缓存,CPU 直接从 CACHE 中访问数据,提高 CPU 访问数据的效率。

  • D-CACHE:Data Cache 数据缓存(关闭 d cache)。
  • I-CACHE:Instruction Cache 指令缓存(打开 i cache)。

五、ARM 体系架构

1. 总线结构

  • 单总线:内核和外设之间通过一组线连接通信。
  • 双总线(多总线):速度快的外设通过 AHB 总线(Advanced High Bus 先进高速总线,如 USB、网卡、RAM)连接内核;速度慢的外设通过 APB 总线(Advanced Peripheral Bus 先进外设总线,如 GPIO、UART、TIMER)连接内核。

2. 冯·诺依曼架构与哈佛架构

  • 冯·诺依曼架构:数据和指令共享同一块存储空间。
  • 哈佛架构:数据和指令拥有独立的存储空间(计算机)。

3. 交叉编译

交叉编译:在一个平台编写编译程序,在另一个平台运行程序。例如在 Ubuntu 上编写代码,使用 arm-none-linux-gcc 编译,生成 ARM 平台可运行的程序。

六、ARM处理器工作模式

经典 ARMv4/v5 架构,Cortex‑A 额外有 Monitor 安全模式;仅 User 是非特权,其余都是特权模式

模式 触发场景 核心要点
User(usr) 普通应用任务 唯一非特权,不能直接操作硬件
FIQ(fiq) 高优先级快速中断 独立寄存器最多,响应最快,优先级高于 IRQ
IRQ(irq) 普通外设中断 串口、定时器等常规中断
Supervisor(svc) 上电复位 / 软中断 SWI OS 内核入口,复位默认进入该模式
Abort(abt) 内存存取异常 处理内存访问错误
Undef(und) 遇到无法解码的指令 仿真不支持的指令
System(sys) 软件手动切换 特权模式,寄存器组和 User 完全相同
  1. 模式切换:异常自动切换;特权代码修改 CPSR 的 M 位可手动切换

  2. Banked(备份)寄存器:不同模式拥有独立 R8~R14,减少中断现场保存开销,FIQ 的备份寄存器最多

  3. 异常优先级:复位 > 未定义指令 > 软中断 > 预取中止 > 数据中止 > FIQ > IRQ

  4. Monitor 模式(Cortex‑A 特有):TrustZone 安全扩展,用于安全世界与普通世界切换,特权模式

七、ARM异常处理

(1)异常发生时,CPU 硬件自动完成 4 件事

  • CPSR → SPSR_<mode>:把当前程序状态寄存器,保存到当前异常模式对应的备份状态寄存器,用来恢复现场。
  • 更新 CPSR

切换到 ARM 指令状态

切换 CPU 进入对应的异常模式

置位中断屏蔽位,关闭对应中断

  • 保存返回地址到 LR_<mode>:异常模式下的链接寄存器,记录异常处理完要回到哪里。
  • PC = 异常向量表对应偏移地址:跳转到向量表,执行异常服务程序。

(2)异常返回时(软件代码做)

SPSR_<mode> 恢复回 CPSR

LR_<mode> 恢复回 PC

异常向量表,本质是存放各个异常入口的固定地址表。当 CPU 检测到异常发生,硬件会自动跳转到向量表里对应的偏移地址,去执行异常处理代码。

向量表一共 8 个位置,地址偏移从 0x00 开始,每次加 4 字节:

  1. 0x00 Reset 复位:上电或者系统复位时触发,是所有异常里优先级最高的。复位后 CPU 进入 SVC 管理模式。
  2. 0x04 Undefined Instruction 未定义指令:CPU 读到无法识别、不能解码的指令时触发,进入 Undef 模式。常用来软件仿真硬件不支持的指令。
  3. 0x08 Software Interrupt 软中断:由软件指令主动触发,用户程序用来发起系统调用,切换到 SVC 内核模式。
  4. 0x0C Prefetch Abort 预取中止:CPU 去内存读取指令的时候,内存访问失败,触发预取异常,进入 Abort 模式。
  5. 0x10 Data Abort 数据中止:CPU 读写数据内存时访问出错,触发数据异常,进入 Abort 模式。
  6. 0x14 Reserved 保留位:没有对应的异常,属于预留位置。
  7. 0x18 IRQ 普通中断:大部分外设产生的常规中断,进入 IRQ 模式,优先级低于 FIQ。
  8. 0x1C FIQ 快速中断:高速紧急事件的中断,进入 FIQ 模式,优先级高于 IRQ。

八、知识点补充

1. 三级流水线结构

CPU 执行指令采用三级流水线结构:

PC 取指令 → 译码器翻译指令 → CPU 执行指令。

2. 函数调用与栈

(1)栈的特点

栈遵循先进后出(后进先出)的原则。

(2)入栈与出栈

入栈时:SP--,将数据存入到 SP 指向的新位置;出栈时:从 SP 指向的位置取出数据,SP++。

(3)函数调用过程

以 main 调用 add、add 调用 fn 为例:

  • SP 指向 0x1000000C,将 main 函数返回地址入栈;PC 跳转到 0x20000000 执行 add 函数。
  • SP 指向 0x20000008,将 add 函数返回地址入栈;PC 跳转到 0x30000000 执行 fn 函数。
  • LR 保存 add 函数返回地址(0x20000008),PC=LR 跳回 add 函数。
  • LR 保存 main 函数返回地址(0x1000000C),PC=LR 跳回 main 函数。

3. 存储体系

(1)RAM 与 ROM

RAM 是易失性存储器,ROM 是非易失性存储器。

(2)SRAM

SRAM 静态随机存储器,如 S3C2440 软件仿真 4KB RAM、IMX6ULL 内部 128KB RAM。

(3)EEPROM

EEPROM 电可擦除可编程只读存储器,如 AT24C02,容量 2048bit(256 字节)。

(4)NOR Flash 与 NAND Flash
  • NOR Flash:任何一个字节都可以被寻址,带有地址总线和数据总线。
  • NAND Flash:块设备数据,以 512 字节为一块进行读写。
(5)EMMC

EMMC 嵌入式多媒体存储卡,如 8GB 容量。

4. 程序的汇编与链接

(1)预处理

处理头文件、宏、条件编译,删除注释,展开宏,生成预处理后的 C 文本文件

gcc -E main.c -o main.i

(2)编译

把预处理后的.i文件,翻译成汇编代码(.s,汇编语言文本),做语法检查、优化

gcc -S main.i -o main.s

(3)汇编

将汇编.s文件翻译成机器码目标文件(.o,二进制目标文件,不可直接运行,缺少符号地址)

gcc -c main.s -o main.o

(4)链接

把多个.o目标文件 + 系统库(libc)合并,解析符号、重定位地址,生成可执行程序a.out

gcc main.o -o a.out

5. 内存大小端存储

  • 内存大端:高地址存放低数据位,低地址存放高数据位。
  • 内存小端:高地址存放高数据位,低地址存放低数据位。

ARM 处理器默认采用小端存储。

6. 中断向量表与异常向量表

  • 中断向量表:本质是一个数组,数组中存放的是中断服务函数的入口地址。
  • 异常向量表:本质是一个数组,数组中存放的是跳转到异常服务函数的指令。

7. 移位运算

(1)逻辑右移(LSR)

最高位补 0,不考虑数值的符号位(无符号数)。

例如:1011 0010 逻辑右移 1 位得到 0101 1001。

(2)算术右移(ASR)

最高位补符号位,考虑数值的符号位(有符号数)。

例如:1011 0010 算术右移 1 位得到 1101 1001。

(3)循环右移(ROR)

循环将每次移出的最低位补到最高位。

例如:1011 0010 循环右移 1 位得到 0101 1001,再循环右移 1 位得到 1010 1100。

8. 常见芯片内核对应关系

芯片 内核版本 汇编指令集版本
IMX6ULL Cortex-A7 ARMv7
S3C2440 ARM920T ARMv4
Exynos 4412 Cortex-A8 ARMv8
相关推荐
ElfBoard1 小时前
作品展示|基于RK3588的复杂空间下自主导航无人机与多传感器 AI 融合环境监测分析
大数据·人工智能·单片机·嵌入式硬件·团队开发
宣宣猪的小花园.1 小时前
【机器学习】神经网络与表征:为什么深度学习能自动提取特征
人工智能·嵌入式硬件·算法·机器学习
单片机仿真设计2 小时前
【proteus仿真】基于 STM32 单片机农业灾害监测系统(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus
Rocker-Chen2 小时前
应广科技MCU使用注意事项
单片机·嵌入式硬件
HRTOS3 小时前
HRTOS Debug 正式发布:为 8051 实时系统提供可观测、可诊断的运行状态监控能力
单片机·嵌入式硬件·51单片机
llilian_163 小时前
PTP时钟服务器时间溢出隐患解决方案 1588时钟服务器 ptp服务器
大数据·网络·单片机·嵌入式硬件·51单片机
AAA代码批发商3 小时前
DAY43 ARM 体系结构学习笔记|嵌入式入门,从硬件组件到流水线、内存与栈帧
arm开发·笔记·学习
小雪崩4 小时前
嵌入式学习 day49:ARM基础
嵌入式硬件·学习
田径他爸来了4 小时前
嵌入式学习第38天——裸机imx6ull(uart接口;配置波特率为115200,8位数据位,无校验,一位停止位)
嵌入式硬件·学习