嵌入式处理器结构类型

嵌入式处理器体系结构按指令集可分为复杂指令集结构(CISC)和精简指令集结构(RISC),按存储机制分为冯·诺伊曼结构和哈佛结构,按字长分为8、16、32、64位结构,按不同内核系列可分为51,AVR,MSP430,MISP,PowerPC,MC68K,C
odeFire,ARM等。
在这里插入图片描述

1、CISC处理器和RISC处理器

指令集与程序设计密切相关,其内容包括基本数据类型,寄存器、寻址模式,指令,中断,异常处理,以及外部IO等。他是设计处理器的主要依据,通常被人们称为指令集体系结构或IS结构(ISA)CISC指令多且复杂不规整,RISC指令少且规整。
在这里插入图片描述

2、冯诺依曼存储结构和哈佛存储结构

它们两个不懂之处是冯诺依曼存储结构将数据和指令存放在一起,CPU以一根总线与存储器链接,哈佛结构将指令和数据分开存放,CPU以两条总线与存储器链接。
冯·诺依曼结构冯诺依曼结构
哈佛结构在这里插入图片描述

ARM处理器概述

1、ARM处理器特点

(1)单周期操作
ARM指令在一个机器周期内即可完成,
(2)只是用加载\存储指令访问内存。
与存储器有关的指令只有LDR和STR
(3)指令长度固定
1)ARM指令集
全为32位指令
2)Thumb指令集
全为16位指令
3)Thumb-2指令集
既有十六位指令又有32位指令
在这里插入图片描述
(4)三地址指令格式
在这里插入图片描述
(5)指令流水线技术
在这里插入图片描述
在这里插入图片描述
(6)低功耗设计

2、ARM微架构发展

在这里插入图片描述
在这里插入图片描述

3、ARM处理器分类

处理器核:指实现某种版本ARM指令集架构、具有取指令和执行指令的功能的器件。
处理器:以处理器核为中心再集成其他功能组件,一个处理器中有可能包含多个处理器核。
在这里插入图片描述

4、ARM处理器体系结构

(1)ARM处理器的工作状态
ARM处理器可以工作在三种不同的工作状态,分别是:ARM状态,Thumb和Thumb-2状态以及调试状态。除支持Thumb-2的ARM处理器外其他处理器都可以工作在ARM状态。
1)ARM状态
即处理器工作于32位指令状态
2)Thumb状态
即处理器工作于16位指令状态
3)调试状态
处理器停机调试时进入调试状态
注意:①有些情况下处理器必须执行32位的ARM指令,这是必须切换到ARM状态。②对于支持Thumb-2指令集的处理器,Thumb状态就是运行Thumb-2的状态。③除Cortex M系列处理器外,所有ARM处理器复位后开始执行代码时总是处于ARM状态。④Cortex-M处理器只支持Thumb-2指令集,所以他只有Thumb状态和调试状态。
4)ARM与Thumb状态之间的切换

①ARM切换到Thumb
通过BX指令,将操作数寄存器的最低位设置为1即可,如果R0[0]=1,则执行BX R0指令进入thumb状态。如果Thumb状态进入异常处理(异常处理在ARM状态),则当异常返回时自动切换到Thumb状态。
②Thumb切换到ARM
同上将最低为设置为0即可。如果处理器进行异常处理时则自动进入ARM状态。
这两种状态之间的切换开销几乎为零。
(2)ARM处理器的工作模式
ARM除Cortex体系外共支持7种工作状态,取决于状态寄存器CPSR低五位的值。
在这里插入图片描述
①当处理器处于用户模式时,除非发生异常否则不能改变工作模式。
②当发生异常时,处理器自动改变CPSR的值进入相应的工作状态。
③当处于系统模式时,用指令改写CPSR的值进入相应的状态。
(3)ARM状态下的寄存器
①ARM状态下的寄存器
共有37个寄存器,包括31个通用寄存器和6个状态寄存器。不同工作模式下处理器会使用不同的处理器组,具体如下:
在这里插入图片描述
1)通用寄存器
共31个寄存器,标有下标的寄存器是用于特定模式的寄存器,与其他模式地址重叠但是内容不同。如标有fpi的寄存器是快速中断模式专用寄存器。
①R0-R7共一组计八个寄存器,为公用通用寄存器。
②R8-R12共两组计十个寄存器。
③R13-R14共六祖计十二个寄存器 。在用户模式和系统模式分别作为堆栈指针SP和程序链接寄存器LR。
④R15(PC)共一组计一个为程序计数器。
2)状态寄存器
共6个寄存器
①CPSR共一组计1个为当前程序状态寄存器。②SPSR共五组计五个为备份程序状态寄存器。
在这里插入图片描述
状态寄存器主要组成为:条件码标志四个N,Z,C,V;Q标志;以及八个控制位I,F,T,M4-M0.
各位含义如下:
N为符号标志,N=1时计算结果为复数,N=0时计算结果为负数。
Z为全零标志,运算结果为0,则Z=1,否则Z=0.
C为进借位标志,加法有进位时C=1,无进位时C=0;减法有借位时C=0,无借位时C=1。
V为溢出标志,加减法运算有溢出时V=1,否则V=0。
Q为增强的DSP运算指令师傅溢出的标志位,溢出时Q=1,否则Q=0。
I为中断禁止控制位,I=1禁止外部IRQ中断,I=0允许IRQ中断。F为禁止快速中断FIQ的控制位,F=1禁止FIQ中断,F=0允许FIQ中断。
T为ARM与Thumb指令切换控制位,T=1时执行Thumb指令,否则执行ARM指令,对于不具备Thumb指令的处理器,T=1时表示下一次执行的指令产生未定义的指令中断。
M0-M4为模式选择位,决定处理器工作在何种模式下。
④CPSR状态寄存器可分为四个域:标志域F(31:24),状态域S(23:16),扩展域X(15:8),控制欲C(7:0)。使用单字节的传送指令可以单独访问这四个域中的任何一个,如CPSR_C、CPSR_F,这样可以仅对这个域操作而不影响其他位。
(4)Thumb状态下的寄存器
在这里插入图片描述
(5)带MMU的ARM处理器中的控制寄存器
存储器库管理单元MMU,存储器保护单元MPU的功能:
1)虚拟地址到物理地址映射
2)存储器访问权限控制
3)虚拟存储空间的缓冲特性设置
(6)ARM处理器的异常
1)异常种类,异常向量和优先级
在这里插入图片描述
提示:如果读到这里你还不了解中断和异常向量概念的内涵,不建议再看下去。
2)中断响应过程
当中断产生后,除了复位中断立即中止当前指令外,其余情况都是处理器完成当前指令后,才去执行异常处理程序。
①将CPSR的值保存到将要执行的异常中断对应的各自SPSR中,以实现对处理器当前状态、中断屏蔽及各标志位的保护。
②设置当前状态寄存器CPSR的相应位。设置CPSR中的M4~M0的5位,进入相应工作模式,设置I=1禁止IRQ中断,如果进入复位模式或FIQ模式,还要设置F=1以禁止FIQ中断。
③将引起异常指令的下一条地址(断点地址)保存到新异常工作模式的LR(R14)中,使异常处理程序执行完后正确返回原来程序处继续向下执行。
④给程序计数器PC强制赋值,转入向量地址,以便执行相应的处理程序。
每种中断异常模式对应两个寄存器SP和LR,分别存放堆栈指针和断点地址。
3)从异常程序中返回
从中断返回。如果是复位异常,系统自动从0x00000000开始重新执行程序,无需返回。
①首先恢复原来被保护的用户寄存器。
②将SPSR寄存器复制到CPSR中,使得原来CPSR状态从相应的SOSR中恢复,一恢复被中断的程序状态。
③根据异常类型将PC值恢复成断点地址,以继续执行用户原来运行着的程序。
④清除CPSR中的中断禁止标志I和F,开放外部中断和快速中断。
注意:
①程序状态寄存器及断点地址的恢复必须同时进行。
②由于异常随机发生,所以要对异常向量进行初始化,即在异常向量的地址处放置一条跳转指令,跳转到异常处理程序。
(7)ARM的存储器格式
系统复位时一般默认为小端模式。
1)大端模式
数据:0x12345678 (共32位)
地址:A+3,A+2,A+1,A(A为本储存区最低有效地址)
A+3 = 0x78
A+2 = 0x56
A+1 = 0x34
A = 0x12
总结:低存高(低地址存高字节)
2)小端模式
数据:0x12345678 (共32位)
地址:A+3,A+2,A+1,A(A为本储存区最低有效地址)
A+3 = 0x12
A+2 = 0x34
A+1 = 0x56
A = 0x78
总结:高存高(高地址存高位数据);
(8)ARM数据类型
ARM处理器支持字节,半字,字,浮点等数据类型。其中半字需要二字节对齐,字需要四字节对齐。其中每一种又包括有符号数和无符号数。
当指令从存储器读出字节或半字数据放入寄存器时,根据指令要求会自动扩展符号位使数据成为32位操作数。
(9)ARM指令集
1)指令格式
①一般格式
<指令操作码>{条件域}{执行时是否更新CPSR} <目的寄存器>,<第一个源操作数>,{第二个源操作数}
其中<>内为不可省略,{}内为可省略。
②指令中的条件域
每条ARM指令包含4位的条件码,位于指令的最高四位,条件码共有16种,只有15种可用,第16种为系统保留。
在这里插入图片描述
2)指令中的操作数符号
①#——立即数符号
②!——更新基址寄存器符号
③^——复制SPSR到CPSR符号
④- ——指示寄存器列表范围符号
3)指令中的移位操作符
格式如下:
通用寄存器,<移位操作符>#<移位次数>
在这里插入图片描述
4)指令的寻址方式
①立即寻址
MOV R0,#0x00
②寄存器寻址
ADD R0,R1,R2
③寄存器间接寻址
LDR R5,[R4]
④基址加变址寻址
LDR R0,[R1,#4]
⑤相对寻址
⑥堆栈寻址
⑦块拷贝寻址
可以用一条指令完成最多传送16个通用寄存器的值
LDMIA R0,{R1-R3}
5)指令分类
①数据处理类指令

在这里插入图片描述
②程序状态寄存器访问指令
1)MRS——程序状态寄存器到通用寄存器的数据传送
MRS cond Rd,PSR(CPSRorSPSR)
2) MSR——通用寄存器到程序状态寄存器
MSR cond PSR_fields,Rm
③跳转指令
在ARM中有两种跳转方式:一是使用跳转指令,可以实现从当前指令向前向后32MB空间跳转,二是直接向PC中写入地址值,可以实现在4GB的空间内进行跳转
1)B ——转移指令
B cond Lable(目的地址)
跳转值是一个想对值,如果使用B .指令.代表当前地址。
2)BX——带状态切换的跳转指令
BX cond Rn
跳转到由Rnyu0xfffffffe相与后的地址,如果Rn的最低位=1,则将CPSR的T标志置1,且将目标地址的代码解释为Thumb。
3)BL——带返回的转移指令
BL cond Label
在跳转前会在R14内保存PC的当前值。
4) BLX——带返回且带状态切换的转移指令
BLX Label
上述结合
④加载/存储指令
1)LDR——字数据加载
LDR cond Rd,[Rn,#offset][!]
2)LDRB——字节数据加载
LDR cond B Rd,[Rn,#offset][!]
3)LDRH——半字数据加载指令
LDR cond H Rd,[Rn,#offset][!]
4)STR——字数据存储
STR cond Rd,[Rn,#offset][!]
5)STRB——字节数据存储
STR cond B Rd,[Rn,#offset][!]
6)STRH——半字数据存储
STR cond H Rd,[Rn,#offset][!]
7)LDM——批量数据加载
LDM cond {IA|IB|DA|DB}Rn[!],reglist[^]
IA:传送后地址增加
IB:传送前地址增加
DA:传送后地址减少
DB:传送前地址减少
!:当数据传送完之后将最后的地址写入基址寄存器
基址寄存器不允许使R15
^:当指令位LDM且寄存器列表中包含R15,除了正常的数据传送外,还将SPSR复制到CPSR,同时还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
8)STM——批量数据存储
STM cond {IA|IB|DA|DB}Rn[!],reglist[^]
⑤协处理器指令
⑥异常中断指令
1)SWI——软件中断指令
SWI cond imm24
2) BKPT——断点中断指令
BKPT imm16
(10)Thumb指令集
1)数据处理指令
在这里插入图片描述

2)存储器访问指令
在这里插入图片描述
3)跳转指令
在这里插入图片描述
4)杂项指令
在这里插入图片描述
5)伪指令
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(11)ARM处理器支持的伪指令
①ADR伪指令
ADR {条件域} 目的寄存器,expr
相对偏移地址加载到通用寄存器中
②LDR伪指令
LDR {条件域} 目的寄存器,=[expr|label-expr]
用于32位常数或地址的加载
③NOP伪指令
空操作用于延时
(12)ARM汇编语言程序设计
2)语句格式
标号 指令或伪指令;注释
在行的末尾用\表示下一行与本行为同一语句,标号必须顶格写且后面没有:号。
①变量代换
程序中的变量可以通过代换操作取得一个常量,代换操作符为$
1)数值变量前有$
编译器会将该数字变量的值转换为十六进制的字符串
2)逻辑变量前
编译器会将逻辑变量代换为它的取值(真或假)
3)字符串变量
编译器会将字符串变量代换为它的值
②结合性和优先级
优先级:括号>单目运算符>双目运算符
结合性:单目运算符从右到左,双目运算符从左到右
③数值表达式和运算符
数值表达式一般由数值常量,数值变量,数值运算符和括号组成。
1)算术运算符
+,-,*,/,MOD
2)移位运算符
ROl,ROR,SHL,SHR
3)数值逻辑运算符
AND,OR,NOT,EOR
④逻辑表达式及运算符
逻辑表达式由逻辑量,逻辑运算符,括号组成
1)关系操作符
+,>,<,>=,<=,/=,<>
2)逻辑运算符
LAND,LOR,LNOT,LEOR
⑤字符串表达式及运算符
字符表达式一般由字符串常量字符串变量运算符和括号组成字符串的最大长度为512B
返回字符串长度运算符:LEN
字节整数转化为字符运算符:CHR
字符串转换运算符:STR
返回左端字符串运算符:LEFT
返回右端字符串运算符:RIGHT
合并字符串运算符:CC
(13)汇编语言程序设计结构
1)顺序程序设计
一条条指令执行下去。
2)分支程序设计
ARM分支程序设计通常用分支指令B加上条件执行来实现。
例:给0x30100000-0x30100003中a,b,c三个数排序

      AREA EXAMPLE2,COOE,READONLY
      ENTRY
      COOE32
CMPA  LDR R0,=0X30007000   ;指向首地址
      LDR R1,[R0]		   ;取第一个数a
      LDR R2,[R0+4]        ;取第二个数b   
      CMP R1,R2            ;第一个数与第二个数比较
      BHI NEXT1            ;a>=b?
      STR R2,[R0]          ;a,b交换
      STR R1,[R0+4]        ;a,b交换
NEXT1 LDR R1,[R0+4]        ;取中间的数
      LDR R2,[R0+8]        ;取第三个数
      CMP R1,R2            ;b>=c?
      BHI NEXT2            
      STR R2,[R0+4]        ;b,c交换
      STR R1,[R0+8]        ;b,c交换
NEXT2 LDR R1,[R0]
      LDR R2,[R0+4]
      CMP R1,R2            ;a>=b
      BHI NEXT3
      STR R2,[R0]		   ;a,b交换
      STR R1,[R0+4]		   ;a,b交换
NEXT3 MOV R1,0X0D
      STRBR1,[R0+0X0C]     ;0x0d写入0x300700c
      END

      

3)循环程序设计
循环结构一般是根据某一条件判断为真或假来判断是否重复执行循环体。
①由计数控制循环
用一个通用寄存器作为计数器,先给初始值,然后每循环一次减一,直到循环次数为零结束循环。
②由条件控制循环
有些情况不能预先知道循环次数,要通过一定的条件控制循环。
4)子程序设计
5)多段结构程序设计
6)c语言调用汇编语言
7)汇编语言调用c语言
8)c语言嵌入汇编语言

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐