ARM中子程序调用是用跳转指令B、BL或BX,跳转到程序计数器PC的指向处,产生程序分支。正常的子程序调用属于用户模式。ARM 处理器中PC是对程序员开放的,所以可以把分支和子程序调用看成同一种 *** 作,因此没有专门的子程序调用指令。当使用BL指令跳转时,处理器自动把下一条指令的地址值拷贝到链接寄存器LR中。在执行跳转指令时,处理器并不保存状态寄存器CPSR。
处理器相应异常中断时,正常的程序流被暂时中止,处理器就进入异常,ARM中所有的异常都会引起中断。异常中断时处理器硬件自动把当前CPSR的状态存储到当前异常模式的特定SPSR中,以免中断处理程序在使用CPSR时改变原来的状态,从而对中断返回造成影响。进入异常中断处理程序时,应该保留中断时的程序地址,以便中断结束时,返回到中断的正常位置,执行下一条指令。异常中断有很多类型,因而不同的异常中断有不同的模式,中断返回时的指令也不同。中断返回时,程序需要一条指令把SPSR中的内容恢复到CPSR中,如MOV PC, LR,执行此指令时,处理器会自动把SPSR中保存的程序状态拷贝到CPSR中。异常中断时,处理器自动把中断处地址保存到相应模式下的LR (R14)中,大多数保存在LR中的地址是:
LR保存的值二PC的值一8,但也有特殊情况。
软件异常中断时一个很灵活的软件功能,和子程序调用不同,软件异常中断吧程序导入管理模式,软件中断是异常中断的一种类型。软件中断是由指令SWI引起的。程序在执行这一指令后,进入异常中断,处理器响应中断,硬件执行过程如下:把下一条指令的地址拷贝给LR把程序状态寄存器CPSR拷贝给SPSR_svc强制进入管理模式强制进入到ARM状态;跳转到绝对地址Pc=0x00000008禁止IRQ中断。软件中断处理程序完成后,使用下列指令返回到原中断处。
(二)与基于51系列单片机的控制系统开发相比,基于ARM处理器的控制系统开发有何异同。(从指令系统、工作模式、寄存器分布和外围器件等方面比较)
(1)指令系统:
①51系列单片机采用8位数据结构,指令--8位,数据--8位,51系列单片机中指令的取指、数据的读写只使用一个地址值;
②ARM处理器采用32位数据结构,指令--32位ARM指令(ARM模式),16位Thumb指令(Thumb模式)数据--32位、16位、8位,ARM处理器中,指令的取值使用四个地址单元(ARM 模式)指令的取值使用两个地址单元(Thumb模式),数据的读写读写使用4、2、1个地址单元。
(2)工作模式
①51系列单片机只有一种模式,所有资源所有情况下都可利用;
②ARM处理器具有多种模式(用户模式、快速中断模式、标准中断模式、管理模式、中止模式、未定义模式、系统模式),只有特权模式可以可以访问和修改某些资源,用户模式不能够访问被保护起来的资源(如不能访问某些程序存储区,不能改写某些存储区),因此用户程序不会对系统造成干扰。
(3)寄存器分布
ARM状态时,ARM处理器中一般可使用的通用寄存器是R0-R12,而51系列中共有4组R0-R12ARM中所有寄存器都有累加器功能和间接寻址功能,通用寄存器比51系列强大一些。在51系列中,所有的重要功能指令都要用到累加器A,因此要不停地保护累加器A中数据,在ARM中不会出现这种清况。两者的程序计数器的使用极其意义是相同的,程序状态器含义是想近的,51系列中,程序状态一般是由累加器A决定的,因为A参与并保存 *** 作结果;ARM处理器中,则是由参与 *** 作的目标寄存器决定的。51系列中,堆栈指针是SP而在ARM处理器中,堆栈指针是R13。
Thumb状态下的寄存器是ARM状态下寄存器的一个子集,Thumb状态所能访问的寄存器少一些,Thumb状态下的寄存器的定义及其使用和ARM状态时相同的。
(4)外围器件
ARM不是单片机,而只是一个单片机的内核,ARM仅仅是单片机中的中央处理器,它有自己的指令代码集,可以通过执行代码控制外部设备,给ARM处理器设计出各种外部设备,用总线连接到一起,就组成了不同结构和性能的单片机。
异常和中断1.ARM
处理器复位后,处理器硬件将进行如下 *** 作:
(1)
强制进入管理模式
(2)
强制进入到
ARM
状态
(3)
跳转到绝对地址
PC=0x00000000
出执行
(4)
禁止
IRQ
中断和
FIQ
中断。
复位后
CPSR
中最后
4
位状态为
0011,并且进入管理模式,执行 *** 作系统程序,
一般用做对系统的初始化,然后切换到用户模式,开始执行正常的用户程序,切
换到用户模式可以使用如下程序:
MRS
R0,CPSR
读程序状态寄存器
BIC
R0,R0,#03
把末两位清零
MSR
CPSR_c
,R0
把修改后的值加载给状态寄存器,切换结束
ADD
R1,R2,R3
用户程序
2.未定义异常
.
ARM
处理器中有很多没有定义的代码,因为
ARM
使用
32
位代码,包含
2
的
31
次幂种。所以
ARM
指令集不能用尽所有的代码。
ARM
的未定义异常有两种情况:
(1)
遇到一条无法执行的指令,此指令没有定义
(2)
执行一条协处理器的 *** 作指令,在正常情况下,协处理器应该应答,但是
没有,可能是因为干扰等原因。
当
发
生
此
异
常
时
,
处
理
器
硬
件
响
应
中
断
,
但是一般情况下是不希望产生异常的,如果是由于干扰引起的异常,那么在
异常中断处理中有一段专门的程序,让程序返回再重新执行该条指令,以判
断异常是否是由干扰引起。
当然也要注意哪种单片机应该使用哪种合适的指令集版本,因为还是约
有差异的,否则某些编译通过的指令也不能执行。
3.
软件中断异常
软件中断异常是由指令
SWI
引起的,
程序执行这一条指令后,
进入异常中断。
处理器响应中断,硬件执行图如下:
软件中断处理程序完成后,使用下列返回指令返回到原中断处:
MOVS
PC
,
R14
软件中断异常把程序导入管理模式,而子程序调用属于用户模式。
4.
预取指中断异常
。。。
。。
预取指中断异常和未定义指令异常都是由于不正常的指令国产引起,但是也
有区别:
(1)
未定义指令异常是内部异常中断,而他是外部信号引起的异常中断
(2)
他并没有成功地取得一条指令。
他中断返回时,应该执行指令:SUBS
PC
,
R14
,
#4
5.数据中止异常
.
。。。
。。。
6.中断请求(IRQ)异常
.
在
ARM
处理器中,有一个输入逻辑
nIRQ
称为中断请求信号,这个输入信
号是由
ARM
处理器外围控制模块(片内)控制,当有满足中断条件的事件发生
时,
外围控制模块向
ARM
处理器发错
IRQ
信号,
ARM
处理器进入异常,
使
IRQ
中断是常用的中断,就像
51
系列单片机中定时器中断、串口中断、外部中断等。
中
断
可
以
通
过
CPSR[7]
来
屏
蔽
。
IRQ
完成中断处理后,
程序应该执行下列指令返回到原中断处:
SUBS
PC
,
R14
,
#4
7.
快速中断(FIQ)请求异常
在
ARM
处理器中,有一个输入逻辑
nFIQ
称为中断请求信号,这个输入信
号是由
ARM
处理器外围控制模块(片内)控制,当有满足中断条件的事件发生
时,
外围控制模块向
ARM
处理器发错
FIQ
信号,
ARM
处理器进入异常。
使
FIQ
中断可以通过
CPSR[6]来屏蔽。
注意:进入异常会引起处理器模式转换。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)