ARM的七种异常类型_第1页
ARM的七种异常类型_第2页
ARM的七种异常类型_第3页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、arm7支持六种操作模式:(1) 用户模式(usr):正常的程序执行状态(2) fiq模式(fiq): 支持数据传送或通道处理(3) irq模式(irq): 用于通用的中断处理(4) 管理模式(svc):用于操作系统的保护模式(5) 异常模式(abt):数据或者指令预取异常时进入(6) 无定义模式(und):当无定义指令被执行时进入(7)软件控制,外部中断,异常处理都可以改变操作模式。大部分的应用程序在用户模式下执行。其他模式,比如管理模式,在中断、异常服务、或者访问被保护资源时进入。arm 的中央寄存器集是16 个用户寄存器r0 r15。这些寄存器均是32 位宽度,r0 r12没有其他特殊功

2、能,寄存器r13 r15在cpu中有特殊功能。r13被用作栈指针(stack pointer,sp)。r14被称为链接寄存器(link register, lr),当调用一个函数时返回地址被自动保存到链接寄存器,在函数返回时有效。这使得快速进入和返回“叶”函数(不调用其他函数的函数)成为可能。如果函数是分支的一部分(即该函数将调用另一个函数),链接寄存器必须入栈(r13)。r15 是程序计数器(program counter, pc)。有趣的是,许多指令也可以在r13 r15中执行,就像它们是标准的用户寄存器。arm中断的问题arm的七种异常类型1复位异常2数据访问中止异常3快速中断请求异常4

3、一般中断请求5预取指令异常6软件中断异常7未定义异常问题:1为什么除了进入复位异常模式外,在别的异常处理模式中都允许fiq中断?2数据访问中止异常的优先级大于fiq异常,为什么在数据访问异常处理模式中,还允许fiq中断?这样不就成了:在高优先级异常处理中允许低优先级的中断发生?即使这样,因为fiq中断的优先级 将下一条指令的地址存入lr 2 复制cpsr到spsr 3 根据异常类型,设置cpsr的运行模式位和相应的中断位 4 强制pc从相应的异常向量地址取下一条指令执行,跳转到相应的异常处理程序处 b:异常处理完毕之后,arm微处理器会执行以下几步操作 1 将连接寄存器lr的值减去相应的偏移量

4、后送到pc中。 2 将spsr复制回cpsr中。 3 若在进入异常处理时设置了中断禁止位,要在此清除。 4 可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。 问题1:在b 中,为什么还要清除中断禁止位?我是这样理解的: 进入异常时,先保存了cpsr到相应的spsr,返回的时候,直接复制spsr到cpsr不就使得和中断前的cpsr一样吗?为什么还要清除相应的中断位? 问题2:b 点 怎么理解?麻烦大家给讲讲。1:如果cpsr的i位为0,arm处理器会再次响应中断,所以清除i位是必须的 2:其实是说,一旦发生复位,处理就立即转向复位向量.其实复位还有其它操作,b4

5、的说法不是很准确的arm开发经验笔记it /malonely发表于2007-09-20, 15:57 前一段时间做了arm的一些开发,主要是编写了arm的启动软件和移植了ucos-ii到arm7。我做事情喜欢深入简出,及从最简单,最原理的方面先做 一个框架,然后在这个框架里面进行补充。我还是一个很喜欢和别人讨论的人,希望有人可以给我提出意见和建议。我的这个心得很初级,都是一些基本的东西。现 在拿出来和大家分享,希望在我毕业之前能给大家留一些纪念。_ 由于这些东西发paper实在是没有价值,但是我感觉可以作为arm开发的入门。由于我的水平和经验有限,错误也是难免的。但是如果不拿出来和大家分享,

6、就算有错误我也发现不了,是么?呵呵。我现试试发连载的第一篇,看看有多少价值,如果大家觉得有价值,我会继续连载的。前言 这个文档是我学习arm编程的总结和心得。阅读这个文档的人应当首先阅读ads1.2的帮助文档及相关内容。这个文档不会对编译器及连接器做出详细的说 明, 在需要的时候会指出具体内容在相关资料的章节。同时阅读这个文档的人需要了解arm指令集和一些arm汇编的基本内容以及c和c+的相关编程内容。同时 还需要了解arm的流水线结构及一些基本的编程知识。同时为了方便查阅英文文档,所有的相关术语都使用英文原文 第一章 startup1 arm的启动一般的嵌入式系统在主程序执行之前都需要执行一

7、些初始化的过程以创造嵌入式程序运行的 环境,尤其是一些高级的嵌入式系统,由于核心芯片使用内存映射、内存保护等机制以及编程使用高级语言c,c+甚至java语言,都需要先创建一个适合程 序运行的硬件环境,然后初始化或者配置或者剪裁run-time library, 这些工作都必须在主程序运行前完成,所以一个startup程序或者程序组对于一个嵌入式系统来说是非常重要的。要编写startup程序,需要对编译 器、链接器和汇编器的细节有一定的了解,同时对arm芯片硬件本身的地址分配以及memory mapping机制也需要有一些了解。2 arm 程序的工作过程 首先由各种source file经过编译

8、产生object文件,然后object文件经过链接生成image文件,然后通过ice的方法,根据描述文件的指定下载到目标板上的固 态存储器指定地址当中,比如flash,eeprom, rom等等。在程序执行之前,根据某些描述文件,将需要读写数据的部分读出放入动态存储器比如ram当中,然后程序从rom开始执行。或者有时为了提高程 序的运行速度,也可以将所有的程序(有一些root的部分除外,以后会提及)通过一个描述文件放入指定的ram当中,然后程序从ram开始执行,但是这样 会耗费大量的动态存储器,所以大部分程序会取折中的方法,将需要快速运行的部分和要读写的部分放入ram中(一般读固态存储器的过程

9、和动态存储器的过程是 一样的,但是写就不同了,所以读写的部分一定要放到ram中),而只读的部分和对速度要求不是那么高的部分放入固态存储器。同时arm结构的异常向量表规 定放在地址为0x00000000开始的地址空间上,而一般的cpu为了提高异常相应速度,会将这个向量段remap到其他的ram当中,所以在描述文件 当中必须精确指定异常向量跳转程序的地址到remap的地方。在application程序执行前,还需要由一些文件描述application程序执行 的环境。比如系统工作时钟,总线频率。现在一般嵌入式编程语言为c,c+等。如果在使用它们的时候使用的runtime-library,那么在程序

10、执 行前还需要为这些库函数初始化heap。然后arm可能工作在不同的模式,还需要为不同的工作模式设置stack。这样,描述链接地址的文件,以及在 application运行前所有的初始化程序就是startup程序组3 startup分类这样,将startup程序所完成的功能分类。一类是链接地址描述,一类是各种初始化的程序。根据不同的应用,描述文件和初始化程序的内容以及结构和复杂程度都会不同。但是基本上,它们都必须实现以下功能。3.1 描述文件实现功能描述文件可以是链接命令行上简单的几个字符,也可以是一个非常复杂的文件,但是它必须完成如下功能: 指定程序下载的地址 指定程序执行的地址3.2 初始

11、化程序实现的功能初始化程序根据不同的应用,其结构和复杂度也不同,但是它必须完成如下基本功能: 异常向量初始化 内存环境初始化 其他硬件环境初始化4 描述文件要编写描述文件,必须知道arm image文件的组成及arm image文件执行的机理。4.1 arm image的结构一个arm image structure由linker在以下几个方面定义:组成它的regions 和 output sections 当image 下载的时候这些regions 和 sections 在内存中的位置当image 执行时这些regions和sections在内存中的位置4.1.1 arm image的组成一

12、个arm image被保存在可执行文件当中,它的层次结构可以包括image,regions,output sections和input sections。 一个image由一个或多个regions组成,每个region包括一个或多个output sections 每个output section由一个或多个input sections组成 input sections是一个object file中的code和data信息。image的结构如下图:note input section,output section和region的定义见ads_linkerguide 3-3页。同时input se

13、ction 有几种属性,分别为readonly,read-write,zero-initialized。分别称为ro,rw和zi。属性来源于area后的attr属性。比 如code是ro,data是rw,noint默认为zi,即用0值初始化,但是可以选择不进行0值初始化。zi属性仅仅来源于space, dcb, dcd, dcdu, dcq, dcqu, dcw, 或者dcwu。由以上定义,zi属性的包含于rw属性,它是有初始值的rw数据。又例如在c语言中,代码为ro,静态变量和全局变量是rw,zi的。4.1.2 image 的load view 和 execution view在 下载的时候

14、image regions被放置在memory map当中,而在执行image前,或许你需要将一些regions放置在它们执行时的地址上,并建立起zi regions。例如,你初始化的rw数据需要从它在下载时的在rom中的地址处移动到执行时ram的地址处。 note load view 和execution view的详细定义见ads_linkerguide 3-4以上的描述包括二个内容,一是要指定各个section在load view和execution view时的地址即memory map,二是要在执行前根据这些地址进行section的初始化。4.1.3 制定memory map制 定m

15、emory map的方法基本上有二种,一是在link时使用命令行选项,并在程序执行前利用linker pre-define symbol使用汇编语言制定section的段初始化,二是使用scatter file。以上二种方法依应用程序的复杂度而定,一针对简单的情况,二针对复杂的情况。 利用linker pre-define symbol使用汇编程序这是简单的方法,针对简单的memory map。在link时使用选项-ro, -rw, 等等指定memory map的地址。详细说明参看ads_linkerguide中命令行选项说明。然后利用汇编使用pre-define symbol,

16、来进行各种段的定位。linker pre-define定义如下:由前面对zi的说明,image$rw$limit = image$zi$limit。这些都是linker预先定义的外部变量,在使用的时候可以用import引入。下面给出一个例子。假 设linker 选项为:-ro-base 0x40000000 -rw-base 0x40003000。程序和只读变量(const 变量)大小为0x84,这样ro section的大小为0x84 bytes。data的大小为0x04 bytes,并且data被初始化,则rw section的大小为0x04,zi section的大小为0x04。这样程序

17、在load view,地址是这样的:0x40000000开始到地址0x40000080,是ro section部分(程序从0x40000000开始),image$ro$limit = 0x40000084.0x40000084地址开始到地址0x40000084,是rw section部分。在execution view,由linker的选项,各个section的地址是这样的:ro section的地址不变。rw section的起始地酚蔽?x40003000,则image$rw$base = 0x40003000。因为全部的0x04 bytes data被初始化,所以image$rw$limi

18、t = image$zi$limt = 0x40003004。现在要做的就是将rw section移到以0x40003000开始的地方,并且创造一个zi section。一个更通用的做法是:首 先比较image$ro$limit和mage$rw$base,如果相等,说明execution view下rw section的地址和load view 下rw section的地址相同,这样,不需要移动rw section;如果不等,说明需要移动rw section 到它在execution view中的地方。然后将image$zi$base地址到image$zi$limt地址的内容清零。示例代码如下

19、:;读入linker pre-define symbolsimport image$ro$limitimport image$rw$baseimport image$zi$baseimport image$zi$limit; .一些其他的代码或伪指令;r0读入section load addressldr r0,= image$ro$limit;r1读入section execution addressldr r1,= image$rw$base;r2读入execution section 后的紧跟的word addressldr r2,= image$zi$base;检查rw section

20、的地址在load view和execution view下;是否相等,如果相等,就不移动rw section,直接建立;zi scetioncmp r0,r1beq do_zi_init;否则就copy rw section到execution view下指定的地址bl copy; .; .;copy 是一个用于copy的子函数,它把从r0中的地址开始的;section copy到r1中的地址开始的section,这个section的;上限地址后紧跟的word address保存在r2中copycmp r1,r2ldrcc r3,r0,#4strcc r3,r1,#4bcc copymov p

21、c,lr; .; .;do_zi_int子函数是为创建zi section做一些准备工作do_zi_int;将zi section开始的地址装入r1ldr r1,= image$zi$base;将zi section结束后紧跟的word address装入r2ldr r2,= image$zi$limit;将zi section 需要的初始化量装入r3mov r3,#0bl zi_int; .; .;zi_int子函数用于建立并初始化zi section,zi section的;开始地址储存在r1,zi section结束后紧跟的word address;地址储存在r2zi_intcmp r1

22、,r2strcc r3,r1,#4bcc zi_intmov pc,lr; .; .这个方法针对比较简单的应用,如果需要进行一个比较复杂的memory map,如下图,那么这个方法就不适用了。为了解决复杂memory map的问题需要用到scatter load 机制。标签: arm 发信人: duremi (快乐点), 信区: modern_elec标 题: arm7常见问题1:数据异常 (zz)发信站: 逸仙时空 yat-sen channel (fri apr 7 10:11:49 2006), 站内信件arm7常见问题1:数据异常 作者 呜哇啦 日期 2006-3-30 13:45:0

23、0 其实很多人刚开始都会觉得数据异常很讨厌,到后来真正了解之后,才发现这个东西真不错,能有效的帮助我们查找到问题所在。如果没有这个东西,很多问题是很难被发现的。 一般会出现此现象的原因: 1.堆栈的指针不合理(c编译器无法侦测到。),随着sp的延伸,可能会到临界地区,发生不正确的物理地址的访问。 2.在c中使用volatile的物理地址访问,有可能出现非法的数据区域访问。 3.特别是在工业控制等场合(掉电重起后,数据要求不更改,做到数据保护),系统启动过程中,屏蔽掉_main的初始化变量功能,很多公共变量(如定义成unsigned short x=0x8888,或指向某些结构的指针).在启动后

24、没有初始化代码为其做初始化。所以容易产生随机地址访问,出现 data abort。此情况下,最好在用户程序一开始就做好全局变量的初始化工作。 解决方案: 应有一些arm汇编基础,在进入数据异常的时候,通过查找lr地址,ads下使用setpc跳到lr内的地址(keil下,则是show code at address),此处的代码(可能是一个小小范围,因为流水线的问题)就是引起错误的指令。查看此代码对哪些变量进行了访问(如果有堆栈操作,则设置断点,程序执行到此处后。查看sp指针是否合法) - o o o o o o true love is powerful. o o o o o o 来源:逸仙时

25、空 yat-sen channel from: 52arm s3c4510b系统中的异常中断技术 (图)作者:中国海洋大学 钟石磊 孙克怡 曹伟 程凯 日期:2004-9-1 来源:本网 字符大小:【大】 【中】 【小】 摘要:介绍arm s3c4510b系统的异常中断机制,包括异常中断的分类,响应与返回;中断处理程序的安装与调用;swi,irq中断的实例与关键代码。关键词:arm;s3c4510;异常中断;swi;irq;中断向量表引言-随着人们对于电子产品的要求越来越高,以80c51系列为代表的8位处理器系统开始面临越来越多的局限和挑战,

26、人们对于高性能芯片和嵌入式功能的呼声也越来越高。16/32 位的处理器系统得到了前所未有的关注和重视。32位arm体系系列处理器便是其中的代表。s3c4510b处理器是基于arm7体系16/32位risc处理器,内部集成了8kb的cache/sdram,内嵌earthnet控制器,拥有7种处理器模式和内部多线程和外部多处理器的处理器结构。在嵌入式系统中具有重要意义的异常中断技术在s3c4510b系统中也体现了arm体系独有的一些的特点。本文根据s3c4510b系统的特点,分析了该系统中七种异常中断的功能及特点。并给出了swi异常中断(外部中断)和irq异常中断(软件中断)的应用实例代码。 1

27、s3c4510b系统中的异常中断1.1 s3c4510b系统异常中断的特点-s3c4510b系统中控制程序执行流程的方式通常有三种,一是正常程序执行过程,即根据指令类型增加程序计数器pc使程序顺序执行;二是通过跳转的方式来控制程序的执行,可以利用跳转的命令执行跳转操作,也可以通过直接修改程序计数器来达到跳转的目的;三是异常中断的方式,可以根据软件的执行情况,外部设备的异常请求等实现内部、外部异常的处理,系统功能的调用和程序进程的控制等功能。-s3c4510b系统的异常中断具有以下几个特点。首先,作为arm体系rtos(实时操作系统)组成部分,程序中的异常中断必须按照arm体系的要求进行处理器模

28、式的转换。其次,如果对系统的优化有需求时,可以进行32位的arm处理指令和16位的thumb指令的转换。另外,s3c4510b处理器正常运行时,保存的返回地址是通过将pc存入lr寄存器完成的,由于中断产生时的计数器pc的值有时已经更新,如产生了外部中断和快速中断等;有时可能尚未更新,如软件中断和未定义指令中止等,故必须根据实际情况对返回地址进行软件修正之后才能正确返回。最后还要注意,arm体系支持c语言和汇编语言程序的相互之间的调用,并有atpcs规则进行协调,所以异常中断处理程序必需按照atpcs规则进行寄存器处理。1.2 s3c4510b系统中的异常中断的类型-s3c4510b拥有七种不同

29、的异常中断类型,分别适应于不同的中断需要。根据arm系列处理器的特点,各种异常中断对应于arm系列的不同工作模式。其种类和对应关系如表1所示。 -其中,复位中断是优先级最高的中断。在复位引脚有效的前提下,系统加电或系统复位时都会引起复位中断。数据访问中止是在数据访问指令的目标地址不存在或者该地址不允许当前指令访问的情况下产生的。指令预取中止中断是处理器或系统协处理器认为当前指令未定义,当系统预取该指令时,本中断执行。未定义中止在处理器或系统协处理器认为当前指令未定义时产生,故而可以根据该异常中断机制仿真浮点向量运算。快速中断和外部中断都是在对应的中断请求引脚有效,且状态寄存器中的相应中断禁止标

30、志位清零时产生。其中的外部中断还可以用来进行各系统进程的切换;软中断由用户定义,在程序运行时由swi指令调用,可用于用户模式下的程序调用特权模式指令。在rtos系统中可以通过该中断机制实现系统功能调用。1.3 s3c4510b系统对异常中断的响应-s3c4510b系统对异常中断的响应流程如下:-(1) 保存处理器当前状态寄存器cpsr的值、中断屏蔽以及各条件标志位到将要执行的异常中断的spsr中。-(2) 设置当前程序状态寄存器cpsr的值。其中包括:设置cpsr相应位的值使处理器进入特定的处理器模式;按要求屏蔽中断,通常应该屏蔽irq中断,在fiq中断时屏蔽fiq中断。-(3) 设置lr寄存

31、器。将中断相应模式的lr寄存器的值设置为异常中断的返回地址。-(4) 处理程序计数器pc。将pc值设为相应的中断向量的地址,从而实现跳转以执行中断程序。-当处理器执行完以上流程之后,处理器已经自中断向量进入异常中断的处理状态。异常中断处理完毕之后,在异常中断程序的末端,处理器进入异常中断的返回状态,其流程如下:-(1) 恢复状态寄存器。将保存在中断模式中的spsr值赋给当前的状态寄存器。-(2) 将返回地址复制到程序计数器。这样程序将返回到异常中断产生的下一条指令或出现问题的指令处执行。-整个响应与返回的过程如图1所示。 -需要注意的是,对于不同的异常中断,其返回地址的计算方法也是不同的。ir

32、q和fiq异常中断产生时,程序计数器pc已经更新,而swi中断和未定义指令中断是由当前指令自身产生的,程序计数器pc尚未更新,所以要计算出下一条指令的地址来执行返回操作;指令预取中止异常中断和数据访问异常中断要求返回到出现异常的执行现场,重新执行操作。2 s3c4510b系统中的异常中断处理程序的安装-s3c4510b系统通过异常向量表安装异常中断处理程序,即将异常向量表指向异常中断处理程序的入口,实现面向异常中断的跳转。这里需要介绍一下s3c4510b系统的中断向量表。在s3c4510b系统中,无论在地址重映射之前还是之后,异常中断向量表的入口地址为固定的(见表1)。当系统运行到满足异常中断

33、条件而产生异常中断时,系统将自动跳入相应的异常中断向量表中。而在异常向量表中保存的,正是利用跳转指令或ldr指令指向该中断的异常中断处理程序的指令程序,这样就实现了异常中断处理程序的安装。以swi软中断为例,异常中断安装的基本顺序如图2所示,其中异常中断向量的地址是固定的,其他地址为假设的。2.1 利用跳转指令实现异常中断的安装-将bl指令放置到中断向量表的特定位置,跳转目标地址为中断处理程序的首地址,便可直接实现异常中断的安装。其优点是bl指令可以直接保存地址,缺点是bl的跳转范围只有32mb的地址空间,如bl swi_handler。2.2 利用ldr指令实现异常中断的安装-利用ldr直接

34、向程序计数器pc中赋值也可以实现中断处理程序的安装。先要将异常中断处理程序首地址的绝对地址放在邻近的一个存储单元中,然后用ldr命令将该内存单元中的地址读取到pc中。其优点是可调用程序的范围不受限制,如:- ;ldr pc,swi_addr-;swi_addr dcd swi_handler-以上两种安装方法各有优缺点,需要根据实际情况来选择。3 s3c4510b系统中swi异常中断实例-s3c4510b中的swi指令可以用来实现rtos中的系统功能调用。它由用户模式下当前执行的指令引发,通过一个24位的立即数来指代swi需要调用的系统功能,调用执行的过程在特权模式中进行。3.1 swi异常中断的处理程序-通常我们把swi的中断处理程序分为两级,分别完成立即数的读取和功能调用的执行。其指令代码如下:-stmfd sp!,r0-r12,lr -;保护现场,保存

温馨提示

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

最新文档

评论

0/150

提交评论