接下来我们将要进行第三章 嵌入式微处理器的学习,这一章的内容较多而且比较重要,考试中也会占比较多分,本章以ARM为例进行学习,话不多说,开始吧!!!
Chapter3 嵌入式微处理器
目录
一、ARM9简介
1.ARM处理器核简介
ARM7采用冯诺依曼体系结构,即将程序指令存储器和数据存储器并在一起的存储结构,程序和数据共享一个存储空间。
ARM9之后采用了哈佛结构,即程序存储器和数据存储器由各自的总线与CPU连接,分开存储的存储结构。提高了总线数据吞吐量。
2.ARM9的结构特点!!
ARM处理器为RISC芯片,其简单的结构使ARM内核非常的小,这使得器件的功耗也非常低。它具有典型的RISC的特点:
- 大的、统一的寄存器文件
- 装载/保存结构,数据处理操作只针对寄存器的内容,而不直接对存储器进行操作
- 统一的固定长度的指令域,简化了指令的译码,便于指令流水线设计
ARM体系结构的特点
- 每条数据处理指令都对算数逻辑单元和移位器控制,实现了ALU和移位器的最大利用
- 地址自动增加和减少寻址模式,优化了程序的循环
- 多寄存器装载和存储指令实现最大数据吞吐量
- 所有指令的条件执行实现最快速的代码执行
3.ARM9TDMI
支持32位寻址范围,其后缀含义为:
4.ARM处理器的内部结构
首先我们以S3C2410芯片内部逻辑结构来学习ARM芯片的各部分
- AHB——高性能总线,高速总线
- APB——外围总线,低速总线
然后我们重点学习ARM处理器核的内部结构!!!
ARM核类似于芯片的CPU,也包括运算器(ALU算数逻辑单元)、控制器和寄存器。其中ALU为32位即ARM9为32处理器;
寄存器组共有37个,包括31个32位通用寄存器和6个状态寄存器
5.ARM9指令集特点
ARM属于RISC系列,指令是定长的。ARM9TDMI处理器内核支持32位ARM指令集和16位Thumb指令。
- ARM指令集:支持ARM所有的特性,具有高效、快速的特点,但是代码密度低
- Thumb指令集:具有灵活、小巧的特点,代码密度高
两个状态之间的切换不影响处理器模式或寄存器内容。说白了就是我可以先执行一条32位的ARM指令,紧接着输入执行一条16位的Thumb指令,是可以执行的,ARM处理器会自动切换,且切换开销几乎为零。
- ARM状态:32位,执行字方式的ARM指令
- Thumb状态:16位,执行半字方式的ARM指令
我们也可以换个理解方式:
即Thumb指令集是ARM指令集的子集,是一些常用的ARM指令,给其编写为16位的特殊指令,便于压缩程序的长度,同时还保持了ARM大多数性能上的优势。所以有些指令可能既是ARM指令又是Thumb指令。
6.ARM9的工作模式
当ARM运行在不用的工作模式时,其功能和权限各不相同。
- 特权模式——ARM内部寄存器和一些片内外设在硬件设计上只允许特权模式下访问。同时特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。
- 异常模式——指除了可以通过程序切入外,也可以由各类中断信号进入。每种异常都有一些独立的寄存器,以避免异常退出时用户模式的状态改变。
- 用户和系统模式——都不能由异常进入,而且使用完全相同的寄存器组。
7.ARM9的寄存器!!!
在ARMTDMI处理器中共有37个用户可见的寄存器,包括31个32位通用寄存器和6个状态寄存器。如图所示:
在用户模式、系统模式下,只能访问R0-R15和CPSR共17个寄存器
在管理模式下,可以访问R0-R12、R13_svc、R14_svc、R15、CPSR、SPSR_abt
在中止模式下,可以访问R0-R12、R13_abt、R14_abt、R15、CPSR、SPSR_abt
在未定义模式下,可以访问R0-R12、R13_und、R14_und、R15、CPSR、SPSR_und
在中断模式下,可以访问R0-R12、R13_irq、R14_irq、R15、CPSR、SPSR_irq
在快中断模式下,可以访问R0-R7、R8_fiq-R14_fiq、R15、CPSR、SPSR_fiq
1.通用寄存器
R0~R13为保存数据或地址的通用寄存器,不会被体系结构作为特殊用,并且可用于任何使用通用寄存器的指令。
- 其中R0~R7为未分组的寄存器,即对于任何处理器模式,其都对应于32位的物理寄存器
- R8~R14为分组寄存器,其所对应的物理寄存器取决于当前所处的处理器模式。尤其R13、R14有6个分组,一个用于用户和系统模式,其余五个分别用于五种异常模式
- R13常作为堆栈指针SP使用,但没有以特殊方式使用
2.特殊寄存器
- R14——链接寄存器LR,在结构上有两个特殊功能:(1)在每种模式下,模式自身的R14版本用于保存子程序返回地址(2)当发生异常时,将R14对应的异常模式版本设置为异常返回地址
R14与子程序的调用
R14与异常处理
- R15——程序计数器PC,指向正在取指的地址。
读R15的限制:正常操作时,从R15中读取的值是处理器正在取值的地址,即当前正在执行的地址加上8字节(两条ARM指令的长度)。由于ARM指令以字为单位,所以寄存器最低两位总为0
写R15的限制:正常操作时,写入R15的值被当做一个指令地址,程序从该地址处继续执行
- CPSR/SPSR——程序状态寄存器。分为六个,一个是CPSR为当前程序状态寄存器,五个为异常使用的保存的程序状态寄存器SPSR。
例如响应一个来自外设的中断,在处理异常之前,ARM9TDMI内核会先保存处理器当前的状态(即将CPSR中的信息存入SPSR),当处理程序结束后,再恢复执行原来的程序(即SPSR中的信息读取到CPSR)
下面是CPSR模式位的设置:
二、ARM9的存储组织结构和I/O接口的访问方式
1.ARM9的存储组织结构
ARM9TDMI处理器采用哈佛结构,即指令和数据各用一条32位数据总线。只有装载、保存和交换指令可访问存储器中的数据。
(1)数据类型
- Byte:字节,8位
- Halfword:半字,16位,C语言中对应int类型
- Word:字,32位,C语言中对应long类型
(2)存储器格式
存储器系统有两种映射机制,默认为小端格式
- 小端格式——高位数字存放在高位字节中,因此存储器系统字节0连接到数据线7~0(低位对齐)
- 大端格式——高位数字存放在低位字节中,因此存储器系统字节0连接到数据线32~24(高位对齐)
-------------举个栗子-------------
2.I/O接口的访问方式
(1)I/O接口独立编址——端口映射方式
将系统存储器地址空间和I/O接口地址空间分开设置,通过不同的指令来区分访问的地址空间类型。设专门的输入IN和输出OUT指令对I/O接口进行操作
(主要优缺点可以进行一下了解)
主要优点:内存地址空间和I/O接口地址空间分开,互不影响,译码电路较简单,并设有专门的I/O指令,所以编程序易于区分,且执行时间短,速率快。
缺点:只用I/O指令访问I/O端口,功能有限且要采用专用I/O周期和专用I/O控制线,使微处理器复杂化。
(2)I/O接口与存储器统一编址方式——内存映射(ARM采用)
不区分存储器地址空间和I/O接口地址空间,把所有的I/O接口的端口当做存储器的一个单元对待,每个接口芯片都安排一个或几个与存储器统一的编号的地址号。也不设专门的输入和输出指令。
优点:访问内存的指令都可用于I/O操作,数据处理功能强,同时I/O接口可与存储器部分共同译码和控制电路。
缺点:一是I/O接口要占用存储器地址空间的一部分;二是因不用专门的I/O指令,程序中难以区分I/O操作。
三、ARM9的异常!!!重点!
1.ARM的异常类型
有7种异常类型,对应5种异常模式。当执行该异常类型事物,跳转到对应的入口地址,执行异常处理程序
2.ARM的异常优先级
顺序固定!
3.ARM的异常的处理过程
(1)进入异常
当一场发生后,ARM内核会做一下工作
①在适当的LR中保存下一条指令的地址,当异常入口来自
- ARM状态,那么当前指令地址加4或8复制到LR中
- Thumb状态,那么当前指令地址加2或4或8复制到LR中
②将CPSR复制到SPSR中
③将CPSR中的模式位强制设置为与异常类型对应的值
④强制PC从相关的异常向量处取指
(2)退出异常
当异常结束时,异常处理程序必须:
①将LR中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同
②将SPSR的值复制回CPSR
③清零在入口置位的中断禁止标志
注:恢复CPSR的动作会将T、F、I位自动恢复到异常发生前的值
四、ARM9指令系统
ARM的指令比较精简,只有装载、存储和交换指令可以对存储器中的数据进行访问。
学习ARM指令,首先要学会寻址方式,可以找出能访问存储器的指令;
掌握ARM指令格式的特点,了解桶形移位器的作用;
知道ARM汇编程序的结构是什么样的?
结合硬件知识,分析一段典型的启动代码。(Keil中ARM程序项目的Startup.S)
1.ARM的寻址方式
寻址方式是根据指令中所给出的地址字段来实现寻找真正操作数地址的方式。ARM中有9种基本寻址方式。
- 寄存器寻址
- 立即寻址
- 寄存器移位寻址
- 寄存器间接寻址
- 基址寻址
- 多寄存器寻址
- 堆栈寻址
- 块拷贝寻址
- 相对寻址
(下面的的内容懒了,给说明一下重点吧,等之后有时间了,在出一下还没有说的内容)
2.ARM指令集
(这里我们要掌握指令的格式、常见指令的用法与功能,例如LDR、STR、MOV、B、BX、SWI,以及伪指令LDR、ADR,还有一些特殊操作:如堆栈的操作、子程序的调用与返回,还有异常中断指令SWI的原理及用法)
五、ARM程序设计基础
(这里需要重点了解Start up.S分析:作用,如何跳转到C语言)