ARM的FIQ为啥比IRQ快

上传人:yo****e 文档编号:61675920 上传时间:2022-03-12 格式:DOC 页数:6 大小:35.48KB
收藏 版权申诉 举报 下载
ARM的FIQ为啥比IRQ快_第1页
第1页 / 共6页
ARM的FIQ为啥比IRQ快_第2页
第2页 / 共6页
ARM的FIQ为啥比IRQ快_第3页
第3页 / 共6页
资源描述:

《ARM的FIQ为啥比IRQ快》由会员分享,可在线阅读,更多相关《ARM的FIQ为啥比IRQ快(6页珍藏版)》请在装配图网上搜索。

1、ARM的FIQ为啥比IRQ快昨天被人问到ARM的FIQ为啥比IRQ快,没概念,因为没有用过,所有没有care,今天想起马上查了一下,其实原理很简单,其实工程的东西没有太多的理论,很多时候一点就透,所以工作经验的积累,项目历练是必不可少的!1。FIQ的优先级比IRQ高。2。FIQ模式下,比IRQ模式多了几个独立的寄存器。不要小看这几个寄存器,ARM在编译的时候,如果你FIQ中断处理程序足够用这几个独立的寄存器来运作,它就不会进行通用寄存器的压栈,这样也省了一些时间。3。FIQ的中断向量地址在0x 0000001C,而IRQ的在0x 00000018。(也有的在FFFF001C以及FFFF0018

2、)写过完整汇编系统的都比较明白这点的差别,18只能放一条指令,为了不与1C处的FIQ冲突,这个地方只能跳转,而FIQ不一样,1C以后没有任何中断向量表了,这样可以直接在1C处放FIQ的中断处理程序,由于跳转的范围限制,至少少了一条跳转指令。下面顺便转载FIQ和IRQ中断服务程序的编写:1外部中断的级别ARM处理器有FIQ和IRQ两级外部中断,它们都是由对电平敏感的低电平(LOW)信号激活进入处理器的。为了产生中断,CPSR中的相应禁用位必须清零。FIQ的优先级比IRQ高,具体表现如下:?当发生多个中断时,首先处理FIQ。?处理FIQ会导致禁用IRQ和后续FIQ,在FIQ处理程序启用之前,不会处

3、理IRQ和后续FIQ。这通常是通过在处理程序结束时从SPSR恢复CPSR来完成的。FIQ向量是向量表的最后一个入口,因此FIQ处理程序可直接放在该向量位置并从该地址顺序执行。这避免了跳转以及相关的延迟,并意味着如果系统有高速缓存,则向量表和FIQ处理程序可能都锁定在高速缓存中的一个块内。这一点非常重要,因为FIQ就是为了尽快处理中断而设计的。通过五个额外的FIQ模式编组寄存器,可以保存处理程序各次调用的状态,这也加快了执行速度。注意:中断处理程序必须包含清除中断源的代码。2 C语言编写的简单中断处理程序可通过使用_irq函数声明关键字来编写简单的C语言中断处理程序。可用_irq关键字来编写简单

4、单级中断处理程序,以及调用子例程的中断处理程序。但是,不能用_irq关键字来编写reentrant(重入)中断处理程序,因它对SPSR不进行存储或恢复。本文中,重入的含义是指处理程序能再次设置中断并能将其自身中断。_irq关键字:a.保护所有ATPCS易损坏的寄存器;b.保护所有被函数使用的其它寄存器(不包括浮点寄存器);c.通过将程序计数器设置到(lr-4)并恢复CPSR的初始数据值来退出函数。如果该函数调用了一个子例程,_irq除保护其它易损坏寄存器外,还为中断模式保护链接寄存器。从中断处理程序调用子例程如果从高级中断处理程序调用子例程,_irq关键字也将从堆中恢复lr_IRQ的值,以便它

5、能被SUBS指令使用,使得在处理完该中断后返回到正确的地址。下面示例说明了这一实现过程。高层中断处理程序在0x 80000000基地址读取存储器映射中断控制器的值。如果该地址的值为1,高层处理程序跳转到一个用C语言编写的处理程序。_irq void IRQHandler(void)volatile unsigned int*base=(unsigned int*)0x 80000000;if(*base=1)/which interrupt was it?C_int_handler();/process the interrupt*(base+1)=0;/clear the interrupt

6、用armcc编译,生成以下代码:IRQHandler PROC STMFD sp!,r0-r4,r12,lrMOV r4,#0x 80000000 LDR r0,r4,#0SUB sp,sp,#4 CMP r0,#1 BLEQ C_int_handler MOV r0,#0 STR r0,r4,#4ADD sp,sp,#4 LDMFD sp!,r0-r4,r12,lrSUBS pc,lr,#4 ENDP将其与没有使用_irq关键字时的结果比较:IRQHandler PROC STMFD sp!,r4,lrMOV r4,#0x 80000000 LDR r0,r4,#0CMP r0,#1 BLE

7、Q C_int_handler MOV r0,#0 STR r0,r4,#4LDMFD sp!,r4,pcENDP 3编写可重入中断处理程序如果中断处理程序在调用子例程前启用中断,并且发生了另一个中断,则在第二个IRQ发生时,会损坏存储在IRQ模式LR中的子例程的返回地址。这是因为处理器会自动将返回地址保存在IRQ mode的LR中,使得新中断可以覆盖子例程的返回地址。如果原先的中断中的子例程试图返回,则会导致无限循环。在跳转到嵌套子例程或C函数前,重入中断处理程序必须保存IRQ状态、切换处理器模式并保存新处理器模式的状态。在C语言中使用_irq关键字不会对SPSR进行保存和恢复,而这是重入中

8、断处理程序所要求的,因此必须使用汇编语言编写顶层中断处理程序。在ARMv4或更高版本中,如果需要进行特权访问,可以切换为系统模式。注意:这一方法适用于IRQ和FIQ中断。但是,因为FIQ中断需要尽快处理,而且通常只有一个中断源,所以,可能不必提供重入特性。在IRQ处理程序中安全地启用中断所需的步骤如下:1.构造返回地址并保存在IRQ堆栈中。2.保存工作寄存器、非被调用方保存的寄存器以及IRQ模式SPSR。3.清除中断源。4.切换为系统模式,并再次激活中断。5.保存用户模式链接寄存器和非被调用函数存储的寄存器。6.调用C中断处理程序函数。7.C中断处理程序返回时,恢复用户模式寄存器并禁用中断。8

9、.切换至IRQ模式,禁用中断。9.恢复工作寄存器和spsr_IRQ。10.从IRQ返回。下面示例展示了它在系统模式下是如何进行的。在lr_IRQ被推到栈顶后,寄存器r12和r14被用作临时工作寄存器。本例假设FIQ为永久启用。AREA INTERRUPT,CODE,READONLY IMPORT C_irq_handler IRQ SUB lr,lr,#4;construct the return address STMFD sp!,lr;and push the adjusted lr_IRQ MRS r14,SPSR;copy spsr_IRQ to r14 STMFD sp!,r12,r

10、14;save work regs and spsr_IRQ;Add instructions to clear the interrupt here;then re-enable interrupts.MSR CPSR_c,#0x1F;switch to SYS mode,FIQ and IRQ enabled.;USR mode registers are now current.STMFD sp!,r0-r3,lr;save lr_USR and non-callee;saved registers BL C_irq_handler;branch to CIRQ handler.LDMF

11、D sp!,r0-r3,lr;restore registers MSR CPSR_c,#0x92;switch to IRQ mode and disable;IRQs.FIQ is still enabled.LDMFD sp!,r12,r14;restore work regs and spsr_IRQ MSR SPSR_cf,r14 LDMFD sp!,pc;return from IRQ.END 6.3中断的优先化下面的示例最多可为32个中断源调度其相应处理程序。因为它用于常规中断向量(IRQ),所以从位置0x18跳转。外部向量中断控制器(VIC)硬件用于确定中断优先级,并在I/O寄

12、存器中提供高优先级的活动中断。在该示例代码中:IntBase存储中断控制器的基址。IntLevel保存包含最高优先级活动中断的寄存器的偏移量。R13假定指向一个小型满降序堆栈。十条指令后(包括跳转到本代码的那条指令)重新开启了中断。再经过两条指令即进入每个中断的特定处理程序,而所有寄存器均保留在堆栈中。此外,每个处理程序的最后三条指令在再次关闭中断的情况下执行,因而可以保证从堆栈中安全地恢复SPSR。;first save the critical state SUB lr,lr,#4;Adjust the return address;before we save it.STMFD sp!,

13、lr;Stack return address MRS r14,SPSR;get the SPSR.STMFD sp!,r12,r14;.and stack that plus a;working register too.;Now get the priority level of the;highest priority active interrupt.MOV r12,#IntBase;Get the interrupt controllers;base address.LDR r12,r12,#IntLevel;Get the interrupt level(0 to 31).;Now

14、 read-modify-write the CPSR to enable interrupts.MRS r14,CPSR;Read the status register.BIC r14,r14,#0x80;Clear the Ibit;(use 0x40 for the Fbit).MSR CPSR_c,r14;Write it back to re-enable;interrupts and LDR pc,pc,r12,LSL#2;jump to the correct handler.;PC base address points to this;instruction+8 NOP;p

15、ad so the PC indexes this table.;Table of handler start addresses DCD Priority0Handler DCD Priority1Handler DCD Priority2Handler;.Priority0Handler STMFD sp!,r0-r11;Save other working registers.;Insert handler code here.;.LDMFD sp!,r0-r11;Restore working registers(not r12).;Now read-modify-write the

16、CPSR to disable interrupts.MRS r12,CPSR;Read the status register.ORR r12,r12,#0x80;Set the Ibit;(use 0x40 for the Fbit).MSR CPSR_c,r12;Write it back to disable interrupts.;Now that interrupt disabled,can safely restore SPSR then return.LDMFD sp!,r12,r14;Restore r12 and get SPSR.MSR SPSR_csxf,r14;Restore status register from r14.LDMFD sp!,pc;Return from handler.Priority1Handler;.

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!