ARM处理器工作模式Word下载.docx
《ARM处理器工作模式Word下载.docx》由会员分享,可在线阅读,更多相关《ARM处理器工作模式Word下载.docx(101页珍藏版)》请在冰点文库上搜索。
用于虚拟存储及存储保护
未定义指令中止模式(Undefin-ed,und)
用于支持通过软件仿真硬件的协处理器
系统模式(System,sys)
用于运行特权级的操作系统任务
除了用户模式以外,其他6种处理器模式可以称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。
其中除了系统模式外的其他5种特权模式又称为异常模式。
处理器模式可以通过软件来切换,在ARMLinux操作系统中,只有运行在内核态的程序才有可能更改处理器模式,用户态的程序是不能访问受操作系统保护的系统资源的,更不能直接进行处理器模式的切换。
当需要处理器模式切换的时候,用户态的程序可以中断,内核态的中断处理程序开始响应并做出处理。
以上7种模式对应了系统中的中断向量表,这在移植操作系统的时候很重要。
系统中所有的调度都是围绕着中断向量表展开的,在不用操作系统的系统中也就是通常所谓的裸机系统程序中,对于中断向量表的处理也很关键。
这个向量表一般加载在CPU复位执行的开始地址的一段空间。
在ARMLinux操作系统中,BootLoader程序的移植中需要考虑这些问题,而一旦BootLoader移植成功,运行起来以后,开发人员就不需要再考虑这个问题了。
1.4.3
ARM寄存器介绍
在移植操作系统的时候,尤其是在移植BootLoader的时候必须了解ARM处理器的寄存器。
在BootLoader里有一段很重要的处理器初始化程序是用ARM汇编写的,有几个关键参数需要传递,关于这些参数在后面介绍BootLoader时会有详细的描述。
ARM处理器含有37个寄存器,这些寄存器包括以下两类寄存器。
(1)31个通用寄存器:
包括程序计数器PC等,这些寄存器都是32位寄存器。
(2)6个状态寄存器:
状态寄存器也是32位的寄存器,但是只使用了其中的12位。
1.通用寄存器
在ARM处理器的7种模式下都有一组对应的寄存器组。
在任意时刻,可见的寄存器组包括15个通用寄存器R0~R14、一个或两个状态寄存器和PC。
在所有的寄存器中,有些是各种模式下共用的同一个物理寄存器,有些是各种模式自己独立拥有的物理寄存器。
详细如表1-3所示。
表13
ARM物理寄存器
用户模式
系统模式
特权模式
中止模式
未定义指令模式
外部中断模式
快速中断模式
R0
R1
R2
R3
R4
R5
R6
R7
R8
R8_fiq
R9
R9_fiq
R10
R10_fiq
R11
R11_fiq
R12
R12_fiq
R13
R13_svc
R13_abt
R13_und
R13_irq
R13_fiq
R14
R14_svc
R14_abt
R14_und
R14_irq
R14_fiq
PC
CPSR
SPSR_svc
SPSR_abt
SPSR_und
SPSR_irq
SPSR_fiq
通用寄存器通常又可以分为下面3类。
n
未备份寄存器:
包括R0~R7。
备份寄存器:
包括R8~R14。
程序计数器PC:
即R15。
1)未备份寄存器R0~R7
对于每个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器,在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏。
未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未备份寄存器。
2)备份寄存器R8~R14
备份寄存器中的每个寄存器对应于两个不同的物理寄存器。
例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记做R8_fiq和R9_fiq,当使用用户模式下的寄存器时,寄存器R8和寄存器R9分别记做R8_usr和R9_usr等。
在这两种情况下使用的是不同的物理寄存器,系统没有将这几个寄存器用于任何的特殊用途。
中断处理非常简单,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程很迅速。
对于备份寄存器R13、R14来说,每个寄存器对应于6个不同的物理寄存器,其中的一个是用户模式和系统模式共用的,另外的5个则对应于其他5种处理器模式,采用下面的方法来标识。
R13_mode,其中mode是usr、svc、abt、und、irq和fiq的一种。
R13通常用做堆栈指针。
每一种模式都拥有自己的物理R13。
程序初始化R13,使其指向该模式专用的栈地址。
当进入该模式时,可以将需要使用的寄存器保存在R13所指的栈中,当退出该模式时,将保存在R13所指的栈中的寄存器值弹出。
这样就实现了程序的现场保护。
寄存器R14又被称为连接寄存器(LR),在ARM中有下面两种特殊用途。
①每一种处理器模式在自己的物理R14中存放当前子程序的返回地址。
当通过BL或者BLX指令调用子程序时,R14被设置成该子程序的返回地址。
在子程序中,当把R14的值复制到程序计数器PC中时,就实现了子程序返回。
具体的汇编调用方式是:
MOVPC,LR或BXLR。
②当发生异常中断的时候,该模式下的特定物理R14被设置成该异常模式将要返回的地址。
3)程序计数器PC→R15
由于ARM处理器采用的是流水线机制,当正确地读取了PC值时,该值为当前指令地址值加8字节。
也就是说对于ARM指令来说,PC指向当前指令的下两条指令的地址,由于ARM指令是字对齐的,PC值的第0位和第1位总是为0。
当成功地向PC写入一个地址数值时,程序将跳转到该地址执行。
在ARM系统进行代码级调试时对于R13、R14及PC的跟踪很重要,可以用来分析系统堆栈及PC指针值的变化等。
2.程序状态寄存器
CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。
每一种模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。
当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。
在异常退出时,可以用SPSR中保存的值来恢复CPSR。
CPSR的具体格式如下。
31
30
29
28
27
26
7
6
5
4
3
21
N
Z
C
V
Q
DNMLRAZ
I
F
M4
M3
M
M0
1)条件标志位
N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。
大部分的ARM指令可以依据CPSR中的这些标志位来选择性地执行。
各条件标志位的具体含义,如表1-4所示。
表14
CPSR标志位含义
标
志
位
含
义
本位设置成当前指令运算结果的bit[31]的值
当两个补码表示的有符号整数运算时,N=1表示运算的结果为负数,N=0表示结果为正数或零
Z=1表示运算结果是0,Z=0表示运算结果不是零
对于CMP指令,Z=1表示进行比较的两个数大小相等
在加法指令中(包括比较指令CMN),结果产生进位了,则C=1,表示无符号数运算发生上溢出,其他情况下C=0
在减法指令中(包括比较指令CMP),结果产生借位了,则C=0,表示无符号数运算发生下溢出,其他情况下C=1
对于包含移位操作的非加/减法运算指令,C中包含最后一次被溢出的位的数值,对于其他非加/减法运算指令,C位的值通常不受影响
对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
其他的指令通常不影响V位
2)Q标志位
在ARMv5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的DSP指令是否发生了溢出,同样的,SPSR的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。
3)CPSR中的控制位
CPSR的低8位I、F、T及M[4:
0]统称为控制位,当异常中断发生时这些位发生变化。
在特权级的处理器模式下,软件可以修改这些控制位。
①I中断禁止位
当I=1时禁止IRQ中断。
当F=1时禁止FIQ中断。
通常一旦进入中断服务程序可以通过置位I和F来禁止中断,但是在本中断服务程序退出前必须恢复原来I、F位的值。
②T控制位,用来控制指令执行的状态,即说明本指令是ARM指令还是Thumb指令。
对于不同版本的ARM处理器,T控制位的含义是有些不同的。
对于ARMv3及更低的版本和ARMv4的非T系列版本的处理器,没有ARM和Thumb指令的切换,所以T始终为0。
对于ARMv4及更高版本的T系列处理器,T控制位含义如下。
当T=0,表示执行ARM指令。
当T=1,表示执行Thumb指令。
对于ARMv5及更高的版本的非T系列处理器,T控制位的含义如下。
当T=0表示执行ARM指令。
当T=1表示强制下一条执行的指令产生为定义指令中断。
③M控制位
控制位M[4:
0]称为处理器模式标识位,具体说明如表1-5所示。
表15
CPSR处理器模式位
M[4:
0]
可访问的寄存器
0b10000
User
PC,R14~R0,CPSR
0b10001
FIQ
PC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq
0b10010
IRQ
PC,R14_irq~R13_irq,R12~R0,CPSR,SPSR_irq
0b10011
Supervisor
PC,R14_svc~R13_svc,R12~R0,CPSR,SPSR_svc
0b10111
Abort
PC,R14_abt~R13_abt,R12~R0,CPSR,SPSR_abt
0b11011
Undefined
PC,R14_und~R13_und,R12~R0,CPSR,SPSR_und
0b11111
System
PC,R14~R0,CPSR(ARMv4及更高版本)
CPSR的其他位用于将来ARM版本的扩展,程序可以先不操作这些位。
1.4.4
ARM体系结构的异常中断
ARM体系结构中的异常中断是ARM处理器的核心,而对于异常中断的处理则是嵌入式操作系统的核心。
一般来说ARM体系结构中程序的执行通常由以下3种方式来控制。
在正常程序执行时,每执行一条ARM指令,PC的值加4字节,每执行一条Thumb指令,PC加2字节,整个过程是按顺序执行。
通过跳转指令,程序可以跳到特定的地址标号执行,或者跳转到特定的子程序处执行。
常用的跳转指令有B、BL、BX、BLX等。
当异常中断发生时,系统执行好当前指令后,跳转到相应的异常中断处理程序处执行。
当异常中断执行后,程序返回到发生中断指令的下一条指令处执行。
当然这里需要注意程序现场的保护和恢复。
ARM体系结构中异常中断的种类,具体如表1-6所示。
表16
ARM异常中断
异常中断名称
复位(Reset)
当处理器复位引脚有效时,系统产生复位,程序跳转到复位异常中断处理程序处执行,复位异常中断的优先级是最高优先级的中断。
通常复位产生有下面几种情况:
系统加电时、系统复位时、各种不同的ARM处理器的复位有一些区别的,具体的参见后面的实例中的描述
未定义的指令
Undefinedinstruction
当ARM处理器或者系统中的协处理器认为当前指令未定义时,产生该中断,可以通过该异常中断仿真浮点向量运算
软件中断
SoftwareInterruptSWI
这是由用户定义的中断指令,可用于用户模式下的程序调用特权操作指令
数据访问中止
DataAbort
数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常中断
外部中断请求
当处理器的外部中断请求引脚有效,或者CPSR寄存器的I控制位被清除时,处理器产生外部中断请求,应用中对于IRQ的中断处理是比较关键的技术
快速中断请求
当处理器的外部中断请求引脚有效,或者CPSR寄存器的F控制位被清楚时,处理器产生外部中断请求
ARM处理器对异常中断的响应过程是首先保存处理器当前状态、中断屏蔽位及CPSR寄存器中的各个条件标志位。
这是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中实现的。
其次设置当前程序状态寄存器CPSR中相应的位。
再次将寄存器LR_mode(R14_mode)设置成返回地址。
最后将PC设置成该异常中断的中断向量地址,从而跳转到对应的中断处理程序处执行。
ARM处理器从异常中断程序中返回的过程:
首先恢复被中断程序的处理器状态,也就是将SPSR_mode内容复制到CPSR。
然后返回到发生异常中断指令的下一条指令处执行,即将LR_mode(R14_mode)寄存器的内容复制到PC中。
1.4.5
ARM体系结构中的存储系统
在介绍ARM体系结构中的存储系统之前,先简单介绍一下ARM编程模型中与存储系统相关的一些概念。
ARM体系结构使用单一的平板地址空间,该地址空间的范围大小为232个8位字节。
这些字节单元的地址是一个无符号的32位数值,其取值范围为0~232-1。
有了存储系统的寻址范围之后,还需要讨论一下实际存储系统中的大/小端格式及ARM体系结构中的MMU等概念。
1.ARM存储系统中的大/小端
在ARM体系结构中,每个字单元包含4字节单元或者2个半字单元,1个半字单元包含2字节单元。
但是在字单元中,4字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式,通常称为大端格式或者小端格式,也就是big-endian格式和little-endian格式。
大/小端的选择对于不同的芯片来说有一些不同的选择方式,一般都可以通过外部的引脚或内部的寄存器来选择。
具体要参见处理器的数据手册。
在大端模式下的存储格式如下所示。
31
2423
1615
87
0
字单元A
半字单元A
半字单元A+2
字节单元A
字节单元A+1
字节单元A+2
字节单元A+3
而在小端模式下的存储格式如下所示。
2423
非对齐的存储访问操作:
在ARM体系结构中通常希望字单元的地址是字对齐的(地址的低两位是0b00),半字单元的地址是半字对齐的(地址的最低位为0b0),但在存储单元中地址没有遵守上述的对齐规则,称为非对齐的存储访问操作,在ARM体系结构的伪指令集中有专门的align指令来指定对齐格式。
在ARM体系结构中允许指令预取,在CPU执行当前代码的同时,可以从存储器中预取其后若干条指令,具体预取多少条指令则由不同的ARM处理器内核的实现来决定。
2.ARM体系结构中的MMU
另外一个重要的概念就是MMU(MemoryManagerUnit)。
ARM存储系统的体系结构适应不同的嵌入式系统应用,它的差别很大。
最简单的存储系统使用平板式的地址映射机制,地址空间的分配是固定的,系统中各部分都使用物理地址,这样的处理器不带MMU。
而一些复杂的系统可能包含一种或多种下面提到的技术,从而提供功能更为强大的存储系统。
(1)系统中可能包含多种类型的存储器件,一般都有Flash、SRAM、SDRAM等接口。
(2)使用指令/数据cache及WriteBuffer技术缩小处理器和存储系统速度差别,从而提高系统的整体性能。
(3)系统中包含有MMU单元。
MMU使用内存映射技术实现虚拟空间到物理空间的映射,这种映射机制对于嵌入式系统尤其重要。
通常程序放在ROM/Flash中,这样系统掉电后程序能够保存。
但是ROM/Flash比SDRAM速度慢很多,而且在嵌入式系统中,中断向量表存放在RAM中,不过利用内存映射就可以解决这种问题。
在系统加电时将ROM/Flash地址映射到
0x00000000,在0x00000000地址处存放启动代码,来完成系统设备的初始化,之后再把内核程序加载到SDRAM,然后把地址映射到SDRAM的地址,跳转到SDRAM地址运行就可以了。
针对具有MMU的ARM处理器可以移植LinuxforARM操作系统,针对没有MMU的处理器,一般都是移植uClinuxforARM。
比如说Samsung公司的S3C4510、S3C2510都是不带MMU的处理器,只能移植uClinux,而针对S3C2410、PXA27x、OMAP591x等带有MMU单元的ARM处理器通常都可以移植Linux操作系统。
带有MMU的处理器内部都有用于存储管理的系统控制协处理器CP15,在移植嵌入式操作系统的BootLoader时,必须要对存储管理单元进行初始化设置。
3.快速上下文切换技术
FCSE(FastContextSwitchExtension)技术通过修改系统中不同进程的虚拟地址,避免在进程间切换时造成的虚拟地址到物理地址的重映射,从而提高系统的性能。
通常FCSE位于CPU和MMU之间,其责任就是将不同进程使用的相同虚拟地址映射为不同的虚拟空间,使得在上下文切换时无须重建TLB等。
相信通过对ARM处理器架构的简单介绍,读者可以对ARM处理器有大体地了解,如果要继续深化研究,可以到ARM公司的网站去下载对于每个体系结构的详细技术说明文档。
对于MMU部分更为详细的介绍,推荐参考《ARM体系结构与编程》(杜春雷编著)一书。
接下来介绍一下运行在ARM处理器之上的几种常用的嵌入式软件操作系统。
1.5
嵌入式操作系统概述
前几年在笔者参与设计的石油探测仪器中,通常都是使用8位处理器——单片机,包括51机、PIC等处理器,程序有的是用汇编写的,有的是用C写的,程序基本没有底层和应用层之分,也根本不使用操作系统。
这样的系统最后在应用发生变更的时候带来的问题就是:
硬件和软件扩展都感觉非常不便,驱动程序、文件系统都没办法加载,以至于很多的功能没有办法去完善,一旦程序需要修改,就需要把所有代码重新编译等问题。
还好,及时地跟上了技术的发展,很快开始选用32位ARM处理器,也渐渐地引入了操作系统。
并且开始搭建基于ARM处理器的开发平台,这样的平台建立之后,给系统的软件、硬件升级带来了很大的便利。
而且在一个平台上进行适当地裁剪之后可以在不同的应用上进行快速开发。
这使得后来的开发效率有了很大的提高。
目前嵌入式系统应用领域的一个发展倾向是采用实时多任务操作系统RTOS。
应该说RTOS的应用是与应用复杂化直接相关的。
过去一个单片机应用程序所控制的外设和履行的任务不多,采取一个主循环和几个顺序调用的用户程序模块即可满足要求,而且现在的单片机芯片本身的性能也有很大程度的提高,可以适应复杂化这一要求,问题还在于软件上。
随着应用的复杂化,一个嵌入式控制器系统可能要同时控制、监视很多外设,要求有实时响应能力,需要处理很多任务,而且各个任务之间也许会有多种信息需要相互传递,如果仍采用原来的程序设计方法可能会存在以下问题。
(1)中断可能得不到及时响应,处理时间过长,这对于一些控制场合是不允许的,对于网络通信方面则会降低系统整体的信息流量。
(2)系统任务多,要考虑的各种可能也多,各种资源如调度不当就会发生死锁,降低软件可靠性,程序编写任务量成指数级增加。
因此,RTOS的应用成为嵌入式系统的另一个基本要求。
ARM芯片获得了许多实时操作系统(RealTimeOperatingSystem)供应商的支持,比较知名的有:
WindowsCE、QNX、Linux、VxWorks、Nucleus、PalmOS等。
下面对可以在ARM处理器上运行的常用操作系统做一个简单介绍。
具体在平台上的操作系统的选择要根据系统的应用及设计成本等因素综合考虑。
1.5.1
VxWorks
VxWorks是WindRiverSystem公司开发的具有工业领导地位的高性能实时操作系统内核,具有先进的网络功能。
VxWorks的开放式结构和对工业标准的支持,使得开发人员易于设计高效的嵌入式系统,并可以很小的工作量移植到其他不同的处理器上。
其主要特点如下。
可裁剪微内核结构。
高效的任务管理能力(多任务——具有256个优先级)。
具有优先级排队和循环调度能力。
支持快速的、确定性的上下文切换。
灵活的任务间通信机制,支持3种信号灯(二进制、计数、有优先级继承特性的互斥信号灯)。
具有消息队列。
具有套接字(Socket)。
具有共享内存技术。
支持信号(Signals)。
微秒级的中断处理能力。
支持POSIX1003.1b