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.

6678 多核导航器 中断



您好!

        核0向核1发消息(消息在描述符的buff里,在DDR中),那么核0向721队列(使用的50事件)push进有效的描述符,

并使用两条mfence指令保证将描述符压进721队列,那么PDSP将该描述符的地址写到核1的List Address,

并向核1上产生一个中断,告知描述符的地址。不知道我这样理解对不对?

        中断的处理参考了论坛提供的Keystone1包里的Multicore_Navigator工程中断处理的代码,具体如下:

      1. /*read interrupt status*/ 通过读中断状态寄存器gpQM_INTD_regs->STATUS_REG0、2、4.

      2. /*clear interrupt status*/清除gpQM_INTD_regs->STATUS_CLR_REG0、2、4的状态

      3.在List Address里读取描述符的地址,打印出消息(测试用)。

      4. 遍历各通道,反复执行下面两步:

          gpQM_INTD_regs->INTCNT_REG[i]= 1 ; 写Interrupt N Count Register,一直没搞懂这个寄存器是干嘛的?

          gpQM_INTD_regs->EOI_REG= i+2;    写EOI寄存器,重新允许该通道触发下一个中断

       5.回收描述符

     在调试中,我发现以下问题,具体如下:

     1.PDSP写到List Address里的描述符地址有时候不是描述符真正的地址(一般为0),这时往往导致消息的出错。

      请问怎么保证那个地址是准确的?或者有没有比较好的纠错或容错办法?

     2. 两条mfence指令紧跟在push描述符操作后面能否保证描述符确实入队了?如果不能该怎么保证?

     3. 除开中断处理的第三步和第五步,该中断处理流程有没有问题?会导致什么问题?

          Interrupt N Count Register具体作用是什么,应该怎么正确使用?

     4. 我根据中断处理第三步打印出的消息信息,发现部分消息出错,可能是什么导致的,该怎么处理?

  最近调试进一步发现,8核同时给自己发消息或者会出现部分消息不准确,同时伴随着PDSP写到List Address里的描述符地址不准确。

   而同时我只要把8核发消息之前同步的代码(同步之后让8核同时给自己发消息)去掉后,就不会出现上述现象,或者8核同时给某一个核发消息

   也不会出现上述情况,请问这是什么导致的?

       1. 8核能不能同时给自己发消息,比如8个核上能不能同时产生4号中断并响应?

       2. 如果我不想使用PDSP来产生中断,能不能自己手动触发50事件产生4号中断?具体该怎么做,有没有参考的例子?

     请各位专家帮我分析分析,不胜感激!

  • 如果描述符或buffer在DDR中的话,需要在PUSH descriptor之前writeback cache。

    另外比较常见的问题是消息太频繁,中断来不及处理,这种问题往往可以通过加大accumulation list buffer(从而降低中断频率)来解决。

    Interrupt N Count Register在文档里有描述,"Reading the register returns the count. Writing a non-0 value to the register subtracts that value from the count. Writing a 0 clears the count. Note, clearing the count does not clear the interrupt (the EOI Register still needs to be written)." 这个说明不清楚吗?

    如果不用PDSP产生中断的话,还可以用queue pend中断,论坛提供的Keystone1包里的Multicore_Navigator工程中有相关例程。