硬件体系结构

ARM架构

ARM所采取的是IP(Intellectual Property,知识产权)授权的商业模式,收取一次性技术授权费用和版税提成。

ARM处理器的特点:

  1. 体积小、低功耗、低成本、高性能;
  2. 支持Thumb(16 位)/ARM(32 位)双指令集,能很好的兼容8 位/16 位器件;
  3. 大量使用寄存器,指令执行速度更快;
  4. 大多数数据操作都在寄存器中完成;
  5. 寻址方式灵活简单,执行效率高;
  6. 指令长度固定;

冯·诺依曼架构
冯诺依曼架构
冯·诺依曼体系的特点:

  1. 数据与指令都存储在同一存储区中,取指令与取数据利用同一数据总线
  2. 被早期大多数计算机所采用
  3. ARM7——冯诺依曼体系结构简单,但速度较慢。取指不能同时取数据

哈佛架构
哈佛架构
结构特点:

  1. 程序存储器与数据存储器分开
  2. 提供了较大的存储器带宽,各自有自己的总线
  3. 适合于数字信号处理
  4. 大多数DSP都是哈佛结构
  5. ARM9是哈佛结构,取指和取数在同一周期进行,提高速度,改进哈佛体系结构分成三个存储区:程序、数据、程序和数据共用

CISC复杂指令集(Complex Instruction Set Computer)
RISC精简指令集(Reduced Instruction Set Computer)

ARM处理器的分类
基于指令集体系结构的分类:v1,v2,v5,v5TEJ,v6等
基于处理器内核的分类:ARM7,ARM9,ARM10,ARM11,StrongARM,XScale等

ARM芯片选择的一般原则:

  1. ARM芯核:如果希望使用WinCE或Linux等操作系统以减少软件开发时间,就需要选择ARM720T以上带有MMU功能的ARM芯片.
  2. 系统时钟控制器:系统时钟决定了ARM芯片的处理速度。ARM7的处理速度为0.9MIPS/MHz,ARM10最高可以达到700MHz。
  3. 内部存储器容量:在不需要大容量存储器时,可以考虑选用有内置存储器的ARM芯片。
  4. GPIO数量:在某些芯片供应商提供的说明书中,往往申明的是最大可能的GPIO数量,但是有许多引脚是和地址线、数据线、串口线等引脚复用的。这样在系统设计时需要计算实际可以使用的GPIO数量。
  5. USB接口:许多ARM芯片内置有USB控制器,有些芯片甚至同时有USB Host和USB Slave控制器。
  6. 中断控制器:ARM内核只提供快速中断(FIQ)和标准中断(IRQ)两个中断向量。
  7. LCD控制器
  8. 扩展总线:大部分ARM芯片具有外部SDRAM和SRAM扩展接口,不同的ARM芯片可以扩展的芯片数量即片选线数量不同,外部数据总线有8位、16位或32位。某些特殊应用的ARM芯片如德国Micronas的PUC3030A没有外部扩展功能。
  9. 封装:主要的封装有QFP、TQFP、PQFP、LQFP、BGA、LBGA等形式,BGA封装具有芯片面积小的特点,可以减少PCB板的面积,但是需要专用的焊接设备,无法手工焊接。另外一般BGA封装的ARM芯片无法用双面板完成PCB布线,需要多层PCB板布线。

Thumb技术:ARM的RISC体系结构的发展中已经提供了低功耗、小体积、高性能的方案。而为了解决代码长度的问题,ARM体系结构又增加了T变种,开发了一种新的指令体系,这就是Thumb指令集,它是ARM技术的一大特色。

ARM汇编文件的组成

指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作
伪指令:在编译时替换成能被识别的ARM指令
伪操作:知道编译器进行编译,编译完成后不生成指令,也不占用内存空间。
ARM汇编指令类型

数据处理指令
跳转指令:实现程序执行过程中的跳转
Load/Store指令:CPU与内存数据之间的操作指令
状态寄存器存送指令:对状态寄存器操作(只能使用这些指令对状态寄存器操作)
协处理器指令:对协处理器进行操作
异常产生指令:产生异常(软中断),实现模式切换

编程模型

字(Word):在ARM体系结构中,字的长度为32位,而在8位/16位处理器体系结构中,字的长度一般为16位。
半字(Half-Word):在ARM体系结构中,半字的长度为16位,与8位/16位处理器体系结构中字的长度一致。
字节(Byte):在ARM体系结构和8位/16位处理器体系结构中,字节的长度均为8位。

ARM微处理器的工作状态
从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:

  • 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令;
  • 第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。

ARM体系结构的存储器格式
ARM体系结构将存储器看作是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB(2^32字节)。ARM存储器以8位为一个单元存储数据(一个字节),每个存储单元分配一个存储地址。32位的字数据要使用4个地址单元,16位半数据要使用2个地址单元。这样,就存在一个所存储的字或半字数据的排列顺序问题。ARM体系结构可以用两种方法存储字数据,称为大端格式和小端格式。
大端格式(big-endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
大端格式
小端格式(low-endian):与大端存储格式相反。低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。缺省设置为小端格式。
小端格式

指令长度及数据类型
ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在Thumb状态下)。
ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型,其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0)。

ARM微处理器支持7种运行模式,分别为:

  • 用户模式(usr):ARM处理器正常的程序执行状态
  • 快速中断模式(fiq):用于高速数据传输或通道处理
  • 外部中断模式(irq):用于通用的中断处理
  • 管理模式(svc):操作系统使用的保护模式
  • 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
  • 系统模式(sys):运行具有特权的操作系统任务。
  • 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
    ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。

寄存器组织
ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可编程访问的,取决微处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个或两个状态寄存器都是可访问的。
由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。(一条指令一个字,4个字节)

指令

ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。
ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类,具体的指令及功能如表3-1所示(表中指令为基本ARM指令,不包括派生的ARM指令)。
每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。

ARM指令的寻址方式
所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM指令系统支持如下几种常见的寻址方式:

  • 立即寻址
  • 寄存器寻址 ADD R0,R1,R2 R0←R1+R2,将寄存器R1和R2的内容相加,其结果存放在寄存器R0中
  • 寄存器间接寻址
    ADD R0,R1,[R2] ;R0←R1+[R2]
    LDR R0,[R1] ;R0←[R1]
    STR R0,[R1] ;[R1]←R0
    在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中。
    第二条指令将以R1的值为地址的存储器中的数据传送到R0中。
    第三条指令将R0的值传送到以R1的值为地址的存储器中。
  • 基址变址寻址
  • 多寄存器寻址
  • 相对寻址
  • 堆栈寻址

ARM 的技术实现
计算机本身只识别机器码是不能运行汇编代码的,这就需要将汇编代码装到机器代码中的工具 GNU Binutils 项目中的 GNU Assembler。一旦用扩展名*.s编写程序就需要把它与其进行组合并与ld链接起来:

1
$ as program.s -o program.o$ ld program.o -o program

编译

我们从最底层来看下,在最底层,电路上有电信号,信号是将电压切换为两个电平来形成的,例如0伏(关)或5伏(开)。
因为只是我们不能轻易的告诉电路电压,只能选择使用1/0来写入开/关的模式,然后我们对0和1的顺序进行分组,以形成机器码指令,该指令是计算机处理器的最小工作单元,以下是机器语言的示例:

1
1110 0001 1010 0000 0010 0000 0000 0001

我们知道ARM处理器只能对寄存器执行数据处理,所以与存储器的交互有两种:从存储器加载到寄存器,并将值从寄存器存储到存储器,即ARM使用加载/存储(LDR和STR)模型进行内存访问。

通常 LDR 用于将内存中的内容加载到寄存器中,STR用于存储寄存器中的内容到存储器地址。我们来举一个基本例子:
存储代码
存储交互过程
存储交互过程

ARM指令集

  • 跳转指令:通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转
  • 数据处理指令
    • MOV 数据传送指令
    • MVN 数据取反传送指令
    • CMP 比较指令
    • CMN 反值比较指令
    • TST 位测试指令
    • TEQ 相等测试指令
    • ADD 加法指令
    • ADC 带进位加法指令
    • SUB 减法指令
    • SBC 带借位减法指令
    • RSB 逆向减法指令
    • RSC 带借位的逆向减法指令
    • AND 逻辑与指令
    • ORR 逻辑或指令
    • EOR 逻辑异或指令
    • BIC 位清除指令
  • 程序状态寄存器访问指令
  • 批量数据加载/存储指令
    • LDM 批量数据加载指令
    • STM 批量数据存储指令
  • 数据交换指令
    • SWP 字数据交换指令
    • SWPB 字节数据交换指令
  • 移位指令
    • LSL 逻辑左移
    • ASL 算术左移
    • LSR 逻辑右移
    • ASR 算术右移
    • ROR 循环右移
    • RRX 带扩展的循环右移
  • 异常产生指令
    • SWI 软件中断指令
    • BKPT 断点中断指令

比如Intel CPU当前cs:ip=2000:0000,当前一条指令mov ax 0123H的机器码B8 01 23 分别存放在20000,20001,20002号内存单元,cpu怎么会知道这三个单元的内容是一起的?
是根据指令的机器码首字节的值判断出这是个什么指令,和这个指令有几个字节组成的。RISC每条都是32bit,x86会先看opcode再决定这个指令有多长。比如第一个字节的机器码是0EAH,那么可以确定这是一个远跳转指令,后面的4个字节是需要跳转的目标地址,紧跟0EAH其后的是目标地址的偏移,再往后就是目标地址的段地址,同时INTEL使用的是逆续地址排列法,比如1234H的偏移,在内存中是按 34 12 的顺序排列的

开发

C程序使用的是虚拟地址(Virtual Address)。虚拟地址0x00010000→内存映射机制→物理地址0x01010000
除了在编程时可以使用固定的内存地址,给程序员带来方便外,使用虚拟地址还能够使不同程序的地址空间相互隔离,提高内存使用效率。使不同程序的地址空间相互隔离。

存储器

片上存储器

而一般的主存储器采用动态存储器。这样指令和数据都存放在主存储器中,主存储器的速度将会严重制约整个系统的性能。在当前的时钟速度下,只有片上存储器能支持零等待状态访问速度。
片上RAM存储器,在许多嵌入式系统中采用简单的片上RAM而不是Cache(结构简单、价格便宜且功耗低、Cache有更不确定的行为),与Cache相比,片上RAM的缺点是需要程序员直接管理。

片外存储器

单片机的分为数据存储器和程序存储器。单片机内部的存储器称为片内存储器,片外扩展的存储器成为片外存储器。比如8031内部有数据存储器而没有程序存储器,所以它一般要外接一块程序存储芯片,内部的数据存储器叫做9031的片内存储器,外部扩展的存储芯片叫做片外存储器。片内,还是片外,区分的方法应该是使用什么指令,而不是他们是否分离成两块芯片。

RAM存储器

SRAM(Static RAM):静态存取,不需要刷新电路就能保存它内部存储的数据。
DRAM(Dynamic RAM):需要刷新电路,每隔一段时间需要对DRAM刷新充电一次,否则内部数据会丢失。
SDRAM :同步动态RAM,需要刷新,速度较快,容量大。
DDR SDRAM: 双通道同步动态RAM,需要刷新,速度快,容量大。
Cache :一般使用SRAM制造,它与CPU之间交换数据的速度高于DRAM,所以称为“高速缓存”。

ROM存储器

MASK ROM:掩模ROM。制造时写入数据,数据无法修改。成本低。常用于电脑开机
PROM:一次可编程ROM。
EPROM:紫外线擦除可编程ROM。将其暴露在紫外线下,数据全部清空。可以重复写录。
EEPROM:电擦除可编程ROM。利用电流擦除数据。可重复写录。
Flash:闪存。

存储卡

目前Flash主要有两种:NOR Flash和Nand Flash 。
NOR Flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。
NAND Flash没有采取内存的随机读取技术,它的读取是以块的形式来进行,通常一个块大小为512个字节,Nand Flash比较廉价,用户不能直接运行NAND Flash上的代码。

SD卡: SD卡是一种基于flash的存储卡。
MMC(MultiMedia Card)卡,是一种快闪存储器卡标准。在1997年由西门子及SanDisk共同开发,技术基于东芝的NAND快闪记忆技术。
SD卡(Secure Digital Memory Card)直译就是“安全数字卡”。是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,在MMC卡基础上发展而来。SD/MMC的存储介质就是NAND FLASH。
TF卡:是从SD卡的基础上改进而来的一种新型存储卡,TF卡又称T-Flash卡,全名:TransFLash,又名:MicroSD,TF卡比SD卡小。TF卡可以适配成SD卡,但SD卡一般无法转换成TF卡。现在手机一般用TF卡。

其他

更详细资料查阅各个芯片厂商官方文档

参考