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 MultiProc_getNumProcessors()函数问题请教



HI,

       最近在调试C6678 的QMSS八核之间通信,在学习demo代码\pdk_C6678_1_0_0_16\packages\ti\transport\ipc\examples\qmssIpcBenchmark。

       代码里通过 MultiProc_getNumProcessors()来获取已经触发的2个核通信,但是我需要触发8个核之间通信,

      在调试过程中,我刚开始已经触发了8个核了,但是通过函数去获取核,一直获取到两个(在demo代码中是core0和core1的QMSS通信),

      因为函数封装在TI库里,无法看到函数实体,不知道如何实现的。

     如下代码和打印语句:

 代码:if (numCores == 0) {

      numCores = MultiProc_getNumProcessors();
      DEBUG_PRI("numCores = %d.\n",numCores);
      }
-----------------------
打印:[C66xx_0] numCores = 2.

请问,我在代码刚开始的时候已经触发了8个核了,但是获取的核为什么只有两个?有其他地方需要配置么?

谢谢

 

  • 您好!

    这是一个bios 工程,需要配置  .cfg 文件。

    如下图,procNameList配置工作的核号:

  • 您好!

    此路径下 C:\Program Files\Texas Instruments\ipc_1_24_00_16\packages\ti\sdo\utils

    multiproc.c ,有函数 原型,你可以看一下。

  • 谢谢 Bruce ,这个问题已经解决了。

    但是发现一个新的问题,现在八核触发起来后,core0不能和core1以外的其他核通信,感觉demo是core0和core1之间QMSS通信的,应该有相应的代码操作。但是这部分代码尚未找到。代码中修改 if (selfId == X)也未能实现(x=1,2,3,4,5,6,7),应该有其他代码相关。还在寻找相关代码中~

    请问Bruce我的理解对么?如果是的话,这部分代码是哪块?谢谢

  • 您好!

    的确如楼主所说,这个project 中,核间是loop通信 ,即0->1,1->2 .....

    可以参考 measure_latency() 中代码 实现 core0与其他核的通信。

  • hi ,Bruce

    我在开启八核后调试会出现如下错误:

    [C66xx_0] tsk0. selfproc=0 nextQueueName (CORE1) openned, nextQueueId=65536

    [C66xx_0] tsk0. selfProc=0 calling MessageQ_put(nextQueueName=CORE1). msg=0xc040080

    [C66xx_0] ti.sdo.ipc.MessageQ: line 383: assertion failure: A_invalidMsg: Invalid message

    [C66xx_0] xdc.runtime.Error.raise: terminating execution

    这一部分打印信息也正是在函数measure_latency()中,根据打印信息又去找相应函数在Message.c中

    的MessageQ_put()函数,如下:

    MessageQ_put(MessageQ_QueueId queueId, MessageQ_Msg msg)

    {...

       383行:Assert_isTrue((msg != NULL), ti_sdo_ipc_MessageQ_A_invalidMsg);

    ...

    }

    从这个语句中判断,它在判断这个Msg是否有效,但这个msg=0xc040080,是在MSMC的地址中。 在.map文件中

    未找到此地址。

    但是当我只开启core0和core1也是此地址,但是运行正常。

    请问这个是什么问题?

  • HI Bruce,

    还想问下“核间通信是loop通信”这句是什么意思?

    是这个代码工程用了这个loop通信,还是QMSS就是loop通信的机制?

    因为我想要做八个核同时用一个QMSS的region。

  • 您好!

    1.仅 在这个 工程中通信方式 是loop的;

    2.楼主 测试 是 simulator 还是 evm?

  • 您好,

    我是通过仿真器调试的。

    1.在调试过程中,发现msg的地址会变化,基本上得出一个问题,通过打印信息看到

    tsk0. selfProc=0 calling MessageQ_put(nextQueueName=CORE1). msg=0xc040080      -----(八核的msg地址)

    tsk0. selfProc=0 calling MessageQ_put(nextQueueName=CORE1). msg=0xc002a80      -----(core0,core1 msg地址)

    而八核的msg地址就会出现如上所说的错误,两核就运行正常,感觉还需要修改部分配置把 ?

    请问,您能帮我看下,如果是八核QMSS的话,需要修改哪些配置?

    谢谢

  • HI,Bruce

         在工程汇中,函数measure_latency() 是什么作用,阅读代码后,没有明白其中意思,measure_latency()函数被core0和core1都使用,在阅读代码中,感觉core0多做了MessageQ_get()了100次,(循环里面)。感觉逻辑有些不对。

    请问这个measure_latency() 这个函数作用是什么?因为在后面的代码中thruputTxRxPairPreallocFullLoad(),core0发送和core1接收都是匹配的。

    因为在8核调试中在measure_latency()会报错,而这个错误没理解,请Bruce和其他高手帮我看下八核下如何实现QMSS。

    万分感谢。

  • 您好!

    1.

    measure_latency()  是用来测 多核的通信时间。

    做100 次,取平均值而已。

    core 0相对其他核来说 多做了 发送 循环信息的步骤。

    请楼主 再仔细看下代码。

    2.

    measure_latency() 错误,我simulator也出现你同样错误,

    我们正在研究中。

  • HI,bruce:

    measure_latency()  是用来测 多核的通信时间,那么只是为了测时间的话,想必我可以将它注释掉,因为我不需要通信时间。

    去掉后core0和core1可以正常通信,但是core0和其他核仍然无法QMSS通信,还在看代码测试中。在寻找问题中

  • HI,bruce:

        我在代码中,使用core0和core7通信,在注释掉measure_latency() 的情况下,在调用thruputTxRxPairPreallocFullLoad()中的MessageQ_put()函数时出现:

    [C66xx_0] ti.sdo.ipc.MessageQ: line 383: assertion failure: A_invalidMsg: Invalid message

    [C66xx_0] xdc.runtime.Error.raise: terminating execution

    这个错误,问题已经定位到了,就是调用MessageQ_put()就会出现错误。

    但是不知道这个问题怎么解决?请各位高手帮忙看下。万分感谢。

  • Hi,bruce

    请问你们研究调试ok了么?我这边尚未实现还。还在调试中。

    谢谢