ARM 中断和异常.doc_第1页
ARM 中断和异常.doc_第2页
ARM 中断和异常.doc_第3页
ARM 中断和异常.doc_第4页
全文预览已结束

下载本文档

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

文档简介

2012-2-13ARM_异常和中断问题1.中断向量表为于存储器的什么位置? ARM7系列,除ARM720T可以放高端地址,ARM9或更高都放高端地址上。 2.FIQ或IRQ异常返回指令是什么? 答案见下面。 3.什么类型的异常优先级最高? 复位(Reset) 4.什么指令可以放在中断向量表? B 指令(优点:操作方便;缺点:范围PC正负32MB) 为什么BL不可以? MOV (优点4G范围内不受地址范围,但是受合法立即数的限制) LDR 不受空间限制,不受立即数限制,但它是伪指令,编译器自动转换为 LDR PC,PC,#offset 缺点offset的范围是 正负40955.FIQ的什么特点使得它处理的速度比IRQ快?(面试题) FIQ向量位于向量表的最末端,不需执行跳转指令,可以往后直接执行ISR FIQ有5个的私有寄存器(r8_fiq到r12_fiq),异常处理时不需要考虑保护及异常处理返回时的恢复 6.在嵌套的中断处理程序中,如何确保LR没被破坏? 模式的切换一、异常处理二、异常返回指令 1.MOVS PC,LR当PC作为目的寄存器时,S 表示pc给lr的同时,恢复SPSR_到CPSR 2.从SWI(管理模式)和undef异常返回:MOVS PC,LR 3.从FIQ, IQR和预取异常(prefect abort)返回:subs pc, lr, #4 4.从数据异常(Data Abort)返回:SUBS PC, LR, #8 5.如果LR之前被压栈的话使用LDM“”: LDMFD SP ! , PC三、异常的优先级 1.先理解下中断的优先级(嵌套。)高优先级可以中断低优先级的;1.异常在当前指令执行完成之后才被响应。 2.多个异常可以在同一时间产生 3.当高优先和低优先级同时出现异常时:异常指定了优先级和固定的服务顺序。(Reset最高,Undefined 最低)四、向量表指令 B MOV LDR五、异常处理中的工作 1.与异常发生相关的模式改变意味着所调用的异常处理程序至少访问: 私有的SP_(堆指针) 私有的LR_(链接结存器) 私有的SPSR_(备份程序状态寄存器) 在FIQ异常处理中,另有5个私有的通用寄存器(r8_fiq - r12_fiq) 其他寄存器是所有模式共用的。 2.异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态 3.这可以通过将任何正在使用的寄存器的内容保存在堆栈中,并在返回前恢复来实现。六、中断处理 1.ARM 有2级外部中断FIQ和IRQ; 什么是外部中断?外部中断一般是由计算机外设发出的中断请求,外部中断是可以屏蔽的中断,即可以利用中断控制器可以屏蔽这些外部设备的中断请求。从内核的角度,nFIQ和nIRQ(2根中断线);从硅片的角度 SFR(特殊功能寄存器)适用于管理外设,有地址, 通用寄存器,实现通用的目的,无地址可言 2. 3.注意:通常中断处理程序总是应该包含清除中断的代码。七、FIQ和IRQ 1.当多个中断产生时,CPU优先处理FIQ 2.处理FIQ时禁止IRQ,知道FIQ处理完成; 3.可以有多个FIQ中断源,但是考虑到系统性能应避免嵌套。八、C语言中的简单中断处理程序 1.在C中可以在函数定义时使用关键词“_irq”(只能IDE编译环境中,armcc) 2.程序退出使用正确的返回指令(修正pc = lr 4 并从spsr恢复cpsr) 3.启动代码,写好了堆栈的分配(1097行)九、中断处理函数的3大特点 1.所有的中断不能显示调用,必须中断触发,被动执行 2.中断处理函数,不能传参(外设中断,swp不是外设触发的) 3.外设中断不能有返回值十、中断重新使能的问题 1.当另外一个中断抢先当前中断,如果程序员使用下边特殊的步骤来防止系统状态丢失,中断可以嵌套 保存IRQ状态的LR(LR_irq) 保存IRQ状态的SPSR(SPSR_IRQ) 2.当中断可重入时(不可重入就是中断不能被打破),在中断处理程序中使用“BL”必须特别小心,如果第2个中断产生,BL调用的返回值(LR_irq)可能被冲掉,子程序将错误的返回,导致无限循环。解决方法:在使用”BL”之前改变模式(通常使用sys系统模式LR_usr)来避免LR_irq被冲掉。 3.处理程序结束后,必须切换回IRQ模式,同时禁止中断(来避免在恢复SPSR_irq到一个临时的寄存器中后被冲掉)十一、软中断1.用户主动调用SWI2.SWI调用 1.汇编中SWI的调用使用“SWI中断号”实现; 例如: SWI 0x12 2.小心在汇编中如果SWI调用时处于Supervisor模式将会冲掉LR_SVC(管理模式下的LR)。 解决方法:在SWI调用之前对LR_svc压栈保护。(因为不能预知什么IRQ会发生)3.传递参数到SWIs,C语言中,关键字“_swi”允许最多4个参数,使用r0-r3来传递,注意:因为SWI调用将切换到supervisor模式,所以不能采用堆栈来传递参数(因为模式切换,SP也伴随切换,即就找不到之前模式下栈的位置)函数的申明:_swi(0x123456) void hander(unsigned op, char *s);函数的调用:hander(0x4, “hello”);4.存取SWI号 1.ARM核中不提供直接传递软中断(SWI)号到处理程序的机制。 2.SWI处理程序必须定位SWI指令,并提取SWI指令中的常数域(软中断号) 3.为此,SWI处理程序必须确定SWI调用在哪一种状态(ARM/Thumb) 4.通过ARM状态下LR-4,Thumb状态下LR-2,来确定SWI指令的位置。C/C+和汇编的混合编程一、优化级别a) O0b) O1c) O2二、自动优化a) C中关键字,Volatitle的作用:告诉编译器不要对其进行优化优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。三、内嵌函数inline(执行时间没有调用时间长时?)a) 内嵌函数通过删除子函数调用的开销来提高性能。四、C/C

温馨提示

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

评论

0/150

提交评论