第三章讲 ARM异常处理与编程技巧_第1页
第三章讲 ARM异常处理与编程技巧_第2页
第三章讲 ARM异常处理与编程技巧_第3页
第三章讲 ARM异常处理与编程技巧_第4页
第三章讲 ARM异常处理与编程技巧_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第三章ARM异常处理与编程技巧

东南大学国家专用集成电路系统工程技术研究中心目录3.1ARM异常处理3.2ARM编程技巧3.1ARM异常处理3.1.1ARM异常处理概述

-各种异常的优先级ARM的七种异常有固定的优先级复位数据预取异常FIQIRQ指令预取异常SWI异常未定义指令异常异常处理中寄存器的使用在异常发生时处理器模式的改变意味着异常处理程序至少需要访问下列寄存器:堆栈指针寄存器(SP_<mode>)连接寄存器(LR_<mode>)程序状态保存寄存器(SPSR_<mode>)在FIQ异常处理中,5个其他的通用寄存器(r8_FIQ到r12_FIQ)其他的寄存器可以和发生异常之前的模式共用异常处理程序必须确保其他的寄存器在退出异常处理程序时恢复到进入异常之前的值。这个可以通过在进入异常时把工作寄存器的值压入堆栈,在退出异常时再弹出堆栈来实现。中断处理ARM有两级外部中断-FIQ和IRQARM提供的FIQ和IRQ异常用于外部设备向CPU请求异常服务。这两个异常的引脚都是低电平有效的。当前程序状态寄存器CPSR的I和F控制位可以屏蔽这两个异常请求:当程序状态寄存器的CPSR中的I位和F位为1时,FIQ和IRQ异常被屏蔽;当程序状态寄存器CPSR中的I位和F位为0时,cpu正常响应FIQ和IRQ异常请求。FIQ与IRQFIQ和IRQ提供了基本的优先级FIQ的优先级高于IRQ:当多个中断同时发生时,首先处理FIQ中断处理FIQ中断时屏蔽IRQ中断FIQ中断处理完成并退出之后才会处理IRQ中断ARM内核在FIQ在快速响应中断上作了一些设计FIQ异常位于异常向量表的最后使得异常处理程序可以放在异常向量表之后FIQ工作模式有五个影子寄存器(r8_FIQ到r12_FIQ)可以有多个FIQ中断源,但为了系统的性能避免嵌套中断中断嵌套ARM内核只有二个外部中断输入信号nFIQ和nIRQ,但对于一个系统来说,中断源可能多达几十个。为此,在系统集成的时候,一般都会有一个中断控制器来处理中断信号。硬件处理有的系统在ARM的异常向量表之外,又增加了一张由中断控制器控制的特殊向量表。当由外设触发一个中断以后,PC能够自动跳到这张特殊向量表中去,特殊向量表中的每个向量空间对应一个具体的中断源。软件处理多数情况下是用软件来处理异常分支。因为软件可以通过读取中断控制器来获得中断源的详细信息。中断服务例程(ISR)从中断控制器获取中断源信息,跳转到相应的中断服务线程(IST)处理中断。3.1.2进入和退出异常的过程异常处理当异常发生,ARM会拷贝CPSR到SPSR_<mode>设置正确的CPSR位切换到ARM状态切换到异常模式禁止中断保存返回地址在LR_<mode>设置PC到异常向量地址从异常返回时,异常处理需要从SPSR_<mode>恢复CPSR从LR_<mode>恢复PC值这些只用于ARM状态地址异常进入模式优先级(6最低)0x0000,0000复位管理模式10x0000,0004未定义指令未定义模式60x0000,0008软件中断管理模式60x0000,000C中止(预取指令)中止模式50x0000,0010中止(数据)中止模式20x0000,0014保留保留未使用0x0000,0018IRQIRQ40x0000,001CFIQFIQ3从异常返回的指令对于SWI异常和未定义指令异常:MOVSpc,lr对于FIQ、IRQ和指令预取异常:SUBSpc,lr,#4对于数据预取异常:SUBSpc,lr,#8如果lr寄存器在入栈之前改变了还可以用带有^号的LDR指令来恢复PC:LDMFDsp!,{pc}^这几条指令都是普通的数据处理指令,特殊之处就是把PC寄存器作为了目标寄存器,并且带了特殊的后缀“S”或“^”,在特权模式下,“S”或“^”的作用就是使指令在执行时,同时完成从SPSR到CPSR的拷贝,达到恢复状态寄存器的目的。SWI和未定义指令异常的返回

SWI和未定义指令异常是由当前执行的指令产生的,当SWI和未定义指令异常产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令:

ARM ThumbSWI pc-8 pc-4 异常在这条指令处发生Xxx pc-4 pc-2 lr=下一条指令Yyy pc pc 返回指令:MOVPC,LR将寄存器LR中的值复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。

IRQ和FIQ异常的返回

当IRQ和FIQ异常产生时,程序计数器PC的值已经更新,它指向当前指令后面第3条指令。

ARM Thumbwww pc-12 pc-6这条指令执行过程中发生中断Xxx pc-8 pc-4 Yyy pc-4 pc-2 lr=下一条指令Zzz pc pc 返回指令是SUBSPC,LR,#4。将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。指令预取中止异常处理程序的返回

当发生指令预取中止异常时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常处理程序因改返回到产生该指令预取中止异常的指令处,而不是像前面两种情况下返回到发生中断的指令的下一条指令。

ARM Thumbwww pc-8 pc-4预取指令异常发生于此Xxx pc-4 pc-2 lr=下一条指令

Yyy pc pc 返回指令是SUBSPC,LR,#4。将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。数据访问中止异常处理器的返回

数据访问中止异常是由数据访问指令产生的,当数据访问中止异常产生时,程序计数器PC的值已经更新,它指向当前指令后面的第3条指令。

ARM Thumbwww pc-12 pc-6数据访问中止异常发生于此Xxx pc-8 pc-4 Yyy pc-4 pc-2 lr=下一条指令Zzz pc pc 返回指令是SUBSPC,LR,#8。将寄存器LR中的值减8后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。3.1.3异常处理程序的设计

_irq为了方便使用高级语言直接编写异常处理函数,ARM编译器对此作了特定的扩展,可以使用函数声明关键字_irq,编译出来的函数就满足异常响应对现场保护和恢复的需要,并且自动加入对LR进行减4的处理,符合IRQ和FIQ中断处理的要求。

保存ATPCS规定的被破坏的寄存器保存其他中断处理程序中用到的寄存器同时将(LR-4)赋予程序计数器PC实现中断处理程序的返回,并且恢复CPSR寄存器的内容例:_irqvoidIRQHandler(void){ STMFD SP!,{r0-r4,r12,lr}volatileunsignedint*source=(unsignedint*)0x80000000; MOV r4,#0x80000000 LDR r0,[r4,#0]If(*source==1) CMP r0,#1Int_handler_1(); BLEQ int_handler_1 MOV r0,#0*(source)=0; STR r0,[r4,#0] LDMFD sp!,{r0-r4,r12,lr}} SUBS pc,lr,#4SWI异常通过SWI异常,用户模式的应用程序可以调用系统模式下的代码。在实时操作系统(RTOS)中,通常使用SWI异常为用户应用程序提供系统功能调用。

SWI异常处理程序的实现在SWI指令中包括一个24位的立即数,该立即数指示了用户请求的特定的SWI功能。在SWI异常处理程序中要读取该24位立即数,这涉及到SWI异常模式下对寄存器LR的读取,并且要从存储器读取该SWI指令。需要用汇编程序来实现。第1级SWI异常处理程序为汇编程序,用于确定SWI指令中的24位立即数。第2级SWI异常处理程序具体实现SWI的各个功能,可以是汇编程序,也可以是C程序

SWI号ARM内核没有提供直接给SWI传递SWI号的机制Swi号必须在SWI指令中指定从swi指令中提取出swi号这样的话,SWI异常处理必须确定调用SWI时处理器处于何种状态(ARM状态还是Thumb状态)检查SPSR中的T位SWI指令在ARM状态下位于LR-4处,在Thumb状态下位于LR-2处SWI异常处理程序中给C程序传递参数为了传递参数给C程序,一般将参数压入堆栈中给C语言实现的swi异常处理程序传递一个指向这些参数的指针也可以把值写回到堆栈的合适位置,这样可以传回参数在特权模式下调用SWI当ARM运行于管理模式时在汇编中调用SWI可能会破坏LR_svc寄存器的值例如调用第二级SWI异常处理程序时。执行SWI指令后,系统会把CPSR寄存器的内容保存到寄存器SPSR_svc中,将返回地址保存到LR_SVC中。这样如果在执行SWI指令时,系统已经处于特权模式下,这时寄存器SRSR_svc和LR_svc中的内容就会破坏。解决方法:在调用SWI之前把SRSR_svc和LR_svc寄存器的值存入堆栈。第1级SWI异常处理程序T_bit EQU 0x20SWI_HanderSTMFD sp!,{r0-r3,r12,lr}MOV r1,spMRS r0,spsrSTMFD sp!,{r0}TST r0,#T_bitLDRNEH r0,[lr,#-2]BICNE r0,r0,#0xff00LDREQ r0,[lr,#-4]BICEQ r0,r0,#0xff000000BL C_SWI_HandlerLDMFD sp!,{r1}MSR spsr,r1LDMFD sp!,{r0-r3,r12,pc}^第2级SWI异常处理程序//memorymappedregistersVolatileunsignedparallel_output,parallel_input;VoidC_SWI_Handler(unsignednumber,int*param)//r0=SWInumber//r1=pointerroSWIparametersinmemory{Switch(number){Case0:parallel_output=param[0];break;Case1:param[0]=parallel_input;break;Default:break;}}应用程序中调用SWI功能举例#definesemiSWI 0x123456/*使用semihostingSWI输出一个字符*/_swi(semiSWI)voidsemihosting(unsignedop,char*c);#definewriteC(c)semihosting(0x3,c)Voidwrite_a_charater(int

ch){Chartempch=ch;Writec(&tempch);}复位异常复位异常在系统加电或复位时执行,它将进行一些初始化工作,具体内容与具体系统相关,然后程序控制权交给应用程序,因而复位异常处理程序不需要返回。复位异常处理程序一般执行以下步骤:设置异常向量表;初始化数据桟和寄存器初始化存储系统,如系统中的MMU等(如果系统中包含这些部件的话)初始化一些关键的I/O设备使用中断切换到合适的模式初始化C语言环境,跳转到应用程序执行未定义指令异常未定义指令异常在下面的情况下发生:ARM尝试执行一个真正的没有定义的指令ARM遇到一个协处理器指令,但这个协处理器在系统中并不存在ARM遇到一个协处理器指令,这个协处理器在系统中存在,但是ARM运行于非特权模式,于是拒绝这条指令这种机制可以用来通过软件仿真系统中的某些部件的功能例:如果系统中不包含浮点运算部件,CPU遇到浮点运算指令时,将发生未定义指令异常,在该未定义指令异常处理程序中可以通过其它的指令序列仿真该浮点运算指令。Thumb指令集不包括协处理器,因而不需要这种指令仿真机制。指令预取异常无论异常发生在ARM状态还是Thumb状态,返回指令都在地址lr-4处指令预取异常的处理取决于存储器管理机制如果系统中不包含MMU单元,指令预取中止异常处理程序只是简单的报告错误,然后退出。如果系统包含MMU单元,则发生错误的指令触发虚拟地址失效处理,在该失效处理程序中重新读取该指令。数据预取异常无论异常发生在ARM状态还是Thumb状态,返回指令都在地址lr-8处数据预取异常的处理取决于存储器管理机制如果系统中不包含MMU,数据访问中止异常处理程序只是简单的报告错误,然后退出。如果系统中包含MMU单元,数据访问中止异常处理程序要处理该数据访问中止。3.2ARM编程技巧3.2.1ATPCS介绍

-寄存器的使用规则子程序间通过寄存器R0~R3来传递参数。这时,寄存器R0~R3可以计作A0~A3。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。在子程序中,使用寄存器R4~R11来保存局部变量。这时,寄存器R4~R11可以计作V1~V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。寄存器R12用作子程序间的scratch寄存器,记作ip。在子程序间的连接代码段中常有这种使用规则。寄存器R13用作数据栈指针,记作sp。在子程序中寄存器R13不能

温馨提示

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

评论

0/150

提交评论