使用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的机制是什么,这个时间是和缓存区的大小有关的吗,还是因为程序中还有其他的任务(网络传输调用任务函数)在运行。