培训体系ARM培训讲义提纲Word格式.docx
《培训体系ARM培训讲义提纲Word格式.docx》由会员分享,可在线阅读,更多相关《培训体系ARM培训讲义提纲Word格式.docx(44页珍藏版)》请在冰豆网上搜索。
3)操作系统:
产品的适合度、调试难度、代码结构、可开发潜力、移植可行性
4)编程语言:
高级语言、低级语言
5)软件开发工具:
系统调试功能如何、支持的库函数、开发商的软件支持
3.嵌入式处理器
在之上的讲义中我们简要提到了嵌入式开发的各方面的问题,接下来我们将从硬件开始讲解。
在嵌入式系统中,主要以ARM芯片作为该系统的核心芯片。
3.1.嵌入式处理器简介
ARM是AdvancedRISCMachines的缩写,ARM公司于1990成立,ARM以低成本、低功耗、高性能迅速占领了全球市场。
其产品广泛应用到移动通信、消费电子、以及嵌入式市场。
ARM公司不生产芯片,只是IP供应商,只做设计。
常见ARM处理器系列有:
ARM7系列、ARM9系列、ARM9E系列、ARM10系列、SecurCoreSC100、StrongARM、XScale。
在此,我们主要讲解ARM7系列、ARM9系列:
1)ARM7系列:
0.9MIPS/MHz3级流水、冯.诺依曼结构;
其内核主要有ARM7TDMI和ARM720T;
T:
支持16位THUMB指令,D支持在片调试,M增强型乘法器,产生全64位结果,I:
嵌入式ICE硬件提供片上断点和调试点支持
2)ARM9系列:
1.1MIPS/MHz5级流水、哈佛结构;
其内核主要有ARM920T、ARM722T和ARM940T;
3.2.基于ARM内核的芯片扩展
由于ARM公司只做IP,不生产具体的芯片;
所以我们所使用的ARM芯片都是全世界其他硬件芯片厂商在经过ARM公司的授权,然后在此基础上进行硬件扩展,以满足不同领域的需求。
ARM9系列是当今嵌入式系统应用的主流芯片内核技术。
全世界各大厂商都采用ARM公司的IP来开发自己的ARM芯片,主要厂商有:
三星、AD、TI、菲利普、Intel、CIRRUSLOGIC等。
下面,我们以三星公司的ARM芯片S3C2410X为例来简要介绍基于ARM内核的芯片扩展。
注意:
ARM9系列是兼容ARM7系列的。
3.3.ARM920T内核详解
当下基于ARM920T内核的芯片逐渐成为嵌入式系统芯片的主流,我们有必要详解其结构;
这是进一步学习软件开发的基础。
内核的结构图如下所示:
下面我们将重点介绍ARM920T的协处理器CP15和内存管理单元MMU
3.3.1.协处理器CP15
3.3.2.内存管理单元MMU
4.软件开发
嵌入式系统的软件开发包括:
操作系统和应用程序开发俩个方面。
下面我们进一步讲解基于ARM芯片的汇编语言。
4.1.ARM编程模型
ARM常见版本是V4和V5,当下主要用的是V4,
处理器工作状态:
ARM,THUMB
开关状态:
进入THUMB状态、进入ARM状态
存储器格式:
大小端点格式
指令长度:
32位、16位
数据类型:
字,半字,字节
操作模式:
7种
寄存器:
31个通用寄存器和6个状态寄存器
中断:
4.2.ARM基本寻址方式
寄存器寻址:
立即寻址:
寄存器移位寻址:
寄存器间接寻址:
变址寻址:
多寄存器寻址:
堆栈寻址:
块拷贝寻址:
相对寻址:
4.3.ARM指令集
本章内容是详细讲解ARM指令集。
4.3.1.ARM指令格式
1.指令集格式:
ARM指令集格式如下表4-1所示:
表4-1:
ARM指令集格式
某些指令码没有定义,但且不导致未定义指令陷阱出现,例如一个乘法指令的第6位变为1。
不应使用这些指令,因为它们的作用也许会由未来的ARM执行
2.ARM指令集表:
下面表4-2、表4-3列出了ARM指令集:
表4-2:
ARM指令集
表4-3:
3.条件码:
在ARM状态下,所有指令都会根据CPSR条件码和指令条件域的状态被有条件地执行。
该域(位31:
28)决定了执行一条指令的环境。
如果C、N、Z和V标志的状态满足该域的编码条件,指令就被执行,否则不予执行。
存在着16个可能条件,每种由复加在指令记忆符后的一个双字符后缀表示。
例如,Branch(B为汇编语言)变为BEQ表示“BranchifEqual”,意思是当Z标志被置位时执行Branch指令。
实际上,表3-2中所列的15个不同的条件也许会用到,第16个(1111)保留,不能使用。
在后缀缺省时,大多数指令的条件域被设置成“Always”(后缀AL)。
这意味着不管CPSR的条件码是什么,指令永远被执行。
下表4-4给出了条件码概况:
表4-4:
ARM指令中的条件码
4.3.2.ARM指令集详解
★★1分支和交换(BX指令,Branch和Exchange指令):
该指令仅仅在条件为真时被执行,参见表4-4。
该指令通过将一个通用寄存器Rn的内容复制到程序计数器PC来执行一个分支。
这个分支会引起管道流,且会根据Rn指定的地址再入。
该指令也允许交换指令集。
当执行该指令时,Rn[0]的值决定了是否按照ARM指令仍是THUMB指令对指令流进行解码。
指令格式如下图4-1所示:
图4-1:
BX指令格式
★指令循环时间:
执行BX指令占用2S+1N周期(和BL一样),这里S和N分别代表连续(S周期)和非连续(N周期)。
★汇编程序语法:
BX-分支和交换指令
BX{cond}Rn;
{cond}为双字母条件记忆符(即条件码),见表4-4,而Rn表示一个有效寄存器(比如:
R0)
★使用R15作操作数:
如果将R15作操作数,该情况未定义。
例:
ADRR0,Into_THUMB+1;
产生分支目标地址,bit0置位,进入THUMB状态
BXR0;
分支且改变到THUMB状,R15(PC):
=R0
CODE16;
汇编作为THUMB指令的后续码
Into_THUMB
ADRR5,Back_to_ARM;
产生分支目标到字排列地址,bit0置低,变回到ARM
BXR5;
分支且变回到ARM状态,R15(PC):
ALIGN;
字排列
CODE32;
汇编作为ARM指令的后续码
Back_to_ARM
★★2分支和带链接分支(B、BL)
该指令的编码如下图4-2所示。
图4-2:
B、BL指令格式
分支指令包含有一个有符号的2态补充24位偏移(相当于25根地址线+符号位,即+/-32M字节)。
这被左移俩位,符号扩展至32位,且加到程序计数器PC。
因此该指令能够指定+/-32M字节的分支。
该指令偏置必须考虑预取操作,它会引起程序计数器PC超前当前指令2个字(8个字节)。
超过+/-32M字节的分支必须使用偏置或事先装入寄存器的绝对目标。
在这种情况下,如果要求有带链接类型的分支操作,应当将PC值人工存入R14。
★链接位:
带链接的分支(BL)将旧的PC写入当前存储空间的链接寄存器(R14)。
写入R14的值被调整到允许预取,且包含紧跟着“分支和链接指令”的指令地址。
注意CPSR不保留PC值,R14[1:
0]总是清零。
从带链接的分支返回,如果链接寄存器仍然有效,可使用MOVPC,R14;
或如果链接寄存器以被Rn存作堆栈指针,使用LDMRn!
{..PC}。
分支和带链接分支指令占用2S+1N增加的周期(和BX一样),这里S和N分别代表连续(S周期)和内部(I周期)。
{}中的内容任意,<
>
中的内容必须出现
B{L}{cond}<
expression>
{L}常用请求带链接分支的指令形式。
如果缺省,R14不受指令影响,即不将旧的PC值存入R14。
{cond}如表4-4中所示的双字母助记符(条件码),如果缺省,默认为AL(Always)。
<
目标单元,汇编程序计算偏移量。
例
hereBALhere;
等待,指令汇编成0xEAFFFFFE
Bthere;
等待,默认条件是“Always”
CMPR1,#0;
R1=0?
比较
BEQfred;
为零,则跳转;
反之,继续下一个指令
BLsub+ROM;
跳转,调用子程序
ADDSR1,#1;
R1=R1+1,设置CPSR标志
BLCCsub;
C=0,调用子程序
★★3数据处理:
数据处理指令仅在条件为真时被执行,参见表4-4。
该指令编码如下图4-3所示。
图4-3:
数据处理指令
该指令通过对一或俩个操作数进行指定的算术或逻辑运算产生结果。
第一个操作数总是一个寄存器(Rn)。
根据指令中L(即D25)位的值,第二个操作数可能是一个移位寄存器(Rm)或一个8位循环立即数(Imm)。
根据指令中S位的值,确定该指令的结果是否能够保护或更新CPSR中的条件码。
确定的运算(TST(OP1和OP2)、TEQ(OP1异或OP2)、CMP(OP1-OP2)、CMN(OP1+OP2))不将结果写入Rd。
它们只用执行检测和设置结果中的条件码且总对S位置位。
★CPSR标志:
数据处理运算可分为逻辑运算和算术运算,逻辑运算(AND、EOR、TST、TEQ、ORR、MOV、BIC、MVN)对操作数的所有相应位或产生结果的操作数执行逻辑运算。
如果S位被置位(且且Rd不是R15,见下表),则CPSR中的V标志不受影响,C标志将被置位来执行barrelshifter(或当移位操作为LSL#0时保护),Z标志当且仅当结果全零时被置位,N被置为结果bit31的逻辑值。
ARM数据处理指令见下表4-5
表4-5:
算术运算(SUB、RSB、ADD、ADC、SBC、RSC、CMN)将每个操作数都见作是一个32位的整数(无符号或俩个独立的符号,俩种情况时一样的)。
如果S位被置位(且且Rd不是R15),则CPSR中的V标志在结果的bit31出现溢出时被置位,如果操作数均为无符号数能够不理会,但如果操作数为俩个独立的有符号数则会发出错误提示,C标志会由于执行ALU的bit31被置位,Z标志当且仅当结果全零时被置位,N标志被置为结果bit31的值(如果认为操作数为俩个独立的有符号数时指示结果为负)。
★移位:
当第二个操作数被指定为移位寄存器时,寄存器的移位操作受指令中的移位域控制。
该域指示要执行的移位类型(逻辑左移或右移、算术右移或循环右移)。
寄存器要移动的值可包含在指令的立即域中,或者在另一个寄存器(除了R15)。
不同移位类型的编码如图4-4所示。
图4-4:
ARM移位操作
★指定偏移量指令:
当指令中指定了偏移量时,它包含了一个5位的区域,其赋值范围为0~31。
逻辑左移(LSL)获取Rm的内容且将每一位移动指定量到更有意义的位置。
结果的最不重要位以零填充,Rm的最高位被丢弃,且不映射到结果中,除非当ALU运算处于逻辑状态(见上面)时,丢弃的最不重要的位变为shifter的进位输出,且可能锁定CPSR的S位。
例如,LSL#5的影响如下图4-5所示。
图4-5:
逻辑左移
LSL#5是一个特例,这里shifter进位输出是CPSRC标志的过去值。
Rm的内容被直接用作第二个操作数。
逻辑右移(LSR)指令类似,可是Rm的内容被移到结果最不重要的位置。
LSR#5的影响如下图4-6所示。
图4-6:
逻辑右移
此种移位使得Rm的第31位有零进位输出。
和逻辑左移零一样,逻辑右移零是多余的,所以汇编程序将LSR#0(以及ASR#0和ROR#0)转换成LSL#0,且允许指定LSR#32。
算术右移(ASR)和逻辑右移类似,不同的是高位被Rm的bit31填充而不是零。
这保护了2个独立符号状态中的符号,例如,ASR#5如下图4-7所示。
图4-7:
算术右移
此种移位使得Rm的bit31重新用作进位输出,且且操作数2的每一位也等于Rm的bit31。
所以根据Rm的bit31的值,结果为全1或全0。
循环右移(ROR)操作是将逻辑右移操作中移出去的位再引入放置在结果的高端,在逻辑右移中常用零来填充高位。
例如,ROR#5如下图4-8所示。
图4-8:
循环右移
期望给ROR#0的移位域形式用于对barrelshifter的特殊功能,即带扩展的循环右移编码。
这个循环右移是它使用附加的CPSR的C标志来提供一个要被移位的33位的数量到Rm内容的最高端,参见下图4-9。
图4-9:
带扩展循环右移
★指定偏移量寄存器
只有Rs的最低端字节被用来确定偏移量。
Rs能够是除R15外的任何寄存器。
如果该字节为零,Rm未改变的内容将被当作第二操作数,且且旧的CPSR的C标志值将会被作为shifter的进位输出。
如果1到31位之间字节有值,移位结果将和指定移位指令的同一个值和移位操作匹配。
如果字节中的值大于等于32,结果为上面所述移位的逻辑扩展:
1.LSL32结果为零,进位输出等于Rm的0位;
2.LSL大于32结果为零,进位为零;
3.LSR32结果为零,进位输出等于Rm的31位;
4.LSR大于32结果为零,进位为零;
5.ASR大于等于32结果和进位等于Rm的31位;
6.ROR32结果等于Rm,进位等于Rm的31位;
7.RORn结果和进位和RORn-32相同,这里n大于32;
因此不断从n中减去32,直到n值在1~31之间,见前面。
必须使带有控制移位寄存器指令的bit7为零,该位为1会引起指令为乘或未定义。
★立即数循环:
立即数循环域是一个4位无符号整数,指定对8位立即数进行移位操作。
该值为扩展到32位的零,然后通过在循环域中的俩倍值服从右移。
这能够产生许多常数,例如2的幂。
★写入R15
当Rd为除R15外的寄存器时,CPSR中的条件码标志能够从前面所述的ALU标志更新。
当Rd为R15且且指令中的S标志未置位时,操作结果被放入R15且CPSR不受影响。
当Rd为R15且S标志置位时,操作结果被放入R15,对应于当前模式的SPSR被移入CPSR。
这允许自动存储PC和CPSR的状态改变。
这种指令格式在用户模式下不能使用。
★用R15作操作数
如果R15(PC)被用于数据处理指令中的一个操作数,可直接使用该寄存器。
PC值就是指令地址、加上由于指令预取的8或12个字节。
如果指令中指定了移位量,PC为前8个字节。
如果用寄存器指定移位量,则PC为前12个字节。
★TEQ、TST、CMP和CMN操作码:
TEQ、TST、CMP和CMN不写结果操作结果但置位CPSR中的标志位。
即使助记符中没有指定,汇编程序也应当总将这些指令的S标志置位。
不能使用TEQP指令,它是早期ARM处理器使用的TEQ指令:
代替PSR转移操作。
在ARM920T中TEQP的功能是:
如果处理器工作在特许模式就将SPSR_<
mode>
移入CPSR,如果在用户模式什么也不做。
指令周期:
数据处理指令增加的周期数如下表4-6:
表4-6:
增加的循环时间
注:
S、N和I分别定义为顺序(S-周期)、非顺序(N-周期)和内部(I-周期)。
汇编程序句法
MOV,MVN(单操作数指令).
opcode>
{cond}{S}Rd,<
Op2>
CMP,CMN,TEQ,TST(无结果指令).
{cond}Rn,<
AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,ORR,BIC
{cond}{S}Rd,Rn,<
这里:
Rm{,<
shift>
}或,<
#expression>
{cond}双字母条件助记符,见表4-4
{S}如果S表示(指CMP,CMN,TEQ,TST),置位条件码.
Rd,Rn和Rm寄存器号表达式
如果使用,汇编程序将会产生一个移位的立即8位域来匹配表达式,如果不用会出错
<
Shiftname>
<
register>
或<
shiftname>
#expression,或RRX(带扩展右移1位).
sASL,LSL,LSR,ASR,ROR.(ASL和LSL意义相同,它们的汇编码一样)
ADDEQR2,R4,R5;
如果Z标志置位,使R2=R4+R5
TEQSR4,#3;
测试R4等于3(S是多余的,由汇编程序自动插入)
SUBR4,R5,R7,LSRR2;
通过R2底部字节数逻辑右移R7,从R5中减去结果,且
;
将答案放入R4
MOVPC,R14;
从子程序返回
MOVSPC,R14;
从中断返回,且从SPSR方式保存CPSR
★★4PSR转移(MRS、MSR):
该指令仅当条件为真时执行,参见表4-4。
MRS和MSR指令来自于数据处理操作的子集,且用TEQ、TST、CMN和CMP指令执行,不置位S标志,编码参见下图4-10。
这些指令允许对CPSR和SPSR寄存器存取。
MRS指令允许将CPSR或SPSR_<
的内容移入通用寄存器。
MSR指令允许将通用寄存器的内容移入CPSR或SPSR_<
寄存器。
MSR指令也允许将一个立即数或寄存器内容转移到CPSR或SPSR_<
寄存器的条件码标志(N、Z、C和V)而不改变控制位。
在这种情况下,指定的寄存器内容的高4位或32位立即数被写入相应PSR(程序状态寄存器)的高4位。
★操作数限制:
在用户模式,CPSR的控制位受保护,所以只有CPSR的条件码标志能够改变。
在其它(特许)模式,整个CPSR均可改变。
软件决不能改变CPSR中T位的状态。
如果出现这种情况,处理器将进入无法预料的状态。
存取的SPSR寄存器取决于执行时的方式。
例如,当处理器在FIQ模式时,只有SPSR_fiq是可存取的。
不能将R15指定为源或目的寄存器。
在用户模式下不能存取SPSR,因为该寄存器不存在(用户不能使用)。
图4-10:
MRS、MSR指令格式
保留位:
ARM920T中只定义了PSR的12个位(N、Z、C、V、I、F、T和M[4:
0]),其余位保留为将来的处理器使用。
为确保ARM920T和将来处理器之间的最大兼容性,应当遵守下列原则:
当改变PSR的值时,应当保护保留位;
当检查PSR状态时,程序不应当依赖保留位的特定值,因为将来的处理器可能会将它们认作1或0。
下列顺序完成模式改变:
MRSR0,CPSR;
复制CPSR
BICR0,R0,#0x1F;
模式位清零,即将CPSR.M[4:
0]清零
ORRR0,R0,#new_mode;
选择新模式
MSRCPSR,R0;
回写修改后的CPSR
当目的只是简单地改变PSR中的条件方式码时,可直接将值写入标志位而不必影响控制位。
下列指令对N、Z、C和V标志置位:
MSRCPSR_flg,#0xF0000000;
对所有标志位置位,不考虑它们的过去状态(不影响控制位)
不要试图向整个PSR写入8位立即数,因为这种操作不保护保留位。
★指令循环周期:
PSR转移占用1S增加的周期,这里S定义为顺序(S-周期)。
汇编语言句法:
MRS–将PSR内容转移到寄存器
MRS{cond}Rd,<
psr>
MSR–将寄存器内容转移到PSR
MSR{cond}<
Rm
MSR–只将寄存器内容转移到PSR标志位
psrf>
寄存器内容最重要的4位分别写入N、Z、C和V标志。
MSR–只将立即数转移到PSR标志位
<
应当用符号表示分别写入N、Z、C和V标志的最重要4位的32位数值。
★关键:
{cond}双字母条件助记符,见表4-4
RdandRm除R15外的寄存器表达式
CPSR,CPSR_all,SPSR或SPSR_all.(CPSR和CPSR_all和SPSR和SPSR_all意义相同)
CPSR_flg或SPSR_flg
在用户模式,指令表现为:
MSRCPSR_all,Rm;
CPSR[31:
28]<
-Rm[31:
28]
MSRCPSR_flg,Rm;
MSRCPSR_flg,#0xA0000000;
-0xA(setN,C;
clearZ,V)
MRSRd,CPSR;
Rd[31:
0]<
-CPSR[31:
0]
在特许模式,指令表现为:
MSRCPSR_flg,#0x50000000;
CPSR[3