您好、欢迎来到现金彩票网!
当前位置:彩之网 > 中断处理 >

ARM处理器架构异常中断处理

发布时间:2019-06-12 09:02 来源:未知 编辑:admin

  首先,中断是异常的一种。当发生一种异常时,处理器会进入不同的工作模式。ARM的异常和相应的模式之间的对应关系见下表:

  对于IRQ或者FIQ而言,还多一项变化:禁用相关的中断IRQ或FIQ,禁止同类型的其他中断被触发。(这也是自动实现的,因此正常情况下,ARM中断不可嵌套)

  2、从lr_mode中恢复内容到pc中,返回到异常中断的指令的下一条政令处执行.

  2440默认的有一个异常向量表,即发生某一个异常后,会根据异常向量表设置pc为相应的处理函数入口地址。

  下面,我们结合板子自带的2440test源代码中的2440init.s中的异常处理,来分析arm中断处理的实现。

  这里就是相应的 异常处理向量表。程序正常启动就跳转到resethandler,如果是发生中断就跳转到handlerIRQ。对于handlerIRQ,它是用一个宏实现的。

  因此,发生中断时,就会b HandlerIRQ,跳转到上面的代码进行执行。按照上面的流程,处理器会把HandleIRQ地址中所存储的数 付给pc指针,作为下一条指令的地址,然后执行。那么HandleIRQ地址中存储的数是什么呢?

  在上面的程序中,INTOFFSET表示的是中断号对于EINT0的偏移号。这样计算得到中断向量号之后,跳转到中断函数进行处理。对于,上面的程序奇怪的一点是没有看到恢复cpsr和pc指针。因此,可以推断,对于中断函数在ADS中有特殊的声明方式,如:static void __irq Uart_DMA_ISR(void)。像这种声明方式,在编译的时候,编译器会自动在函数的末尾添加恢复cpsr和pc的语句。另外, 寄存器r0-r12也是需要保护的,因为在中断函数和原来的上下文中都会用到,所以,我认为 编译器在中断处理函数中对r0-r12也进行了保护和恢复。

  另外,在ucosII中,对IsrIRQ函数进行了修改,我们后面再进行分析。

  所以,我们可以看出,对于2440init.s实现的异常处理,采用的是两级向量表机制。 第一级向量表是arm核自己实现的,发生相应的异常时,pc指针跳转到0x18地址中存的数,作为入口地址。 第二级向量表是由Handler宏实现的,继续跳转到 HandleIRQ地址中存的数,继续执行。

  而对于IRQ来讲,还有第三级的向量表,在IsrIRQ中,又会根据中断号,比如uart2的中断,跳转到 HandleUart2地址中 存的数,继续执行。

  在2440init.s中,并没有给HandleUndef等这些地址处赋值,因此,一旦执行到,程序就会跑飞。

http://ando2.com/zhongduanchuli/7.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有