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.

关于qmInfraMCExampleProject的问题



您好,

请问怎样用QMSS实现核间通信,

1. 我看之前有人说在core0中建立TxQ,在core1中建立RxQ,就可以通信了,那么是不是flow应该指向RxQ,flow也应该是在core1中配置的吧?

2. 在qmInfraMCExampleProject例程中,TxQ 和RxQ都是在core0中建立的,那怎么传输的?

3. accumulator的cfg.channel是指High Priority Channel 吗?那是不是应该和queue相对应?为什么我将cfg.channel设置为1后,无论我的RxQ是多少,都是由core1接   收的?

  • 您好!

    1. flow 哪个核配都可以;不过一般情况由core0 完成初始化。

    2.把descriptor放到RxQ, core1 去读相应的RxQ即可。

    3.channel 和queue没有对应关系

  • 谢谢,

    我还是不太理解为什么将accumulator的cfg.channel设置为1后,都是由core1接收的?

    我想再问一些QMSS的基本概念:

    1,同号的Tx channel和Rx channel应该是连在一起的吧,就是说我们在建立的时候应该是使用相同number的Rx和Tx  channel,比如说Tx channel0和Rx channel0?

    2,从Multicore Navigator 的table5-1~table 5-5中,是不是可以认为queue和channel是相关联的,比如说queue 800自动对应channel 0,queue704自动对应channel 0?那是不是将packet放入queue800,将自动传到queue704?

    4,flow中的qnum,是指RxQ吗?就是说接收的queue是由flow决定的还是像我上面说的由queue number本身决定的?

    5,queue800~queue831为QMSS TxQ,那是不是我们在使用核间传输时,都要用这些queue作为TxQ ?

    6,Tx completion queue 的用途是什么?

  • 您好

     

    1. channel(pdsp的channel)与core之间有对应关系,而queue与core 没有关系;

    比如channel 0 对应core 0,channel 1对应core 1;

    所以当你设置cfg.channel为1时,数据都由core 1接收

    2. infrastructure mode是这样的,详见下图(User guide Q&A部分)。

     

    3. 有两个channel概念,PKTDMA中的channel及PDSP中的channel

    Tx queue和 Tx channel(PKDMA的channel) 是对应的,queue 800对应channel 0

    queue 704 和 channel(pdsp的channel)建议 是对应的,

    但是可以设置的,不是固定的关系。见下图。

     

    4. RxQ由 Rx flow决定。

    5. 建议这样,但你用其他queue也是可以的;相对其他queue,queue800~queue831有硬件信号量的好处,

    即当descriptor放到这些queue里面,QMSS会自动POP这些descriptor出来并传给PKTDMA,而其他queue你需要手动操作。

    6. Tx completion queue 用于回收descriptor

     

  • 谢谢,您的回答对我的理解有很大的帮助!

    我想再问下如下几个问题:

    1,qmInfraMCExampleProject中在core1, core2 和core3中建立的rxFreequeue, txFreequeue和 txCompletionQueue是不是没有用到,就是说可以不用建立的?

    2,qmInfraMCExampleProject中是通过每个核都建立了hiPrioList,且每个hiPrioList在L2中的local地址相同,然后各核求出core0的hiPrioList的全局地址,然后从中找到传递的descriptors?那么这是不是都是在core0发送并且接收到packet,并没有通过QMSS将数据从core0传递到其他核,而是通过其他核找到core0中的hiPrioList然后获得packets的?

    3,一般从core0发送信息t到core1中,需要怎么建立队列,是否需要在core0中建立TxQ,在core1中建立RxQ?

  • 您好!

    1. core0 完成queueopen即可。其余core获得 使用queue的handler.

        core1 ~3 如果没用到 rxFreequeue, txFreequeue和 txCompletionQueue,是可以省去queueopen

    2. 你的理解正确。core1~3读取core 0 的hiPrioList

    3. core 0 完成TxQ,RxQ 建立,core 1 负责中断处理即可。

  • Bruce Chen,您好!我想再问几个问题:

    1,QMSS的例程每次运行后,为什么必须重新launch configuration而不能reset?

    2,loopback模式中,Tx descriptor中的SOURCE_TAG_LO的具体作用是什么?跟前面设置的rxFlowCfg.flowIdNum有什么关系或者区别么?

    3,6678中QMSS的主要作用是什么,核间通信数据传输的话可以用EMDA,同步的话可以用semaphore等,相对其他的核间通信方式有什么优点?

  • 您好!

    1. 你cpu reset, system reset 后,再重新加载下gel.

    2.rxFlowCfg.flowIdNum是Rxflow的num

      Tx descriptor中的SOURCE_TAG_LO的具体作用: 指示loopback 模式下使用 哪一个 Rxflow number.

    3.QMSS包含queue manager,pdsp,pktdma三个部分,主要用于核间数据传输,核间通信,任务管理。

    数据传输由PKTDMA完成,核间通信由PDSP产生中断实现通信,

    任务管理主要由queue manager完成任务调度,比如说多个任务要用到FFTC加速器,可以将这些任务放到同一个queue里面,当然也可设置优先级。

    优点:

    1.硬件queue manager的引入可以更好的完成任务调度。

    2.配置好QMSS后,只需要执行 push descriptor,即可产生中断给DSP核。无须DSP核的参与。

  • 哦, 那我想用core0不断的依次给另外7个core的L2传输数据,并且在每次传输完成时触发相应core的中断程序,那么,PDSP应该怎么设置,需要设置7个accumulator么,那不得每传一次就得重新配置一次accumulator,就是说当core0给core1传完,然后给core2传时需要重新配置,当再次给core1传时又需要重新配置?

    Rxflow是不是也是得设置7个?

    有什么例程里体现了queue manager做的任务调度呢?

  • Protocol-specific data是用来做什么的,它的值将由谁接收?

  • 您好,

    首先回答您关于core0给多个核发中断触发的问题:

    可以充分使用PDSP提供的reclamation and accumulator功能,具体功能可以先学习Navigator user guide中关于PDSP一节。具体的思路为,配置一个RxQ为reclamation queue由PDSP监视,这样每个push到RxQ的descriptor就会被回收到该descriptor所指定的return queue中;所以如果将return queue配置为accumulator 由PDSP监视就可以产生中断到相应的核。因此结合使用reclamation and accumulator功能就只需要使用一个flow,注意的是对RX FDQ中descriptor的return queue配置为每个核对应的accumulator queue即可。可以结合参考pdk中multicore navigator的例子。

    Protocol-specific data俗称PS域,在不同的navigator device中有不同的特殊应用,可以用作透传信息,结合配置descriptor 的ps域,及RX flow就可以将该信息透传到接收侧指定的位置。具体参考flow的配置。

  • 感谢Andy Yin,

    我还有些不明白,我的Rx FDQ也只配置一个么,里面放7种descriptor?那我如何能控制每次pop的descriptor是我需要的那个descriptor呢?

  • RxFDQ一个就可以,descriptor在RxFDQ的顺序根据你的需要一次push进去排列存放就好。

  • 您好,

    我试着改为了reclamation queue,但是push到RxQ的descriptor没有回收到return queue中,请问,除了改为reclamation后,还需要还什么,RxQ的类型有什么要求么?

  • 您好,

    我试着改为了reclamation queue,但是push到RxQ的descriptor没有回收到return queue中,请问,除了改为reclamation后,还需要还什么,RxQ的类型有什么要求么?

  • 您好,

    我试着改为了reclamation queue,但是push到RxQ的descriptor没有回收到return queue中,请问,除了改为reclamation后,还需要还什么,RxQ的类型有什么要求么?

  • 您好,

    我试着改为了reclamation queue,但是push到RxQ的descriptor没有回收到return queue中,请问,除了改为reclamation后,还需要还什么,RxQ的类型有什么要求么?

  • Bruce Chen:

    您好,

    我根据qmInfraMCExampleProject改写了个程序是用core0来分发数据给core1~core7,完成后会触发相应core的中断函数;如果我的程序串行,即core1中断函数执行完,再给core2发数core2再执行中断函数……,程序执行是正确的;但是如果程序并行起来,即core1在执行中断函数的同时,也触发core2,core3……的中断函数,程序有时会跑飞,有时会莫名其妙的多产生中断,即产生的中断函数多于push descriptor到队列的次数。我觉得这应该是同时执行中断函数某些资源会冲突,但是具体是什么冲突了我找不到?(Tx channel和Rx channel都初始化为channel 0, RxQ我用的705~711,中断的eventID我都用的48,channel用的1~7,触发门限都是设为一个packet)什么情况,可能没有push descriptor也会触发中断函数?用于放descriptor的hiPrioList,需要每次都清0么?