ARM7体系结构

之前有提到嵌入式系统的目标就是将计算机芯片化,集成为单片微型计算机,满足对象体系的控制要求。为了实现这一轻便的性能,提供更大的灵活性和更高的智能化,ARM内核采用精简指令集计算机体系结构——RISC,它的逻辑简单,指令集少。

这里有必要说一下RISC结构体系的特征:

  1. 具有大量的通用寄存器
  2. 通过装载/保存结构使用独立的load和store指令,完成数据在寄存器和外部存储器之间的传送。其中需要说明的是,处理器只处理寄存器中的数据。这样可以加快访问速度,因为不必每次访问存储器。

ARM体系结构还有如下特征:

  1. load/store进行批量数据传输,实现最大数据吞吐量。
  2. 每条数据指令可以同时包含算数逻辑单元ALU的运算和移位处理。地址自动增加,自动减少的寻址方式,优化程序中的循环处理。
  3. 大多数ARM指令是条件执行的。

RISC的缺点:

功能少

ARM处理器的系列:

M:微控制处理器

成本低,体积小,引脚数目少,Cortex-M3采用纯Thumb2指令执行方式,32位高性能ARM内核能够实现8位和16位处理器级数的代码存储密度,非常适用于几K的存储器MCU市场

R:实时处理器

按照我的理解,应该是因为有很多的中断,实现其实时性

A:应用处理器

性能最好,效能最高

在ARM7系列中,可以使用Embedded ICE JTAG进行在线调试

ARM7TDMI

T: 支持Thumb D: 在线调试 M: 双字相乘 I: 硬件仿真

存储器的字和半字

ARM处理器直接支持8位的字节,16位的半字和32位的字,其中以能被4整除的地址开始连续的4个字节构成一个字,从偶数地址开始连续的2个字节构成一个半字——ARM指令的长度为一个字(四个字节),Thumb指令的长度为一个半字(两个字节)
即ARM为32位的字,Thumb为16位的半字
注意:由于不管是ARM还是Thunb,地址都是偶数,因此bit0位一定是为0,ARM属于字对齐,bit1和bit0都为0,Thumb半字对齐,仅有bit0为0.

三级流水线

流水线的三个阶段分别为:取指,译码,执行
注意:ARM正在执行第一条指令的同时对第二条指令进行译码,并将第三条指令从存储器中取出。只有在取第四条指令时,第一条指令才算正真完成执行。
若将正在执行的指令作为参考点,称为第一条指令,则PC总是指向第三条指令,即:PC总指向正在执行的指令再加2条指令地址
ARM状态时:PC=当前指令位置+8字节
Thumb状态时:PC=当前指令位置+4字节
例如:

0x4000 ADD PC,PC,#4       ;正执行的命令,将PC+4赋给PC(找准PC的值)
0X4004 ...                ;被译码的命令
0X4008 ...                ;被取指的命令(PC总是指向正执行命令的地址再加2条指令地址,及现在这个地址,0X4008)
0X400C ...                ;PC是0x4008,加上4之后为现在这个地址0X400C

ARM处理器的状态

当前程序状态寄存器CPSR中的控制位T反应处理器正在操作的状态,状态切换时不影响模式和寄存器的内容

ARM:T=0

上电默认状态也是ARM,32位

Thumb:T=1

16位
两者不能混合使用,内核必须切换状态才可以,切换的指令有BX(有条件跳转,检测R0的最低位,为0则为ARM,为1则为Thumb),BXL(无条件跳转)

;从ARM状态切换到Thumb状态
          CODE32
          LDR   R0,=Lable+1        ;R0的bit0=1,BX自动将CPSR中T置1
          BX    R0                  ;切换到Thumb状态,跳转到Lable
          CODE16                    ;Thumb指令
Lable  MOV   R1, #12
;从Thumb状态切换到ARM状态
          CODE16     ;Thumb指令
          LDR    R0,=Lable      ;R0的bit0为0,BX将CPSR中T置0
          BX      R0     ;切换到ARM指令
          CODE32
Lable   MOV  R1,#10

ARM处理器模式(7种)

用户模式

正常工作状态,不能由此切换到其他状态

系统模式

用户模式和系统模式不能由异常进入,想要进入系统模式,必须修改CPSR才能实现
如下:管理模式切换到系统模式:

MSR   CPSR_c,#(NoInt | SYS32Mode)

特权模式,与用户模式类似,但可以切换到其他模式,与用户模式共用相同寄存器

未定义模式

中断模式

快速中断模式

管理模式

中止模式

这五种属于异常模式,只有当相应的异常相应时,才能进入。

ARM内部寄存器

ARM共有37个寄存器,其中31个32位的都用了,另外有6个32位的仅用了12位。

ARM状态下的寄存器

从arm7使用什么架构 arm7的体系结构_从arm7使用什么架构

一般通用

R0~R7

堆栈指针R13(SP)

保护待使用的寄存器里的内容

链接寄存器R14(LR)

保护现场返回地址,子程序的返回地址将自动的存入到R14中,当程序结束后,将R14复制到程序计数器PC中,实现子程序的返回
执行如下任何一条指令都OK

MOV  PC,LR
BX  LR

在子程序入口,使用STMFD指令将R14和其它寄存器的内容保存到堆栈SP中

STMFD  SP!,{<registers>,LR}

在子程序结束时,使用批量寄存器读取指令LDMFD,将返回地址从堆栈中复制到程序计数器PC中,实现子程序返回

程序计数器R15(PC)

当前程序状态寄存器,P15(PC)总是指向正在取指的指令。若无其他跳转指令,则PC将自动加1个地址,跳转到下一个地址位
(1)读R15
当使用STM或STR指令保存R15时,R15保存的是当前指令地址+偏移量
测试芯片具体存储PC时的偏移量程序:

SUB  R1,PC,#4       ;R1存放下面STR指令的地址
STR  PC,[R0]        ;保存“STR指令地址+偏移量”到R0中
LDR  R0,[R0]       ;重装
SUB  R0,R0,R1      ;计算偏移量=PC-STR地址

(2)写R15
由于ARM是字对齐的,因此写的地址必须是有效的正确地址,即是bit0=0,bit1=0,bit[1:0]=0b00
Thumb半字对齐,bit0=0,写入地址时可先与0xFFFF FFFE相与再写入

CPSR和SPSR

用户和系统模式不是异常中断,没有SPSR,其他每种异常都有各自相应的SPSR,它们的作用是异常产生时,保存当前CPSR的值。然后设置CPSR为相应的异常模式。异常中断程序退出返回时,可以通过保存在SPSR中的值来恢复CPSR
除用户模式,其他每种处理器模式都可以通过改写CPSR中的模式位改变

Thumb状态下寄存器

各种模式下实际访问的寄存器

从arm7使用什么架构 arm7的体系结构_从arm7使用什么架构_02

一般通用寄存器

R8~R12thumb状态一般不会用,只有个别指令可以访问,如MOV,ADD,CMP

堆栈指针R13(SP)

Thumb指令集带有传统PUSH和POP指令用于堆栈操作处理。

链接寄存器R14(LR)

跟前面ARM的用法差不多

ARM状态寄存器和Thumb状态寄存器的关系

R0~R7是相同的
Thumb状态CPSR(没有SPSR)和ARM的CPSR一样,Thumb指令集不包含MSR和MRS,要修改CPSR任何标志位必须回到ARM状态,而且当完成复位时,或者进入到异常模式时,会被自动切换到ARM状态
所有异常在ARM状态下执行

当前程序状态寄存器

条件代码标志

N: 负标志,运算结果的第31位,记录标志设置操作结果
Z: 零标志
C: 进位标志
V: 一处标志

控制标志位

I: 中断禁止标志,I=1禁止
F: 快速中断禁止标志,F=1禁止
T: 处理器状态位,T=1,Thumb;T=0,ARM
M0~M4:处理器模式位,特定的几种模式位有定义处理器模式

ARM体系的异常、中断及向量表

~~~~老胡说这里很重要!!!
可是我好困了,这个留着明天再总结好了~