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上qmss如何配置任意核之间通信?

Other Parts Discussed in Thread: SYSBIOS

1. 具体的应用场景;
    主要应用在视频会议系统中上多路音频混音、回声抵消等算法,后期还要用它来做视频的编解码。

2. 硬件环境;
    前期是在EVMEVMC6678上调试的,目前我们公司已经做了好几款板子应用了该芯片。

3. 软件架构,包括与外部的接口及DSP内部的软件分布;
    多路音频数据从PCIE接口传递给C6678,由Core0分发音频数据给其他Core,其他Core处理完后通知Core0将数据再传递给Pcie Complex通过网络发送给远端。
    我们基于pdk_C6678_1_0_0_19来开发的

4. 具体遇到的问题,或者估计可能产生的问题。
    在多核通信的机制选择上本想用高效率的qmss,但是提供的例子
    pdk_C6678_1_0_0_19\packages\ti\transport\ipc\examples\qmssIpcBenchmark只有Core0和Core1之间通信,我尝试修改代码,
    想实现Core0->Core1->Core2...Core7->Core0,发现数据只到Core1,Core2收不到Core1的数据,
    程序应该改对的,怀疑是不是sysbios里面关于qmss需要额外配置些什么?

  • 您好,

    首先非常感谢对应用的分享及问题的详尽描述,谢谢配合!

    sysbios中不会对qmss进行任何的配置,所多核之间使用navigator进行通信不会受到sysbios的影响。使用qmss进行核间通信时,主要涉及到RxQ及中断的配置,需要参考navigator手册中关于中断映射对应关系进行修改。请确认core2收不到core1的数据到底是停在哪一步?

  • 从应用程序上来看是在Core2调用MessageQ_get 函数超时,曾经在qmss的收发函数中加过打印,Core2没有收到中断,好像Core0倒反而像是收到中断了,所以我才怀疑是sysbios哪里要配置一下的;

    但是有一点我比较奇怪,同样的测试程序,配置成share mem方式是可以的,它不也要用到ipc中断么?难道它就不用配置中断映射吗?

  • 1. sysbios不需要配置,你们修改了什么?RxQ有进行修改没?

    2. 你是将程序放在share mem,就可以实现核间通信么?

  • 1、sysbios没改,RxQ不知道在哪里改,sysbios还是源码里面?

    2、不是说将程序放在share mem 中,MessQ通信底层不是可以配置成走qmss或shmIpc嘛,我是指在

    pdk_C6678_1_0_0_19\packages\ti\transport\ipc\examples\shmIpcBenchmark 的基础上改成Core0->Core1->Core2...Core7->Core0进行测试ok,对于应用来说都是调用MessageQ_get MessageQ_put,感知不到底层的。

  • 2天了还没有回复啊,活动一过回复就不勤快了,放假了?

  • 您好!

    在8核上运行,需要修改 .cfg文件:

    在 这句话里面  procNameList = ["CORE0", "CORE1"];

    添加 CORE2~CORE7.

  • .cfg我改测试代码时已经同步改过了:

           procNameList = ["CORE0", "CORE1", "CORE2", "CORE3", "CORE4", "CORE5", "CORE6", "CORE7"];

    这个修改我是知道的,前面Andy Yin说的RxQ要修改不知道是在哪里修改,或需要增加中断映射表?

  • 您好,

    QMSSIPCbenchmark的函数对QMSS进行了封装,不需要上层配置RxQ。该例子默认只实现了Core0到core1 IPC通信。注意main函数中获取与coreID相关的selfID参数,后续操作都限制了core0作为主核向其他核的IPC。可以先修改core1向core2发送IPC,修改判断为core1时向core2发消息。

  • 就是因为这个例子比较简单所以我们才在这个例子上学习qmss的应用,你说的main函数里面我都改过,我已经工作10年,从Ti的642开始就用了,这些demo我还是看得懂的。6678芯片我们专门成立了一个预研小组预研了几个月,这个问题也曾咨询过原厂支持,给我们的答复是参照qmss组件中的另一个较底层的demo,可那个demo需要用ccs5.1才能编译,ccs5.0是无法编译通过的,而这个简单的demo在改过之后又不能正常工作,无奈只能采用shmipc方式进行多核通信,因为shmipc这个demo我改过之后是能正常进行所有核之间的通信的!如果qmss没有特殊配置的话我想我没有理由搞不定它的!而且在mcsdk_2_00_07_19\demos\image_processing这个大型的例子里面也没有使用qmss,而是使用shmipc方式进行多核通信的,所以我很是怀疑qmss是不是有什么bug而不能在正常的应用中使用!

  • 您好,

    我试了一下这个例子,修改了两个地方:

    1. cfg文件修改为

    procNameList = ["CORE1", "CORE2"];

    2. bench_qmss.c中修改

    selfId = CSL_chipReadReg (CSL_CHIP_DNUM) ;为selfId = CSL_chipReadReg (CSL_CHIP_DNUM) - 1;

    然后就可以运行。

    有个建议:MCSDK中IPC QMSS通行的例子封装的太复杂,涉及面很广,不便于初期的评估学习,很是建议先熟悉Navigator,自己写一个简单的例子实现多核之间的通信。

  • 顶一下。

    同感,IPC QMSS例程封装的看不到QMSS是如何工作的。

    IPC的文档和例程都欠缺,很不容易上手。

    Navigator有例子么?

  • 参考PDK中的navigator例子

  • 这一步修改有什么目的?

    selfId = CSL_chipReadReg (CSL_CHIP_DNUM) ;为selfId = CSL_chipReadReg (CSL_CHIP_DNUM) - 1;

    每个核读取的CSL_CHIP_DNUM寄存器返回的是本身自己的核心编号,如Core1返回的是1,Core2返回的是2,你那样减1修改后岂不是又强制成Core0和Core1之间通信了吗?