edgar1989 发表于 2013-6-5 15:15:26

关于avr32中断问题求助

avr32的中断管理由硬件和软件协同完成。主要由文件intc.c,intc.h和vectoers.s三个文件完成,我的理解是:
其中intc文件主要是完成了中断源的注册,也就是说,中断组和中断号以及中断程序的入口地址获得是在该文件完成的。
vectoers文件主要定义evba以及一些中断操作。例如如下代码段:
Int0:
      SSRF    VECTORS_SR_GM_OFFSET                                    /* Set global interrupt mask (disable interrupts)         */
      NOP
      NOP

      MFSR    R12, VECTORS_SR_OFFSET
      BFEXTUR12, R12, VECTORS_SR_MX_OFFSET, 3
      CP.W    R12, VECTORS_SR_MX_EXCEPTION_MODE                     /* check execution mode                                     */
      BRHS    __exception_stack                                       /* if (R12 == {Exception, NMI}) then change interrupt stack */
                                                                         /* ... to exception stack                                 */

      MOV   R12, VECTORS_INT0                                       /* Pass int_level parameter to BSP_INTC_IntGetHandler       */
      RCALL   BSP_INTC_IntGetHandler
      CP.W    R12, 0                                                /* Test returned interrupt handler pointer                  */
      BRNE    OSIntISRHandler                                       /* if (R12 != 0) then, jump to the OSIntISRHandler          */
      RETE                                                            /* if (R12 == 0) it was a spurious interrupt then, return   */
                                                                        /* ... from event handler                                 */
当中断来到的时候,根据注册的相应信息,配合vectoers里面的中断向量,转跳至用户的中断程序入口。
以上这些可以算作是软件完成部分吧。。
问题来了:
对于avr32uc3a的架构,所需要的中断都已近注册好了,当中断来的时候,是硬件完成pc(程序指针)的转跳吗?另外,硬件会不会自动将当前sr,pc,lr以及通用的r0-r12压栈??
avr32到底是如何完成的第一次转跳的??
在此先谢谢各位了
页: [1]
查看完整版本: 关于avr32中断问题求助