ARM体系结构与编程(第2版)第9章_第1页
ARM体系结构与编程(第2版)第9章_第2页
ARM体系结构与编程(第2版)第9章_第3页
ARM体系结构与编程(第2版)第9章_第4页
ARM体系结构与编程(第2版)第9章_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章

异常中断处理在ARM体系中,通常有以下3种方式来控制程序的执行流程:在正常程序执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器(PC)的值加两个字节。整个过程是顺序执行的。通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行。当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。29.1.1ARM体系中的异常中断种类ARM体系中的异常中断如表9.1所示。39.1.1ARM体系中的异常中断种类49.1.2异常中断向量表及异常中断优先级中断向量表中指定了各异常中断及其处理程序的对应关系。它通常存放在存储地址的低端。在ARM体系中,异常中断向量表的大小为32字节。每个异常中断对应的中断向量表中的4个字节的空间中存放了一个跳转指令或者一个向程序计数器(PC)中赋值的数据访问指令。通过这两种指令,程序将跳转到相应的异常中断处理程序处执行。当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断。处理器执行某个特定的异常中断的过程中,称为处理器处于特定的中断模式。59.1.2异常中断向量表及异常中断优先级各异常中断的中断向量地址以及中断的处理优先级如表9.2所示。6中断向量地址异常中断类型异常中断模式优先级(6最低)0x0复位特权模式(SVC)10x4未定义的指令未定义指令中止模式(Undef)60x8软件中断(SWI)特权模式(SVC)60x0c指令预取中止中止模式50x10数据访问中止中止模式20x14保留未使用未使用0x18外部中断请求(IRQ)外部中断(IRQ)模式40x1c快速中断请求(FIQ)快速(FIQ)中断模式39.1.3异常中断使用的寄存器各异常中断对应着一定的处理器模式。应用程序通常运行在用户模式下。ARM中的处理器模式如表9.3所示。7处理器模式描述用户模式(User,usr)正常程序执行的模式快速中断模式(FIQ,fiq)用于高速数据传输和通道处理外部中断模式(IRQ,irq)用于通常的中断处理特权模式(Supervisor,sve)供操作系统使用的一种保护模式中止模式(Abort,abt)用于虚拟存储及存储保护未定义指令模式(Undefined,und)用于支持通过软件仿真硬件的协处理器系统模式(System,sys)用于运行特权级的操作系统任务9.1.3异常中断使用的寄存器各种不同的处理器模式可能有对应于该处理器模式的物理寄存器组,如表9.4所示。89.2进入和退出异常中断的过程本节主要介绍处理器对于各种异常中断的响应过程以及从异常中断处理程序中返回的方法。对于不同的异常中断处理程序,返回地址以及使用的指令是不同的。99.2.1ARM处理器对异常中断的响应过程ARM处理器对异常中断的响应过程如下。(1) 保存处理器当前状态、中断屏蔽位以及各条件标志位。(2) 设置当前程序状态寄存器CPSR中相应的位。(3) 将寄存器lr_mode设置成返回地址。(4) 将程序计数器值(PC)设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。109.2.1ARM处理器对异常中断的响应过程1.响应复位异常中断2.响应未定义指令异常中断3.响应SWI异常中断4.响应指令预取中止异常中断5.响应数据访问中止异常中断6.响应IRQ异常中断7.响应FIQ异常中断119.2.2从异常中断处理程序中返回从异常中断处理程序中返回包括下面两个基本操作:恢复被中断的程序的处理器状态,即把SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。返回到发生异常中断的指令的下一条指令处执行,即把lr_mode寄存器的内容复制到程序计数器PC中。复位异常中断处理程序不需要返回。整个应用系统是从复位异常中断处理程序开始执行的,因而它不需要返回。129.2.2从异常中断处理程序中返回1.

SWI和未定义指令异常中断处理程序的返回2.

IRQ和FIQ异常中断处理程序的返回3.指令预取中止异常中断处理程序的返回4.数据访问中止异常中断处理程序的返回139.3在应用程序中安排异常中断处理程序通常有两种方法将异常中断处理程序注册到异常中断向量表中。一种是使用跳转指令,另一种是使用数据读取指令LDR。使用跳转指令的方法比较简单,可以在异常中断对应的向量表中的特定位置放一条跳转指令,直接跳转到该异常中断的处理程序。这种方法有一个缺点,即跳转指令只能在32MB的空间范围内跳转。使用数据读取指令LDR向程序计数器PC中直接赋值。这种方法分为两步:先将异常中断处理程序的绝对地址存放在距离向量表4KB的范围之内的一个存储单元中;再使用数据读取指令LDR将该单元的内容读取到程序计数器PC中。149.3.1在系统复位时安排异常中断处理程序1.地址0x0处为ROM的情况(1) 使用数据读取指令LDR的示例(2) 使用跳转指令的示例2.地址0x0处为RAM的情况159.3.2在C程序中安排异常中断处理程序1.中断向量表中使用跳转指令的情况(1) 读取中断处理程序的地址。(2) 从上一步得到的地址中减去该异常中断对应的中断向量的地址。(3) 从上一步得到的地址中减去8,以允许指令预取。(4) 将上一步得到的地址右移2位,得到以字(32位)为单位的偏移量。(5) 确保上一步得到的地址值高8位为0,因为跳转指令只允许24位的偏移量。(6) 将上一步得到的地址与数据0xea000000作逻辑或,从而得到将要写到中断向量表中的跳转指令的编码。169.3.2在C程序中安排异常中断处理程序2.中断向量表中使用数据读取指令的情况(1) 读取中断处理程序的地址。(2) 从上一步得到的地址中减去该异常中断对应的中断向量的地址。(3) 从上一步得到的地址中减去8,以允许指令预取。(4) 将上一步得到的地址与数据0xe59ff000做逻辑或,从而得到将要写到中断向量表中的数据读取指令的编码。(5) 将中断处理程序的地址放到相应的存储单元中。179.4SWI异常中断处理程序通过SWI异常中断,用户模式的应用程序可以调用系统模式下的代码。在实时操作系统中,通常使用SWI异常中断为用户应用程序提供系统功能调用。189.4.1SWI异常中断处理程序的实现1.第1级SWI异常中断处理程序2.使用汇编程序的第2级SWI异常中断处理程序3.使用C程序的第2级SWI异常中断处理程序199.4.2SWI异常中断调用1.在特权模式下调用SWI2.从应用程序中调用SWI3.从应用程序中动态调用SWI209.5FIQ和IRQ异常中断处理程序ARM提供的FIQ和IRQ异常中断用于外部设备向CPU请求中断服务。这两个异常中断的引脚都是低电平有效的。当前程序状态寄存器CPSR的I控制位可以屏蔽这两个异常中断请求:当程序状态寄存器CPSR中的I控制位为1时,FIQ和IRQ异常中断被屏蔽;当程序状态寄存器CPSR中的I控制位为0时,CPU正常响应FIQ和IRQ异常中断请求。FIQ异常中断为快速异常中断,它比IRQ异常中断优先级高,这主要表现在如下两个方面:当FIQ和IRQ异常中断同时产生时,CPU先处理FIQ异常中断。在FIQ异常中断处理程序中,IRQ异常中断被禁止。219.5.1IRQ/FIQ异常中断处理程序1.不可重入的IRQ/FIQ异常中断处理程序保存APCS规定的被破坏的寄存器。保存其他中断处理程序中用到的寄存器。同时将(LR-4)赋予程序计数器PC,实现中断处理程序的返回,并且恢复CPSR寄存器的内容。2.可重入的IRQ/FIQ异常中断处理程序(1) 将返回地址保存到IRQ的数据栈中。(2) 保存工作寄存器和SPSR_irq。(3) 清除中断标志位。(4) 将处理器切换到系统模式,重新使能中断(IRQ/FIQ)。(5) 保存用户模式的LR寄存器和被调用者不保存的寄存器。(6) 调用C语言的IRQ/FIQ异常中断处理程序。(7) 当C语言的IRQ/FIQ异常中断处理程序返回后,恢复用户模式的寄存器,并禁止中断(IRQ/FIQ)。(8) 切换到IRQ模式,禁止中断。(9) 恢复工作寄存器和寄存器LR_irq。(10) 从IRQ异常中断处理程序中返回。229.5.2IRQ异常中断处理程序举例本例中有多达32个中断源,每个中断源对应一个单独的优先级值,优先级的取值范围为0~31。假设系统中的中断控制器的基地址为IntBase,存放中断优先级值的寄存器的偏移地址为IntLevel。寄存器R13指向一个FD类型的数据栈。例子的源代码如程序9.13中所示。程序9.13多中断源的IRQ异常中断处理程序:参见教材P301239.6复位异常中断处理程序复位异常中断处理程序在系统加电或复位时执行,它将进行一些初始化工作,具体内容与具体系统相关,然后程序控制权交给应用程序,因而复位异常中断处理程序不需要返回。下面是通常在复位异常中断处理程序中进行的一些处理:设置异常中断向量表。初始化数据栈和寄存器。初始化存储系统,如系统中的MMU等(如果系统中包含这些部件的话)。初始化一些关键的I/O设备。使用中断。将处理器切换到合适的模式。初始化C语言环境变量,跳转到应用程序执行。249.7未定义指令异常中断这种仿真的处理过程类似于SWI异常中断的功能调用。在SWI异常中断的功能调用中通过读取SWI指令中的24位(位[23:0])立即数,判断具体请求的SWI功能。这种仿真机制的操作过程如下。(1) 将仿真程序设置成未定义指令异常中断的中断处理程序(链接到未定义指令异常中断的中断处理程序链中),并保存原来的中断处理程序。(2) 读取该未定义指令的位[27:24],判断该未定义指令是否是一个协处理器指令。(3) 如果不仿真该未定义指令,则程序跳转到原来的未定义指令异常中断的中断处理程序中执行。Thumb指令集中不包含协处理器指令,因而不需要这种指令仿真机制。259.8指令预取中止异常中断处理程序如果系统中不包含MMU,指令预取中止异常中断处理程序只是简单地报告错误,然后退出。如果系统中包含MMU,则发生错误的指令触发虚拟地址失效,在该失效处理程序中重新读取该指令。指令预取中止异常中断是由错误的指令执行时被触发的,这时LR_abt寄存器还没有被更新,它指向该指令的下面一条指令。因为该有问题的指令要被重新读取,因而应该返回到该有问题的指令,即返回到(LR_abt-4)处。269.9数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论