什么是嵌入式系统?
 
ARM特点:
1、体积小、低功耗、低成本、高性能
2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件
3、大量使用寄存器,指令执行速度更快
4、寻址方式灵活简单,执行效率高
 
工作状态:
从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:
第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令。
第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。
 
当 ARM微处理器执行32位的ARM指令集时,工作在ARM状态;当ARM微处理器执行16位的Thumb指令集时,工作在Thumb状态。在程序的执行过 程中,微处理器可以随时在两种工作状态之间切换,并且,处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。
 
存储器格式:
ARM体系结构将存储器看作是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB。
 
ARM体系结构可以用两种方法存储字数据,称之为大端格式和小端格式。
大端格式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
 
指令长度:
ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在Thumb状态下)。ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型,其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0)。
 
工作模式:
ARM微处理器支持7种工作模式,分别为:
1、用户模式(Usr)
用于正常执行程序
2、快速中断模式(FIQ)
用于高速数据传输
3、外部中断模式(IRQ)
用于通常的中断处理
4. 管理模式(svc)
操作系统使用的保护模式
5. 数据访问终止模式(abt)
当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
6. 系统模式(sys)
运行具有特权的操作系统任务。
7. 未定义指令中止模式(und)
当未定义的指令执行时进入该模式,可用于支持硬件
 
ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。
应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。
 
除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式(Privileged Modes);其中除去用户模式和系统模式以外的5种又称为异常模式(Exception Modes),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。
 
寄存器
ARM微处理器共有37个32位寄存器,其中31个
为通用寄存器,6个为状态寄存器。但是这些寄
存器不能被同时访问,具体哪些寄存器是可以访
问的,取决ARM处理器的工作状态及具体的运行
模式。但在任何时候,通用寄存器R14~R0、程
序计数器PC、一个状态寄存器都是可访问的。
 
寄存器(ARM状态):
在ARM工作状态下,任一时刻可以访问16
个通用寄存器和一到两个状态寄存器。在
非用户模式(特权模式)下,则可访问到
特定模式分组寄存器, 具体见下页图:
ARM程序设计 - 兰花草 - 兰花草的博客
寄存器(Thumb状态):
Thumb状态下的寄存器集是ARM状态下
寄存器集的一个子集,程序可以直接访
问8个通用寄存器(R7~R0)、程序计
数器(PC)、堆栈指针(SP)、连接寄
存器(LR)和CPSR。 具体见下页图:
 
ARM程序设计 - 兰花草 - 兰花草的博客
 寄存器对应:
Thumb状态下的寄存器组织与ARM状态下的寄存器组织的
关系:
Thumb状态下和ARM状态下的R0~R7是相同的。
Thumb状态下和ARM状态下的CPSR和SPSR是相同的。
Thumb状态下的SP对应于ARM状态下的R13。
Thumb状态下的LR对应于ARM状态下的R14。
Thumb状态下的程序计数器PC对应于ARM状态下R15。
ARM程序设计 - 兰花草 - 兰花草的博客
 通用寄存器:
R0~R15
R13_svc、R14_svc
R13_abt、R14_abt
R13_und、R14_und
R13_irq、R14_irq
R8_fiq ~ R14_fiq
不分组寄存器(The unbanked registers)
R0-R7
分组寄存器(The banked registers)
R8-R14 
程序计数器:R15(PC)
 
R0-R7是不分组寄存器。这意味着在所有处
理器模式下,访问的都是同一个物理寄存
器。未分组寄存器没有被系统用于特别的用
途,任何可采用通用寄存器的应用场合都可
以使用未分组寄存器。
 
分组通用寄存器:
分组寄存器R8-R12:
1. FIQ模式分组寄存器R8-R12
2. FIQ以外的分组寄存器R8-R12
 
分组寄存器R13、R14:
1. 寄存器R13通常用做堆栈指针SP
2. 寄存器R14用作子程序链接寄存器(Link 
Register-LR),也称为LR,指向函数的返回
地址
 
寄存器R15被用作程序计数器,也称为
PC 。其值等于当前正在执行的指令的地
址+8(因为在取址和执行之间多了一个译码
的阶段)。
 
状态寄存器:
CPSR
SPSR_svc
SPSR_abt
SPSR_und
SPSR_irq
SPSR_fiq
ARM所有工作模式下都可以访问程序状态寄
存器CPSR。CPSR包含条件码标志、中断禁
止位、当前处理器模式以及其它状态和控制
信息。
 
CPSR在每种异常模式下都有一个对应的
物理寄存器——程序状态保存寄存器
SPSR。当异常出现时,SPSR用于保存
CPSR的值,以便异常返回后恢复异常发
生时的工作状态。
 
寻址方式:
所谓寻址方式就是处理器根据指令中
给出的地址信息来寻找物理地址的方
式。
 
立即寻址:
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操
作数本身就在指令中给出,只要取出指令也就取到了操作
数。这个操作数被称为立即数,对应的寻址方式也就叫做
立即寻址。
例如以下指令:
ADD R0,R0,#1 ;R0←R0+1
ADD R0,R0,#0x3f      ;R0←R0+0x3f
在以上两条指令中,第二个源操作数即为立即数,要求以
“#”为前缀,对于以十六进制表示的立即数,还要求在
“#”后加上“0x”或“&”。
 
寄存器寻址:
寄存器寻址就是利用寄存器中的数值作为操作
数,这种寻址方式是各类微处理器经常采用的
一种方式,也是一种执行效率较高的寻址方
式。
ADD      R0,R1,R2        ;R0←R1+R2
该指令的执行效果是将寄存器R1和R2的内容
相加,其结果存放在寄存器R0中。
 
寄存器间接寻址:
寄存器间接寻址就是以寄存器中的值作为操作数的地
址,而操作数本身存放在存储器中。例如以下指令:
ADD R0,R1,[R2]         
;R0←R1+[R2]
LDR          R0,[R1]         
;R0←[R1]
在第一条指令中,以寄存器R2的值作为操作数的地
址,在存储器中取得一个操作数后与R1相加,结果存
入寄存器R0中。第二条指令将以R1的值为地址的存储
器中的数据传送到R0中。
 
基址变址寻址
基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)
的内容与指令中给出的地址偏移量相加,从而得到一个操作数
的有效地址:
LDR R0,[R1,#4]       
;R0←[R1+4]
LDR R0,[R1,#4]!    ;R0←[R1+4]、R1←R1+4
LDR R0,[R1] ,#4       ;R0←[R1]、R1←R1+4
LDR R0,[R1,R2]         
;R0←[R1+R2]
 
多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传
送。这寻址方式可以用一条指令完成传送最多16个通用寄存器
的值。以下指令:
LDMIA  R0,{R1,R2,R3,R4}    ;R1←[R0]
                                                           ;R2←[R0+4]
                                                           ;R3←[R0+8]
                                                           ;R4←[R0+12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长
度增加,因此,指令可将连续存储单元的值传送到R1~R4。
 
相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器PC的当
前值为基地址,指令中的地址标号作为偏移量,将两者相加
之后得到操作数的有效地址。以下程序段完成子程序的调用
和返回,跳转指令BL采用了相对寻址方式:
BL      NEXT ;跳转到子程序NEXT处执行
……
NEXT
……
MOV  PC,LR        ;从子程序返回
 
堆栈寻址
堆栈是一种数据结构,按先进后出(First In 
Last Out,FILO)的方式工作,使用一个称作堆
栈指针的专用寄存器指示当前的操作位置,堆栈
指针总是指向栈顶。
递增堆栈:向高地址方向生长
递减堆栈:向低地址方向生长
满堆栈:堆栈指针指向最后压入堆栈的有效数据项
空堆栈:堆栈指针指向下一个要放入数据的空位置
posted on 2013-02-20 22:14  爱哎唉  阅读(183)  评论(0)    收藏  举报