This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6678的SRIO中断问题



TI工程师您好,我使用的是C6678,现在通过SRIO接收来自FPGA的数据,

1、当接收到doorbell触发中断时只能进入一次中断服务函数,这是为什么呢?中断服务函数如下:

void test_isr_handler (void* handle)
{
  Uint16          doorbellStatus;
  hnd = CSL_CPINTC_open (0);
  printf("receive a interrupt from SRIO\n");
  INT_Flag = 1;
  // 使主机中断失效
  CSL_CPINTC_disableHostInterrupt (hnd, 10);
  // 清除系统中断
  CSL_CPINTC_clearSysInterrupt (hnd,116);
  // 使能主机中断
  CSL_CPINTC_enableHostInterrupt (hnd, 10);
  // 获得正在等待的doorbell中断状态
  CSL_SRIO_GetDoorbellPendingInterrupt (hSrio, 0, &doorbellStatus);
  // 如果有doorbell中断正在等待,则清除正在等待的doorbell中断,以等待进入下一次中断
  CSL_SRIO_ClearDoorbellPendingInterrupt (hSrio, 0, doorbellStatus);
}

2、INT_Flag标志位在别的函数中被调用时值始终是0,这是为什么?

3、选择INTDST4的时候可以配置interrupt rate,看了手册对这不是很明白,请问中断速率是什么?

  • 1、有没有清除doorbell标志,参考这个帖子:
    e2echina.ti.com/.../78807
    2、这是参考的哪个例程?
    在别的函数中始终是0?你程序上的INT_Flag不是只有进入ISR才会被置1吗?
    3、控制中断响应间隔。
  • 1、 CSL_SRIO_GetDoorbellPendingInterrupt (hSrio, 0, &doorbellStatus);
    // 如果有doorbell中断正在等待,则清除正在等待的doorbell中断,以等待进入下一次中断
    CSL_SRIO_ClearDoorbellPendingInterrupt (hSrio, 0, doorbellStatus);程序中这两句就是对doorbell标志的清除,请问清除doorbell标志需要在进入到服务子函数就立即清除吗?
    2、SRIO是参考stk进行的修改,中断部分是参照cpIntc.c进行的修改,INT_Flag在别的函数中有if(INT_Flag),等待INT_Flag置1,但是中断服务函数执行完之后,INT_Flag仍然是0
    3、interrupt rate应该怎么设置寄存器?怎么配置INTDSTn_RATE_CNTL和INTDSTn_RATE_DIS寄存器
  • 1、不是立即清除,是等cpu读完ICSR之后再清除。具体流程可以看一下srio手册2.3.9.3章节。
    2、INT_Flag在哪里清零了吗?在你贴出来的代码里没看到。
    3、STK的代码里有KeyStone_SRIO_Init_drv.c .

  • 1、INT_Flag的调用程序如下:
    void user_ser(void)
    {
    while(1)
    {
    if(INT_Flag)
    {
    printf("waiting next interrupt");
    INT_Flag=0;
    }
    }
    }
    程序执行完中断服务函数之后回到此函数if(INT_Flag)处,但是INT_Flag的值仍然为0;
    2、KeyStone_SRIO_Init_drv.c中因为使用的是INTDST16,所以、没有Interrupt rate的配置,如果interrupt control reg[0]=1,选择INTDST4的时候需要配置Interrupt rate,这个是跟我隔多长时间响应一次doorbell有关系吗?我怀疑是不是doorbell发送太快导致dsp来不及响应
    3、请问DSP对FPGA发送过来的doorbell是自动响应的吗?
  • Interrupt pacing requires DSP core rewrite INTDSTn_RATE_CNT register after each interrupt service to enable the next interrupt, otherwise, the interrupt will not be trigger again regardless of the internal interrupt status changes. This is the common reason user only sees one SRIO interrupt。
    看一下是不是这个原因造成的。