查看: 2942|回复: 5

MDK-ARM中如何中断如何处理

[复制链接]

该用户从未签到

发表于 2014-1-24 16:02:58 | 显示全部楼层 |阅读模式
分享到:
    在ARM程序的开发过程中,对中断的处理是很普遍的、也是相当重要的。MDK-ARM使用的RVCT编译器提供了__irq关键字,用此关键字修饰的函数被作为中断出来函数编译,即在编译的过程中,编译器会自动添加中断处理过程中现场保护和恢复的代码,减小程序的开发难度,加快软件的开发过程。
    在理解__irq关键字的作用之前,先看一下ARM核对异常的处理过程。当产生异常时, ARM核拷贝CPSR寄存器的内容SPSR_<mode>寄存器中,同时设置适当的CPSR 位、改变处理器状态进入ARM 态和处理器模式,从而进入相应的异常模式。在设置中断禁止位禁止相应中断(如果需要)后,ARM核保存返回地址到LR_<mode>,同时设置PC为相应的异常向量。当异常返回时, 异常处理需要从SPSR_<mode>寄存器中恢复CPSR的值,同时从LR_<mode>恢复PC,具体的异常返。
回指令如下:
      ? 从SWI和Undef异常返回时使用:
      movs pc, LR;
      ? 从FIQ、IRQ和预取终止返回时使用:
      SUBS PC, LR,#4;
      ? 从数据异常返回时使用:
      SUBS PC, LR,#8
      在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM “∧”, 例如:
      LDMFD SP!, {PC}∧
      

      理解了ARM异常处理的过程以后,Realview MDK中__irq关键字的作用就容易理 解了。下面的函数为一个中断处理函数,其前面加了__irq关键字。
       __irqvoid pwm0_irq_handler(void)
         {
          //Deassert PWM0 interrupt signal
          unsigned int i=AT91F_PWMC_GetInterruptStatus(AT91C_BASE_PWMC);

          // Clear the LED's. Onthe Board we must apply a "1" to turn off LEDs
         AT91F_PIO_SetOutput(AT91C_BASE_PIOA, led_mask[0]);
         AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID1);

         AT91F_AIC_ClearIt(AT91C_BASE_AIC,AT91C_ID_PWMC);
         AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
        }
      当编译器器编译这个函数时,除了保存ATPCS规则规定的寄存器以外,还保存了CPSR及PC的值。在函数的返回时,还自动添加了SUBS PC, LR, #4和从SPSR寄存器恢复CPSR寄存器值的指令。用这种方式处理以后,中断处理函数可以和普通函数一样的使用。
      注意:中断处理都是在ARM模式下进行的,当源程序欲编译成Thumb指令时,这时,用__irq关键字修饰的函数仍然会被编译成ARM指令。如果源程序编译成在CORTEX M3上运行的指令时,关键字__irq对函数的编译没有任何影响,即编译器不会自动保存CPSR及PC的值,也不会添加SUBS PC, LR, #4和从SPSR寄存器恢复CPSR寄存器值的指令,因为CORTEX M3处理器硬件会自动处理这些问题,无需 软件开发人员关心。
回复

使用道具 举报

  • TA的每日心情
    开心
    2014-7-1 16:17
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-1-24 22:34:22 | 显示全部楼层
    围观                                                  
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-7-1 16:17
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-1-24 22:35:03 | 显示全部楼层
    现在用IAR的   不知道具体怎么操作啊                          
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-7-1 16:17
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-1-24 22:35:35 | 显示全部楼层
    都是用大神们写的底层啊  好像不用这么复杂的               
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-7-1 16:17
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-1-24 22:36:09 | 显示全部楼层
    求解                                          
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-9-23 05:09
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-5-30 11:25:55 | 显示全部楼层
    谢谢楼主分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-28 04:16 , Processed in 0.165236 second(s), 24 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.