搜索
bottom↓
回复: 3

请教【#pragma vector=IRQV 这句话是什么意思,帖子里有详细情况】

[复制链接]

出0入0汤圆

发表于 2011-2-14 18:07:47 | 显示全部楼层 |阅读模式
我在写AMR[LPC21XX系列]的  中断  程序的时候
每次在写中断函数时,都要有一句
/////////////////////////
#pragma vector=IRQV
/////////////////////////

#pragma vector=IRQV  /////////////////////////////////////////////这一行有什么用? 里面的vector是不是和程序里定义的vector对应的?
__irq __arm void irq_handler (void)
{
void (*interrupt_function)();
unsigned int vector;/////////////////////////////////为何还要定义unsigned int vector 呢?
  vector = VICVectAddr;     //获得中断向量
  interrupt_function = (void(*)())vector;
  if(interrupt_function != NULL)
  {
     //调用中断指向的函数
  }
  else
  {
    VICVectAddr = 0;      //清除在VIC中的中断
  }
   
}

我看了配置文件里【LPC2102.h】是这么定义的
#define IRQV            0x18  /* Normal interrupt                   */
//////////////////////////////////////////////
请高手告诉我这句话是什么意思? 为什么在写中断服务程序的时候都要有这一行呢? 中断服务程序为什么还要在 unsigend int vector呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-3-28 14:39:15 | 显示全部楼层
本人也正在学习ARM,对此也有同样问题,期待 大虾  解答啊…………

顶个……%……

出0入0汤圆

发表于 2011-3-28 17:12:51 | 显示全部楼层
回复【楼主位】njlz0707mm
-----------------------------------------------------------------------

刚才试了下,将程序里面的vector换成别的标识符,如v,结果编译出错。
然后将#pragma vector里面的改回vector,中断服务程序里面的写成v,编译通过,下载进开发板,运行成功。
因此,我“猜”,#pragma后面的是一个固定形式的参数,而服务程序里面的只是为了将中断向量地址取出的作用,,,
个人观点,期待验证、纠正…………

出0入0汤圆

 楼主| 发表于 2011-3-28 22:15:48 | 显示全部楼层
问题已搞懂


IAR for arm 中断处理写法

方法1:

启动文件中:(默认启动文件也是这样)

       org 0x18
       ldr pc,[pc,#-0xFF0] ; 直接跳转到用户中断处理函数

直接写用户中断函数
       __irq __arm void Tmr0_IntOnMR0_isr(void)
      {
                   ............
               }

          __irq __arm void Tmr1_IntOnMR0_isr(void)
      {
                   ............
               }


方法2.

启动文件中:(默认启动文件也是这样)

       org 0x18
       ldr pc,=irq_handler        ;跳转到公共中断处理函数,再分支到具体功能的中断处理函数中


       __irq __arm void irq_handler (void)        //公共中断处理函数,检查VICVectAddr是否为空
       {
         void (*interrupt_function)();
         unsigned int vector;

             vector = VICVectAddr;     // Get interrupt vector.
             interrupt_function = (void(*)())vector;
         if(interrupt_function != NULL)
             {
            interrupt_function();   // Call vectored interrupt function.
             }
             else
             {
            VICVectAddr = 0;    // Clear interrupt in VIC.
             }
       }


具体功能的中断处理函数
      void Tmr0_IntOnMR0_isr(void)
      {
                   ............
               }

          void Tmr1_IntOnMR0_isr(void)
      {
                   ............
               }


方法3.

       使用#pragma vector不管启动文件如何写法,

       #define IRQV          0x18
       #pragma vector=IRQV
       __irq __arm void irq_handler (void)
       {
       void (*interrupt_function)();
       unsigned int vector;

      vector = VICVectAddr;     // Get interrupt vector.
      interrupt_function = (void(*)())vector;
      if(interrupt_function != NULL)
      {
         interrupt_function();   // Call vectored interrupt function.
      }
      else
      {
         VICVectAddr = 0;    // Clear interrupt in VIC.
      }
       }

       具体功能的中断处理函数
      void Tmr0_IntOnMR0_isr(void)
      {
                   ............
               }

          void Tmr1_IntOnMR0_isr(void)
      {
                   ............
               }
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表