文章目录
操作系统的主要功能
- 进程管理
- 内存管理
- 文件系统
- 设备管理
- 网络协议
ARM体系结构与接口技术
体系结构
- 储存模式
- 工作模式
- 寄存器
- 异常机制
- 流水线
- 指令集
接口技术
- GPIO
- PWM
- UART
- ADC
- RTC
- IIC
CPU执行过程
- 取址
处理器将PC指向的地址中的内容返回给指令寄存器IR中 - 译码
译码器将指令寄存器IR中的指令翻译,并发送给运算器 - 执行
控制器控制运算器执行运算
ARM处理器概述
指令集
- RISC:
只保留常用的简单指令,硬件结构简单,复杂操作一般通过简单指令集组合实现,一般指令长度固定,且多为单周期指令
RISC处理器在价格,功耗,体积方面有很大优势,所以在嵌入式移动终端领域极为广泛 - CISC:
不仅包含了常用指令,还包括了很多不常用的特殊指令,硬件机构复杂,指令条数较多,一般指令长度和周期不固定
CISC处理器在性能上有很大优势,多用于PC及服务器领域
ARM指令集
指令与指令集
- 指令:能够指示处理器执行某种运算的命令,称为指令
处理器能识别指令的集合,称为指令集
ARM指令集
所有指令都占32bit
代码灵活度高,简化了代码复杂度
执行ARM指令集时,PC值每次自增4 - Thumb指令集
所有指令都占用16bit指令空间
代码密度高,节省存储空间
执行Thumb时,PC每次自增2
指令流水线
-
ARM7采用三级
-
ARM9采用5级
-
Cortex-A9采用8级
不管几级流水线,PC指向的永远是当前正在取值的指令,而当前正在执行的指令的地址为PC-8
ARM数据类型
采用32位架构,基本数据类型有以下三种
- Byte:8bit
- Halfword:16bit
- Word:32bit
数据存储与存储类型
- auto:一般存在栈
- extern:外部存储
- register:访问速度快,没有地址,无法取地址操作,不可以定义全局变量,全局变量生命周期长
- static:数据存储在数据端,或叫静态区
Word型数据在内存的起始地址,必须是4的整数倍
Halfword数据在内存的起始地址,必须是2的整数倍
字节序
ARM一般使用小端对齐
- 大端对齐:低地址存放高位,高地址存放低位
- 小端对齐:低地址存放地位,高地址存放高位
ARM指令存储
处理器处于ARM状态时:所有指令的起始地址必须是4的整数倍
处理器处于Thumb状态时:所有指令的起始地址必须是2的整数倍
ARM工作模式
ARM拥有8种不同工作模式
不同模式拥有不同权限
不同模式执行不同代码
不同模式完成不同功能
- User:非特权模式,一般执行上层应用程序时ARM处于该种模式
- FIQ:快速中断模式
- IRQ:普通中断模式
- SVC:复位或软中断
- Abort:产生存储异常时
- Undefi:执行未定义指令时
- System:使用和User模式相同寄存器的特权模式
- Monitor:为了安全而扩展出用于执行安全监控代码的模式
ARM寄存器组织
寄存器
寄存器时处理器内部的存储器,没有地址
一般用于暂存参与运算的数据和运算结果
包括通用寄存器,专用寄存器,控制寄存器
40个寄存器(37个位老版本,多出的部分为Monitor模式)
专用寄存器
- R15(PC,Porgram Conter)
用于存取当前取址指令的地址 - R14(LR,Link Register)
执行跳转指令(BL,BLX)时,LR会自动保存跳转指令下一条指令的地址,程序需要返回时将LR的值复制到PC即可
产生异常时,对应异常模式下的LR会自动保存被异常打断的指令的下一条指令的地址,异常处理结束后将LR的值付给PC即可实现程序返回 - R13(SP,Stack Pointer)
用于存储当前模式下的栈顶指针
CPSR寄存器
- Current Program Status Register当前程序状态寄存器
- 控制域(C)[Bit8:Bit0]
- 模式位(M)[4:0]
- 10000 User
- 10001 FIQ
- 10010 IRQ
- 10011 SVC
- 10110 Monitor
- 10111 Abort
- 11011 Undef
- 11111 System
- 状态位(T)[Bit5]
- 0 Arm状态
- 1 Thrumb状态
- FIQ禁止位(F)[Bit6]
- 0 开启FIQ
- 1 关闭IRQ
- IRQ禁止位(I)[Bit7]
- 0 开启IRQ
- 1 关闭IRQ
- 模式位(M)[4:0]
- 预留域(X)[15:8]
- 状态域(S)[23:16]
- 条件域(F)[31:24]
- 溢出标志(V)Bit[28]
运算器中产生了负数的结果该位自动置1,否则为0 - 进位或借位扩展(C)Bit[29]
运算器中产生了0的结果该位自动置1,否则为0 - 零(Z)Bit[30]
运算器中进行加法运算且产生进位时该位自动置1,否则为0
运算器中进行减法运算且产生借位时该位自动置0,否则为1 - 负或小于(N)Bit[31]
运算器中进行加法运算且产生符号位进位时该位自动置1,否则为0
运算器重进行减法运算且产生符号位借位时该位自动置0,否则位1
- 溢出标志(V)Bit[28]
ARM异常处理
- 异常处理机制
不同的处理器对异常的处理流程大体相似,但是不同的处理器在具体实现的机制上有所不同,比如处理器遇到哪些事件认为是异常事件遇到异常事件后处理器有哪些动作,处理器如何跳转到异常处理程序如何处理异常,处理完异常后又如何返回到被打断的程序继续执行等。
将这些细节实现统称为异常处理机制
ARM异常源
导致产生异常的事件称为异常源
- 七类异常源
- FIQ
快速中断请求 - IRQ
外部中断请求 - Reset
复位电平有效 - Softerware Interrput
执行swi指令 - Data Abort
数据终止 - Prefetch Abort
指令预取终止 - Undfined instruction
遇到不能处理的指令
- FIQ
异常向量表
异常向量表的本质时内存中的一段代码32个字节
表中为每个异常源分配了四个字节存储空间
遇到异常后PC的值会修改为对应的地址
因为异常向量表空间有限,一般我们不会在这里写异常处理程序,
而是在对应的位置写一条跳转指令使其跳转到指定的异常处理程序的入口
地址 | 异常源 |
---|---|
0x1C | FIQ |
0x18 | IRQ |
0x14 | Reserved |
0x10 | DataAbort |
0x0C | PrefetchAbort |
0x08 | SWI |
0x04 | Undef |
0x00 | Reset |
ARM产生异常之后的动作
- 拷贝CPSR中的内容到对应模式下的SPSR_
- 修改CPSR的值 修改中断禁止位禁止相应中断 修改模式位,进入相应模式 修改状态位,进入ARM状态
- 保存返回地址到对应异常模式下的LR_
- 设置PC为相应的异常向量(异常向量表对应的地址)
异常返回
- 将SPSR_的值复制给CPSR, 使处理器恢复之前的状态
- 将LR_的值复制给PC, 使程序跳转回被打断的地址,继续执行
异常优先级
- Reset
- Data Abort
- FIQ
- IRQ
- Prefetch
- Abort
- Software
- Interrput
- Undefined instruction
FIQ和IRQ
FIQ的响应速度比IRQ快
- FIQ在异常向量表位于最末 可以直接把异常处理卸载异常向量表之后,省去跳转
- FIQ有五个私有寄存器(R8-R12),执行终端处理程序前无需压栈保存寄存器,可直接处理中断
- FIQ的优先级高于IRQ ,两个中断同时发生时先响应FIQ,FIQ可以打断IRQ,但IRQ不能打断FIQF