TI C66x DSP 系统events及其应用 - 5.4(event与ISR配置)

来源:互联网 发布:机器人设计软件 编辑:程序博客网 时间:2024/06/06 13:05

根据5.2中的讲解,当监控high priority queue的PDSP channel设定好后,那么与之对应的event就知道了(PDSP channel与event一一对应)(注意5.x讲的是中断的配置,并不是exception的配置,4.x讲的是exception)

中断event与ISR配置代码如下,目的是使event与ISR建立联系:

        /*Configure event*/
       Event_CombinerEventConfigration( systemEvent,  (TEventCombinerCallback)eventInterruptIsr, GLO_NULL));

因为中断的event combiner将event 4~127分为4个group,所以在Event_CombinerEventConfigration函数中要判断systemEevent属于哪个group以及group的哪一位,然后判断该event之前没有被exception使用过;有没有被其他的中断使用过;有没有配置到vector上,若有一个条件成立,则该systemEvent不能再次使用:

  u32 vectorIndex;
  evtVector = systemEvent >> 5;
  evtBit        = systemEvent & 31;
  evtMask   = 1<<(systemEvent & 31);

  /* (0100) Check if the event is an exception. */
  u32 eventIsException = (~gCorePacINTCRegs->EXPMASK[evtVector]) & evtMask; //EXPMASK是exception mask寄存器,若相应位为0,表示该event已被exception使用
  u32 eventIsInterrupt = 0;

  /* (0200) Check if the event is already combined. */
  u32 eventIsCombined = (~gCorePacINTCRegs->EVTMASK[evtVector]) & evtMask;//EVTMASK是中断mask寄存器,若相应位为0,表示该event已被其他中断使用
  EEventCombinerRetVal retVal;

  /* (0300) Check if the event is an interrupt. */
  for(vectorIndex = 15; vectorIndex >= 4; vectorIndex--) //因为CPU有12个中断输入INT4~15,所以有12个vector.
  {
          /* Check all the vectors to ensure nobody uses the event ID*/
          if (gPdb.startUpInfo.eventAtIntVector[DNUM][vectorIndex] == systemEvent) //DNUM是cpu编号,对于Nyquist,DNUM=0,1,2,3.
          {
                  /* The event is already in use */
                  eventIsInterrupt = 1;  //若找到有vector与该systemEvent有联系,表明该event已被设置过.
                  break;
          }
  }
  retVal = (eventIsException | eventIsInterrupt | eventIsCombined) ? EEventCombinerRetVal_AlreadyReserved: EEventCombinerRetVal_NoError;

  if (retVal == EEventCombinerRetVal_NoError)

  {

         /* (0400) Register event for being combined. */
         gCorePacINTCRegs->EVTMASK[evtVector] &= ~(1 << evtBit);//向EVTMASK寄存器注册该event,表明该event已经被该中断使用,其他的中断或exception不能再次使用

          /* (0500) Register callback. */
         gEventCombinerCallbacks[systemEvent].cb   = callback; //注册ISR,如文中提到的eventInterruptIsr就是callback
         gEventCombinerCallbacks[systemEvent].data = callbackData;

  }

代码中的callback函数,就与该systemEvent联系起来了,当该event被trigger了,该callback就会被调用。callback函数应该短小,并且最好在L1P,L2快速memory中。

对寄存器或者某些全局变量的操作一定要在中断disable的情况下进行,这里并没有给出代码。5.5中将会讲解ISR什么时候会被调用。

1 0
原创粉丝点击