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

分析2440test中的中断处理部分

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

  这里不用中断(interrupt)而用异常(exception),毕竟中断只是异常的一种情况,呵呵

  下面主要分析的是“中断异常”说白了,就是我们平时单片机里面用的中断!!!所有有器件

  引起的中断,例如TIMER中断,UART中断,外部中断等等,都有一个统一的入口,那就是中断

  异常IRQ!然后从IRQ的服务函数里面分辨出,当前究竟是什么中断,再跳转到相应的中断

  好了,这样的话就容易看的多了,很明显,HandlerIRQ还是一个标号,IRQ异常向量就是跳

  转到这里执行的,这里粗略看一下,应该是保存现场,然后跳转到真正的处理函数,那么很容易

  开始,预留一个变量,每个变量一个标号,预留的空间为4个字节,也就是32BIT,其实这里放的是真正

  接着,我们需要安装IRQ处理句柄,说白了,就是设置处理函数的地址,让PC指针可以正确的跳转。

  说白了就是将IsrIRQ的地址填到HandleIRQ对应的地址里面,前面说了HandleIRQ放的是中断处理的

  要理解这个代码,得先学学2440的中断系统了,INTOFFSET存放的是当前中断的偏移号,根据偏移就知道

  可以看到,前面几个是异常,从HandleEINT0就是IRQ异常的向量存放的地方了,这样就可以理解为

  道理很简单,HandleEINT0就是所有IRQ中断向量表的入口,在这个地址上面,加上一个适当的偏移量,

  首先,我们说了,HandleEINT0开始的一段内存里面,存放的就是中断服务函数的函数指针,ARM的体系

  的线个字节,这里就解释了,为什么这里为每个标号分配了4个字节的空间,里面

  放的就是函数指针!!!下面再看看怎么跳转,继续看IsrIRQ里面就实现了跳转了

  其实最核心就是这两句了,先查找到当前中断服务程序的地址,将他放到R8里面,然后出栈,弹出给PC

  那么PC很自然就跳到中断服务程序了。至于这里的堆栈问题又是一个非常棘手的,需要好好的参透ARM的

  中断架构,需要了解的可以自己仔细的阅读《ARM体系结构与编程》里面说的很详细。我们这里的重点

  最后,我们看看在C代码中是怎么安装终端向量的,例如看按键的外部中断,是怎么具体设置的,参看

  可以理解否?Key_ISR就是上面提到的按键中断服务函数,函数的名字,代表的就是函数的地址!!!!

  将中断服务函数的地址,注意了,是地址,这是一个U32型的变量。送到几个变量,我们以pISR_EINT0

  _ISR_STARTADDRESS有没有似曾相识的感觉?没错,刚才分析的汇编代码里面就提到了

  对,地址就是这里,然后_ISR_STARTADDRESS+0x20就是跳过前面的异常向量,进入IRQ中断向量的入口

  堆栈是向下生长的,所以SUBSP,SP,#4就相当于PUSHXX,但是这个XX这个时候并没有用,因为这里

  用的是强制移动SP指针实现的。然后得到服务程序的地址,再将这个值放回刚才预留的栈的空位上面,最后

  就是POP出R0恢复,并且将刚才得到的服务程序的地址送到PC,那么实现的效果就是跳转到HandleIRQ里面了。

  可以看出,这里将IsrIRQ的地址的值保存到HandleIRQ中,也就是说,上面的IRQ服务程序,这个时候实际

  怎么保存,操作SP,跟最后弹出到PC的部分和上面的例子一样,下面说说中间的计算部分

  计算偏移量,其实原理很简单,首先INTOFFSET保存着当前是哪个IRQ中断,例如0代表着HandleEINT0,1代表

  然后得到中断处理函数的向量表,这个表的首地址就是HandleEINT0,那么很自然的想到,怎么查表?那还不简

  单?HandleEINT0+INTOFFSET不就完了?基地址加偏移量就得到表中某项了,当然,因为这里是中断处理向量

  每一项占用4个字节,所以用lsl#2处理一下,左移2位相当于乘以4,偏移量乘以4,这应该很好理解的。

  我们这个例子找到的就是HandleEINT0,将里面的值读出来,里面放的是HandleEINT0服务函数的地址,这个

  看到没有?_ISR_STARTADDRESS不就是刚才说的那个异常向量的入口地址?加上一个0x20

  之后实际上指向的,就是HandleEINT0!!!这么说来,上面的意思就是,将Key_ISR处理函数的入口地址,送

  再来看Key_ISR,这是一个典型的服务程序,加了_irq作为编译关键字,告诉编译器,这个函数是中断服务程序

  得保存需要的寄存器,免得被破坏。具体可以参考《ARM体系结构与编程》P283页的描述。

  加上_irq关键字之后,编译器就会处理好所有的保存动作了,并不需要多关心。但是这个是ARM-CC编译器的关

  键字,GCC中并没有这个东西,所以GCC处理中断的时候最好还是自己保存一下。

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