ARM应用笔记.docx
《ARM应用笔记.docx》由会员分享,可在线阅读,更多相关《ARM应用笔记.docx(13页珍藏版)》请在冰豆网上搜索。
ARM应用笔记
ARM应用笔记
一、ARM体系结构
ARM是AdvancedRISCMachines的缩写,是一家微处理器行业的知名企业,设计了大量高性能、廉价、耗能低的RISC(精简指令集)处理器。
ARM公司只设计芯片,而不生产。
它技术授权给半导体、软件和OEM厂商,并提供服务。
ARM体系结构的目前7个版本:
ARMV1版架构:
只在原型机ARM1出现过,只有26位的寻址空间,没有用于商业产品。
ARMV2版架构:
对V1版进行了扩展,例如ARM2和ARM3(V2a)架构。
包含了对32位乘法指令和协处理器指令的支持。
同样为26位寻址空间,现在已经废弃不再使用。
ARMV3版架构:
1990年设计的第一个微处理器采用的是版本3的ARM6,作为IP核、独立的处理器、具有片上高速缓存、MMU和写缓冲的集成CPU,V3版架构(目前已废弃)对ARM体系结构作了较大的改动。
ARMV4版架构:
V4版架构在V3版上作了进一步扩充,V4版架构是目前应用最广的ARM体系结构,ARM7、ARM8、ARM9和StrongARM都采用该架构。
V4不再强制要求与26位地址空间兼容。
ARMV5版架构:
V5版架构是在V4版基础上增加了一些新的指令,ARM10和Xscale都采用该版架构。
ARMV6版架构:
V6版架构是2001年发布的,首先在2002年春季发布的ARM11处理器中使用。
在降低耗电量地同时,强化了图形处理性能。
ARMV7版架构:
ARMv7架构是在ARMv6架构的基础上诞生的。
该架构采用了Thumb-2技术,是在ARM的Thumb代码压缩技术的基础上发展起来的,并且保持了对现存ARM解决方案的完整的代码兼容性。
Thumb-2技术比纯32位代码少使用31%的内存,减小了系统开销,同时能够提供比已有的基于Thumb技术的解决方案高出38%的性能。
命名方式上,基于ARMv7架构的ARM处理器已经不再延用过去的数字命名方式,而是冠以Cortex的代呼。
基于v7A的称为“Cortex-A”,基于v7R的称为“Cortex-R”,基于v7M的称为“Cortex-M”。
体系结构
ARM核心
V1
ARM1
V2
ARM2
V2a
ARM2As,ARM3
V3
ARM6,ARM600,ARM610,ARM7,ARM700,ARM710
V4
StrongARM,ARM8,ARM810
V4T
ARM7TDMI,ARM710T,ARM720T,ARM740T
ARM9TDMI,ARM920T,ARM940T
V5TE
ARM9E-S,ARM10TDMI,ARM1020E
V6
ARM1136J(F)-S,ARM1176JZ(F)-S,ARM11MPCORE
V6T2
ARM1156T2(F)-S
V7
ARMCortex-M,ARMCortex-R,ARMCortex-A
二、ARM处理器
1、ARM7微处理器系列
低功耗的32位RISC处理器,冯·诺依曼结构。
极低的功耗,适合便携式产品。
能够提供0.9MIPS的三级流水线结构代码密度高,兼容16位的Thumb指令集。
主频最高可达130MIPS。
对操作系统的支持广泛,包括WindowsCE、Linux、PalmOS等。
指令系统与ARM9系列、ARM9E系列和ARM10E系列兼容,便于用户的产品升级换代。
主要应用领域:
工业控制、Internet设备、网络和调制解调器设备、移动电话等多种多媒体和嵌入式应用
2、ARM7TDMI微处理器
ARM7TMDI是使用广泛的32位嵌入式RISC处理器,属低端ARM处理器核。
注:
“ARM核”并不是芯片,ARM核与其它部件如RAM、ROM、片内外设组合在一起才能构成现实的芯片。
4种类型:
ARM7TDMI、ARM7TDMI-S、ARM720T、ARM7EJ。
3、ARM9微处理器系列
ARM9系列微处理器在高性能和低功耗特性方面提供最佳的性能。
5级整数流水线,哈佛体系结构。
支持32位ARM指令集和16位Thumb指令集。
全性能的MMU,支持WindowsCE、Linux、PalmOS等多种主流嵌入式操作系统。
主要应用:
无线设备、仪器仪表、安全系统、机顶盒、高端打印机、数码照相机和数码摄像机。
3种类型:
ARM920T、ARM922T和ARM940T。
4、ARM9E微处理器系列
单一处理器内核提供微控制器、DSP、Java应用系统的解决方案,支持DSP指令集。
5级整数流水线,指令执行效率更高。
支持32位ARM指令集和16位Thumb指令集。
支持VFP9浮点处理协处理器。
全性能的MMU,支持WindowsCE、Linux、PalmOS等多种主流嵌入式操作系统。
MPU支持实时操作系统。
支持数据Cache和指令Cache,主频最高可达300MIPS。
主要应用:
下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。
3种类型:
ARM926EJ-S、ARM946E-S和ARM966E-S。
5、ARM10E微处理器系列
与同等的ARM9比较,在同样的时钟频率下,性能提高了近50%,功耗极低。
支持DSP指令集。
6级整数流水线,指令执行效率更高。
支持32位ARM指令集和16位Thumb指令集。
支持VFP10浮点处理协处理器。
全性能的MMU,支持WindowsCE、Linux、PalmOS等多种主流嵌入式操作系统。
支持数据Cache和指令Cache。
主频最高可达400MIPS。
内嵌并行读/写操作部件。
主要应用:
下一代无线设备、数字消费品、成像设备、工业控制、通信和信息系统等领域。
3种类型:
ARM1020E、ARM1022E和ARM1026EJ-S。
6、ARM11微处理器系列
ARM1136J-S发布于2003年,针对高性能和高能效的应用而设计。
集成具有独立load-store和算术流水线的8级流水线。
可进行快速浮点运算,增加了向量浮点单元。
7、ARMCortex微处理器系列
(1)ARMCortex-M
ARMCortex-M3处理器是面向低成本,小管脚数目以及低功耗应用,且具有高运算能力和中断响应能力的处理器32位内核。
Cortex-m3处理器采用了纯Thumb-2指令。
中断延迟最大需12个周期(ARM7为24~42个)。
带睡眠模式,8段MPU(存储器保护单元)。
处理速度1.25MIPS/MHz(ARM7为0.9MIPS/MHz)。
功耗为0.19Mw/MHz(ARM7为0.28mW/MHz)。
目前最便宜的Cortex-M3内核的ARM单片机售价1美元。
(2)ARMCortex-R
ARMCortex-R系列处理器目前包括ARMCortexR4和ARMCortex-R4F两个型号,主要适用于实时系统的嵌入式处理器,如硬盘、打印机、汽车安全系统。
ARMCortexR4采用了90纳米生产工艺,最高运行频率可达400MHz。
基于低耗费的超量8段流水线,带有高级分支预测功能,运算速度超过1.6MPIS/MHz。
ARMCortex-R4F拥有针对汽车市场而开发的各项先进功能,包括自动除错功能、可相互连结的错误侦测机制,以及可选择优化的浮点运算单元(FPU,Floating-PointUnit)。
(3)ARMCortex-A
ARMv7-A系列支持大型嵌入式操作系统(Symbian、Linux、WinCE、WM等)。
典型应用:
高端手机、手持仪器。
ARMCortex-A8处理器是基于ARMv7架构的首款应用级处理器。
运算能力:
600MHz~1GHz。
具有13级整数运算流水线,10级NEON媒体运算流水线。
功耗最优的同时,实现2.0MIPS/MHz的性能。
三、Cortex-M3
8、特点
采用哈佛结构,有独立的指令总线I-Code和数据总线D-Code,具有带分支预测功能的3级流水线。
32位单周期乘法,支持硬件除法。
内核水平上支持低功耗模式,功耗低于0.19mW/MHz;
处理器直接支持8位字节、16位半字或者32位的数据类型。
3级流水线:
取指、译码、执行。
无论处理器处于何种状态,程序计数器R15(PC)总是指向“正在取指”的指令。
PC值=当前程序执行位置+4
9、寄存器
Cortex-M3处理器拥有22个用户可以访问的32位寄存器,包括R0~R15寄存器组合5个特殊功能寄存器。
其中R13作为堆栈指针SP,有两个寄存器。
通用寄存器R0~R12:
用于数据操作。
大部分16位Thumb指令只能访问R0~R7,32位的Thumb指令可访问所有寄存器。
堆栈指针R13(SP):
有两个堆栈指针,主堆栈指针(MSP,复位后默认的堆栈指针)和进程堆栈指针(PSP)。
连接寄存器R14(LR):
子程序的返回地址自动存入R14。
程序计数器R15(PC):
读PC时返回的地址时当前指令的地址+4
程序状态寄存器组(PSRs):
应用状态寄存器(APSR)、中断状态寄存器(IPSR)和执行状态寄存器(EPSR)。
中断屏蔽寄存器组:
中断屏蔽寄存器PRIMASK、FAULTMASK、优先级屏蔽寄存器BASEPRI,用于控制异常的使能和除能。
控制寄存器CONTROL:
定义特权级别或者选择当前的堆栈指针。
10、操作模式和特权级别
处理模式(Handlermode)和线程模式(Threadmode),用于区别普通应用程序和异常服务程序。
复位时处理器进入线程模式,异常返回后也进入该模式。
特权级和用户级的代码均可在线程模式下运行。
处理模式只能在出现异常时进入,且所有代码都特特权访问。
复位后,处理器进入线程模式和特权级访问。
特权级下,程序可以访问所有的存储器(如果有MPU,MPU规定的除外),并且可执行所有指令。
11、体系的异常、中断及向量表
嵌套向量中断控制器(NVIC,NestedVectoredInterruptControl)支持11中系统异常、240个外部中断输入和fault管理机制。
异常:
所有打断正常执行流的事件。
与“中断”经常混合使用。
“异常”一般是由Cortex-M3内核的活动(执行指令或访问存储器)产生的。
“中断”对于内核来说是“意外的突发事件”,请求信号一般来自内核的外部(片上外设或外扩的设备)。
系统异常是Cortex-M3内核支持的基本异常,与具体的芯片无关。
外部中断是与芯片相关的,芯片厂商根据需要和用途设计中断源数目(1~240)和优先级的位数。
异常发生且得到处理器响应,Cortex-M3硬件自动完成以下操作:
(1)入栈:
将8个寄存器的值压入堆栈
(2)取向量:
从向量表中取出对应异常服务程序的入口地址
(3)更新寄存器:
选择堆栈指针MSP/PSP,更新SP、LR、PC。
12、存储系统
Cortex-M3支持4GB的地址空间,程序可以在代码区、内部SRAM和外部RAM中运行。
(1)存储器格式
位于地址A的字包含的字节地址位于地址A、A+1、A+2和A+3
位于地址A的半字包含的字节位于地址A和A+1
位于地址A+2的半字包含的字节地址位于地址A+2、A+3
位于地址A的字包含的半字位于地址A和A+2
小端(Little-endian)存储器系统:
一个字当中最低地址的字节被看作是最低字节,最高地址的字节被看作是最高位字节。
Bit31-24
Bit23-16
Bit15-8
Bit7-0
字节格式
D[7:
0]
D[7:
0]
D[7:
0]
D[7:
0]
半字格式
D[15:
8]
D[7:
0]
D[15:
8]
D[7:
0]
字格式
D[31:
24]
D[23:
16]
D[15:
8]
D[7:
0]
大端(Big-endian)存储器系统:
处理器将最高位字节保存在最低地址,最低位字节保存在最高地址。
Bit31-24
Bit23-16
Bit15-8
Bit7-0
字节格式
D[7:
0]
D[7:
0]
D[7:
0]
D[7:
0]
半字格式
D[7:
0]
D[15:
8]
D[7:
0]
D[15:
8]
字格式
D[7:
0]
D[15:
8]
D[23:
16]
D[31:
24]
(2)位操作
位操作区:
支持位操作的地址区,包括两个地址范围:
0x20000000~0x200FFFFF(SRAM区最低1MB地址);0x40000000~0x400FFFFF(片上外设区最低1MB地址);
位别名区:
对应于位操作区映射的32MB地址区域,包括两个对应的地址范围:
0x22000000~0x23FFFFFC;0x42000000~0x43FFFFFC
位别名:
对位别名地址的访问最终会被变换成对应位操作区的位访问。
AliasAddr=BitAlias_BaseAddr+(BitAddr-BitOp_BaseAddr)*32+BitNumber*4
AliasAddr:
位别名区中的地址
BitAlias_BaseAddr:
位别名区的基地址,0x22000000或0x42000000
BitOp_BaseAddr:
位操作区的基地址,0x20000000或0x40000000
BitAddr:
位操作区中的字地址,将要操作的位在该字中
BitNumber:
要操作的位是第几位
(3)非对齐的存储器访问
对于字来说:
任何不能被4整除的地址都是非对齐的。
对于半字:
任何不能被2整除的地址都是非对齐的。
Cortex-M3支持在单一的访问中使用非对齐的传送。
处理器内部会对非对齐的访问转换成若干个对齐的访问,但是会浪费很多总线周期,影响程序执行效率。
因此建议C语言编程中定义的多字节变量或结构体都是对齐存放。
四、Cortex-M3指令系统
13、寻址方式
寄存器寻址
MOVR1,R2
SUBR0,R1,R2
立即寻址
SUBSR0,R0,#1
MOVR0,#0XFF000
寄存器移位寻址
MOVR0,R2,LSL#3
ANDSR1,R1,R2,LSLR3
寄存器间接寻址
LDRR1,[R2]
基址寻址
LDRR2,[R3,#0X0C]
STRR1,[R0,#-4]
多寄存器寻址
LDMIASP!
{R4-R11,PC}
STMIAR1!
{R3-R9}
堆栈寻址
向上生长:
递增堆栈
向下生长:
递减堆栈
满堆栈:
堆栈指针指向最后压入栈的有效数据项
空堆栈:
堆栈指针指向下一个待压入数据的空位置
STMDBSP!
{R1-R7,LR};入栈,满递减堆栈
LDMIASP!
{R1-R7,LR};出栈,满递减堆栈
相对寻址
由PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后的地址即为操作数的有效地址。
14、Thumb-2指令集
2.1指令格式
<指令助记符>{<执行条件>}{S}<目标寄存器>,<操作数1的寄存器>{,<第2操作数>}
{}{S},{,}
<>号内是必需的,{}号内是可选的。
2.2存储器访问指令
(1)LDR和STR------加载存储指令
LDR:
从存储器中读取数据放入寄存器;
STR:
将寄存器中的数据保存到存储器。
LDRR1,[R0,#0X12]
(2)LDM和STM------多寄存器加载存储指令
用于较大数据量的复制、参数传递等,实现在一组寄存器和一块连续的内存单元之间传输数据。
LDM{cond}<模式>Rn{!
},reglist
STM{cond}<模式>Rn{!
},reglist
模式说明:
IA:
每次传送后地址加4
DB:
每次传送前地址减4
FD:
满递减堆栈
EA:
空递增堆栈
“!
”表示最后的地址写回到Rn中。
2.3数据处理运算指令
(1)数据传送指令
MOVRd,operand2
MVNRd,operand2;加载一个数的反码值
MOVWR1,#0x1234;把16位立即数放到寄存器的低16位,高16位清零
MOVTR1,#0x5678;把16位立即数放到寄存器的高16位,低16位不变
CPYRd,Rn;寄存器间拷贝
(2)算术逻辑运算指令
加法:
ADC、ADD、ADDW
减法:
SBC、SUB、SUBW
移位:
LSL、LSR、ORR、EOR、AND、RRX、ROR、ORN、ASR、BIC
(3)位段处理指令
位段清零:
BFC
位段插入:
BFI
位反转:
RBIT
位段提取:
SBFX、UBFX
(4)字节序反指令
REV、REV16、REVSH
(5)带符号扩展指令
(6)比较指令
(7)乘除法和饱和运算指令
2.4分支转移指令
2.5杂项指令
2.6伪指令