TI中文支持网
TI专业的中文技术问题搜集分享网站

MessageQ Invalid queueId

使用C6657,想从Core0发送数据到Core1,MessageQ_put已经通过,但是Core1退出,并打印错误:

[C66xx_1] ti.sdo.ipc.MessageQ: line 441: assertion failure: A_invalidQueueId: Invalid queueId is used
xdc.runtime.Error.raise: terminating execution

我是将两个代码分开写的,其中Core0的代码包含了NDK和IPC传输,而Core1中并没有关于MessageQ_put的操作,可能是什么原因?IPC传输方面的代码的话有人帮忙看过,没找出错误,可能是.cfg文件中的配置错误吗?或者两核运行同步或初始化的问题?

急求!希望知道可能原因的大神不吝赐教!

Jane Lu:

Yuan,

           从您上面提供的信息,很难推断原因。 您是说core1的代码中没有调用MessageQ_put操作,但运行后的打印却是函数MessageQ_put的出错打印?建议单步跟一下Core1的代码, 看是运行那条代码出的错,再做分析。

yuxin yuan:

回复 Jane Lu:

Jane Lu,

您好!感谢您的回答!我听从您的建议单步跟了一下Core1的代码,发现退出前运行的一句代码是bench_qmss_pe66.c中的:

xdc_Int ti_sysbios_syncs_SyncSem_wait__E( ti_sysbios_syncs_SyncSem_Handle __inst, xdc_UInt timeout, xdc_runtime_Error_Block* eb ) { return ti_sysbios_syncs_SyncSem_wait__F((void*)__inst, timeout, eb);}

运行到return语句后退出。这一段是core1运行MessageQ_get几步之后跳转过去的。请问是什么原因?

Jane Lu:

回复 yuxin yuan:

Yuan,

          ti_sysbios_syncs_SyncSem_wait__E()函数是查询message的等待函数,超时的话会返回错误码,并最终导致bois退出。

          MessagQ_get() 带进去的handle参数中,queueID是多少? 是core0 与core1通信事先规划好的值吗? 这个queue的状态寄存器里entry count值是非零吗?

yuxin yuan:

回复 Jane Lu:

Jane Lu,

您好!我的queueId是由MessageQ_open(queueName, &queueId)这条代码获得的,打印显示为65536. 关于handle参数以及MessagQ_get代码如下:

syncSemHandle = SyncSem_create(NULL, NULL); MessageQ_Params_init(&messageQParams); messageQParams.synchronizer = SyncSem_Handle_upCast(syncSemHandle); /* Create a message queue. */ messageQ = MessageQ_create(queueName, &messageQParams);

status = MessageQ_get(messageQ, (MessageQ_Msg *)&message, MessageQ_FOREVER);

还有请问该如何查看entry count的值?

yuxin yuan:

回复 yuxin yuan:

急求解答!!

Boxue Li:

回复 yuxin yuan:

我也遇到了同样的问题,分析结果是MessageQ的实现上有BUG。

并不只是发送方调用messageQ_put,接收方同样会由transport调用该函数。从transport的源码可以找到,接收核的所有接收队列都共享一个中断,在收到中断后抛出一个Swi,在里面最终调用messageQ_put将包放到queueId指定的接收队列中。

分析messageQ_put函数可以看出,函数主干是根据queueId判断队列是否是本核所有,进入if-else不同的分支。但是在进入分支前有两条语句:

msg->ProcId = …

msg->queueId = …

在发送方这两句没有问题,但是当作为接收方核执行这两句时候,将出现Cache隐患,具体原理后面再分析。

YANYAN LEI:

       你好,我的情况和你的类似,0核采用NDK从PC端接收连续的图像数据,然后通过MessageQ_put传给1核,但是现在的问题是1核messageQ_get耗时比较长,大概有1000多ms,这是什么原因导致的呢?

      messageQ——get的机制是什么,这个时间是和缓存区的大小有关的吗,还是因为程序中还有其他的任务(网络传输调用任务函数)在运行。

赞(0)
未经允许不得转载:TI中文支持网 » MessageQ Invalid queueId
分享到: 更多 (0)