ARM 芯片类型
ARM 分类
ARM 分类类型(芯片 | 核 | 指令架构)
ARM 分类 :
— ARM 芯片类型 : 6410, 2440, 210;
— ARM 核类型 : arm11, arm9, CortexA9;
— 指令架构 : armv7, armv6;
ARM芯片 与 ARM核 关系
芯片 和 核关系 : 芯片包含核;
— 2440 芯片 : 包含 arm9 核;
— 6410 芯片 : 包含 arm11 核;
— 210 芯片 : 包含 CortexA8 核;
ARM核 与 指令架构 关系
ARM 核 与 指令架构 关系 :
— ARM9 : armv4 指令架构;
— ARM11 : armv6 指令架构;
— CortextA8 : armv7 指令架构;
ARM 演化变迁
经典阵营
发展历程 : ARM7 —> ARM9 —> ARM11, ARM11 性能最高, ARM7 性能最低;
Cortex 阵营
Cortext 系列 :
— Cortex-M 系列 : 没有操作系统, 面向工控领域, 与单片机差不多;
— Cortex-R 系列 : 面向实时应用, 强调实时性, 可以运行操作系统;
— Cortex-A 系列 : 主要面向多媒体应用, 目前多数的智能手机属于该系列;
性能递推 : Cortex-M0 —> Cortex-M1 —> Cortex-M3 —> Cortex-M4 —> Cortex-R4 —> Cortex-A5 —> Cortex-A8 —> Cortex-A9 ;
Cortex 与 ARM 对比
ARM 与 Cortext 对比 :
— ARM7 : ARM 7 与 Cortext-M3 类似, 都没有操作系统, 性能上 Cortex-M3 略高, 但是高的有限;
— ARM9 和 ARM11 : ARM9 和 ARM11 与 Cortex-R4 性能类似, ARM11 不如 Cortex-A5, 远远比不上 Cortex-A8 和 Cortex-A9;
芯片性能对比(处理速度 | 缓存 | 内存接口 | OS)
处理速度对比
芯片处理速度对比 : 去芯片对应的芯片手册中查找 Clock&Power Management 章节, 查看时钟相关参数;
— 6410 : 533MHz ~ 667MHz;
— 2440 : 12MHz 晶振 对应 405 ~ 532 MHz 处理速度;
— 210 : 800MHz ~ 1GHz;
缓存对比
芯片缓存对比 : 去芯片对应的芯片手册;
— 6410 : 16K 指令缓存, 16K 数据缓存;
— 2440 : 16K 指令缓存, 16K 数据缓存;
— 210 : 32KB 指令缓存, 32KB 数据缓存;
内存接口对比
芯片内存接口对比 : SDRAM 已经淘汰掉了;
— 2440 : 提供 SDRAM 内存接口;
— 6410 : 提供了 SDRAM, 也提供了 DDR 内存接口;
— 210 : 提供了 DDR1 和 DDR2 两种内存接口;
支持的操作系统
芯片支持操作系统对比 : 去芯片对应的芯片手册中查找;
— 6410 : WinCE | Linux | Android;
— 2440 : WinCE | Linux;
— 210 : WinCE | Linux | Android;
ARM 工作模式
对应手册 : ARM Architecture Reference Manual.pdf 手册, 在本博客中提供下载;
— 章节内容 : Programmers’ Model, A2.2 Page 41;
— 手册下载地址 : http://download.csdn.net/detail/han1202012/8324641
处理器工作模式
(1) ARM 工作模式图例
工作模式图示 : 图片截图自 ARM Architecture Reference Manual.pdf 手册, Page 41, A2.2 章节;
(2) ARM 工作模式介绍
工作模式介绍 :
— User 模式 (usr) : 普通应用程序运行的模式;
— FIQ 模式 (fiq) : 快速中断模式;
— IRQ 模式 (irq) : 普通中断模式;
— Supervisor 模式 (svc) : 为操作系统提供的保护模式;
— Abort 模式 (abt) : 访问虚拟内存导致异常的模式;
— Undefined 模式 (und) : 未定义指令模式;
— System 模式 (sys) : armv4 以上版本才有该模式;
Linux 系统工作模式 : 系统运行在 usr 模式, 内核运行在 svc 模式;
ARM 寄存器
对应手册 : ARM Architecture Reference Manual.pdf 手册, 在本博客中提供下载;
— 章节内容 : Programmers’ Model, A2.3 Page 42;
— 手册下载地址 : http://download.csdn.net/detail/han1202012/8324641
寄存器简介
寄存器简介 :
— 寄存器个数 : ARM 有 37 个寄存器;
— 通用寄存器 : 31 个通用寄存器, 程序计数器 也是一个通用寄存器;
— 状态寄存器 : 6 个状态寄存器;
— 图示 :
— 寄存器图示 : 截图自 Page 43;
通用寄存器
(1) 通用寄存器分类
— 不分组寄存器 : R0 ~ R7;
— 分组寄存器 : R8 ~ R14, 不同模式下使用的寄存器都不相同;
— 程序计数器 : PC 指针, 是 R15;
(2) 常用通用寄存器解析
R13 寄存器 : 通常用来做 SP 堆栈指针;
R14 寄存器 : 通常用来做 链接寄存器;
— 作用一 : 保存函数返回地址;
— 作用二 : 异常发生时, 主要用于记录函数返回地址;
R15 寄存器 : PC 指针, 程序计数器;
状态寄存器
(1) 对应各个模式的状态寄存器出现原因
状态寄存器 :
— 图示 :
— 对应各个模式的状态寄存器 : 当出现中断后, 执行中断程序, 需要将对应的 CPRS 保存到对应模式的 SPRS_xxx 寄存器中, 如当前在 scv 模式中断, 将状态寄存器保存到 SPSR_svc 寄存器中, 中断执行完后, 将状态从 SPSR_svc 中写回到 CPRS 寄存器中;
(2) CPSR 寄存器位简介
CRSR 寄存器简介 :
— 图示 :
— N 位 : 两个数a 和 b比较, 即做减法 (a-b), 如果 a < b, 减法结果是负数, N = 1; 如果 a >= b, 减法结果是正数或0, N = 0;
— Z 位 : 两个数进行比较, 只有两个数相等时 Z = 1;
— I 位 : I = 1 时不能产生中断;
— F 位 : F = 1 时不能产生快速中断;
— M 位 : 占了 5 个位 0 ~ 4, 主要用于标明处理器模式, 可以读取模式 和 设置模式, 如下图 :
ARM 寻址方式
对应手册 : ARM Architecture Reference Manual.pdf 手册, 在本博客中提供下载;
— 章节内容 : Programmers’ Model, A2.3 Page 42;
— 手册下载地址 : http://download.csdn.net/detail/han1202012/8324641
寻址方式 : 处理器根据指令给出的信息找到指令的操作数;
立即数寻址
立即数寻址简介 :
— 寻址过程 : 操作数本身就在指令中给出, 取出指令同时也可以获取操作数;
— 操作数 : 指令中取出的操作数就是立即数;
— 寻址方式 : 这种从指令中取出立即数的方式就是立即数寻址;
立即数寻址示例 :
— 示例 : ADD R0, R0, #0x3F;
— 解析 : 将 R0 + #0x3F 相加, 结果放入到 R0 中;
立即数寻址要求 : 第二个源操作数以 “#” 为后缀;
寄存器寻址
寄存器寻址简介 : 利用寄存器中的数值作为操作数;
— 示例 : ADD R0, R1, R2;
— 示例解析 : 将 R1 和 R2 寄存器中的数字相加, 结果存放到 R0 中;
寄存器间接寻址
寄存器间接寻址简介 : 寄存器中存放的操作数在内存中, 寄存器存放内存的地址;
— 示例 : LDR R0, [R2];
— 示例解析 : 寄存器 R2 中存放的是 操作数的内存地址, 从内存中取出操作数存入 R0 中;
基址变址寻址
基址变址寻址简介 :
— 基址寄存器 : 寄存器中存放一个基地址;
— 偏移量 : 指令中给出一个偏移量, 与基址寄存器放在一个中括号号中;
— 示例 : LDR R0, [R1. #4];
— 示例解析 : 从 R1 中取出地址, 然后 该地址 加上 4, 从 相加后的地址中取出数据;
- 相对寻址
相对寻址简介 : PC 指针当前值为基地址, 指令中地址标号是偏移量, 两者相加后是有效地址;
— 示例 : BL NEXT 时会跳转到 NEXT 处执行, 执行完后会返回到原程序处;
BL NEXT ;跳转到 NEXT 处执行
… …
NEXT
… …
ARM流水线。
ARM7处理器采用3级流水线来增加处理器指令流的速度,能提供0.9MIPS/MHz的指令处理速度。
PS:
MIPS(Million Instruction Per Second)表示每秒多少百万条指令。比如0.9MIPS,表示每秒九十万条指令。
MIPS/MHz表示CPU在每MHz的运行速度下可以执行多少个MIPS,如0.9MIPS/MHz则表示如果CPU运行在1MHz的频率下,每秒可执行90万条指令。
如果CPU在20MHz的频率下,每秒可运行1800万条指令。MIPS/MHz可以很好的反映CPU的速度。
3级流水线如上图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行。
⑴ 取指从存储器装载一条指令
⑵ 译码识别将要被执行的指令
⑶ 执行处理指令并将结果写会寄存器
以前学过的51单片机,因为比较简单,所以它的处理器只能完成一条指令的读取和执行后,才会执行下一条指令。这样,PC始终指向的正在“执行”的指令。
而对于ARM7来说因为是3级流水线,所以把指令的处理分为了上面所述的3个阶段。
所以处理时实际是这样的:ARM正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出。
所以,ARM7流水线只有在取第4条指令时,第1条指令才算完成执行。
下面一句话很关键:无论处理器处于何种状态,程序计数器R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或者正在“译码”的指令。
人们一般会习惯性的将正在执行的指令作为参考点,即当前第1条指令。
所以,PC总是指向第3条指令,
或者说PC总是指向当前正在执行的指令地址再加2条指令的地址。
处理器处于ARM状态时,每条指令为4个字节,所以PC值为正在执行的指令地址加8字节,即是:
PC值 = 当前程序执行位置 + 8字节
处理器处于Thumb状态时,每条指令为2字节,所以PC值为正在执行的指令地址加4字节,即是:
PC值 = 当前程序执行位置 + 4字节
下面一个例子就很好的说明了这个问题。
0x4000 ADDPC,PC,#4 ;正在被执行的指令,将地址值PC+4写入PC
0x4004 ...;正在被译码的指令
0x4008 ...;正在被取指的指令,PC=0x4008
0x400C ...;PC+4=0x400C
常见问题
- ARM指令集可以分为6类
跳转指令、数据处理指令、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理器指令、异常中断产生指令 - ARM的汇编程序中,有如下几种伪指令
符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令、其他伪指令 - ARM协处理器指令包括哪3类,请描述它们的功能
用于ARM处理器初始化ARM协处理器的数据处理操作。用于ARM处理器的寄存器和ARM协处理器的寄存器间的数据传送操作。用于在ARM协处理器的寄存器和内存单元之间传送数据。 - FIQ比IRQ快的原因
因为FIQ具有R8-R14独立寄存器,不用先保存寄存器信息 - 中断与异常的区别
异常可以说是同步中断,必须考虑与处理器的时钟同步,当程序运行出错的时候,必须要靠内核来处理,此时会产生一个异常。而中断是外部硬件产生一个电信号从CPU的中断引脚进入,打断CPU的运行。 - ARM系统中的参数传递
通过R0-R3传递,如果参数过多,通过压栈的方式解决。 - 协处理器主要控制
MMU、指令与数据缓存、写缓冲
**