基于ARM异常中断处理的方法解析.doc
《基于ARM异常中断处理的方法解析.doc》由会员分享,可在线阅读,更多相关《基于ARM异常中断处理的方法解析.doc(5页珍藏版)》请在三一文库上搜索。
1、基于ARM异常中断处理的方法解析介绍一种简洁、高效、灵活的ARM异常中断处理方法。在ARM中,由于所有的中断都使用同一个异常中断入口地址,即0x00000018。因此需要在异常中断处理程序中根据相应的中断号调用对应的中断服务函数。一般有两种处理方式:1. 在汇编中保存现场,然后调用C语言编写的中断处理程序,任务处理完成之后,再返回到汇编中恢复现场,并返回到断点。其中C语言编写的中断处理程序,通过switch语句对INTOFFSET进行判断,然后散转执行对应的服务函数。IMPORT IRQ_EXCEPTION0x00000018 LDR PC,=IRQ_ENTRYIRQ_ENTRYSTMFD S
2、P!,R0-R8,LRBL IRQ_EXCEPTIONLDMFD SP!,R0-R8,LRSUBS PC,LR,#4void IRQ_EXCEPTION()switch(INTOFFSET)case 0:break;case 1:break;缺点:1)所有的中断处理函数都必须在这个C文件中定义。2)中断处理函数不能再程序执行过程中被更换。3)由于不知道中断处理函数用到了哪些寄存器,因此保护现场时,需要把可能用到的所有工作寄存器都保护起来。再加上C语言中的判断,这些步骤都会增加中断响应时间。2. 使用关键字_irq来定义每个中断处理函数,由编译器来插入保护现场及中断返回的代码,由于编译器知道此函
3、数用到了哪些寄存器,因此它只保护被用到的寄存器。接下来的问题是,当产生中断时,如何直接调用对应的中断处理函数?一般会在内存中分配32*4个存储单元,存放每个中断处理函数的首地址,在汇编中,直接根据INTOFFSET从中断处理函数向量表中取出对应的函数首地址送给PC,直接调用对应的中断处理函数。C语言中需要借用函数指针将中断处理函数首地址写入到中断处理函数向量表里的对应位置上。IRQ_HandlerStart EQU 0x33FFFF000x00000018 LDR PC,=IRQ_ENTRY IRQ_ENTRYSUB SP,SP,#4 ;为存放中断处理函数首地址留出空间STMFD SP!,R0
4、,R1,R2 ;保护下面的算法用到的工作寄存器LDR R0,=INTOFFSETLDR R1,R0 ;取出中断号LDR R2,=IRQ_HandlerStartADD R0,R2,R1,LSL #2 ;计算中断号对应的中断处理函数在向量表中的位置LDR R1,R0 ;取出对应的中断处理函数首地址STR R1,SP,#12 ;存储到刚才预留的空间里LDMFD SP!,R0,R1,R2,PC ;出栈,数据从左向右恢复,最后将中断处理函数首地址给PC#define ISR_StartAddr 0x33FFFF00#define pISR_EINT0 (*(unsigned *)(ISR_StartA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ARM 异常 中断 处理 方法 解析
链接地址:https://www.31doc.com/p-3409299.html