大家好,我已经阅读了有关 MessageQ 的 SYS/BIOS 处理器间通信(IPC)和 I/O 用户指南,我测试了 TI 提供的演示,它成功运行,但是,我为每个内核创建了8个项目,我只让 core0发送一条消息到 core1,而 core1发送回 core0,但失败了。我的问题是这样 遵循、有时 core0无法通过 funcion MessageQ_open (Core1_queue_name、&remoteQueueId)打开 core1队列;有时、尽管它可以打开、但无法将消息放入 core1、主代码如下所示;
core0 代码:
空 tsk0_func (UArg0、UArgarg1)
{
// MessageQ_Msg msg;
my_message_t * msg;
MessageQ_Handle MessageQ;
MessageQ_QueueID 远程队列 ID;
INT 状态;
HeapBufMP_Handle heapHandle;
HeapBufMP_Params heapBufParams;
/*
*创建将用于分配消息的堆。
*
HeapBufMP_Params_init (heapBufParams);
heapBufParams.RegionID = 0;
heapBufParams.name = heap_name;
heapBufParams.numBlocks = 8;
heapBufParams.blocksize = sizeof (my_message_t);
heapHandle = HeapBufMP_create (heapBufParams);
if (heapHandle == NULL){
System_abort ("HeapBufMP_create failed\n");
}
printf ("heapHandle %x\n"、heapHandle);
/*使用 MessageQ 注册该堆*/
MessageQ_registerHeap ((IHeap_handle) heapHandle、HEAPID);
/*创建本地消息队列*/
MessageQ = MessageQ_create (CORE0_queue_name、NULL);
if (MessageQ == NULL){
System_abort ("MessageQ_create failed\n");
}
/*打开远程消息队列。 旋转、直至其就绪。 *
执行{
状态= MessageQ_open (Core1_queue_name、&remoteQueueId);
/*
*睡眠1个时钟周期以避免远程处理器脱机
*如果打开失败则使用中断
*
如果(状态< 0){
Task_sleep (1);
}
} while (status < 0);
/*分配一条消息以在处理器周围执行 ping 操作*/
MSG =(my_message_t *) MessageQ_alloc (HEAPID、sizeof (my_message_t));
if (msg == NULL){
system_abort ("MessageQ_alloc 失败\n");
}
MSG->TEST_num=10;
// MessageQ_setReplyQueue (MessageQ、msg);
执行{
status = MessageQ_Put (remoteQueueId、(MessageQ_Msg) msg);
//如果(状态< 0)
// System_abort ("MessageQ_Put 出现故障/错误\n");
}while (status < 0);
状态= MessageQ_get (MessageQ、(MessageQ_Msg *)&msg、MessageQ_forever);
如果(状态< 0){
system_abort ("由于超时是永久的、因此不应发生此情况\n");
}
system_printf ("test_num 为%d\n"msg->test_num);
System_printf ("测试完成了\n");
BIOS_exit (0);
}
和 core1代码;
空 tsk0_func (UArg0、UArgarg1)
{
// MessageQ_Msg msg;
my_message_t * msg;
MessageQ_Handle MessageQ;
MessageQ_QueueID 远程队列 ID;
INT 状态;
HeapBufMP_Handle heapHandle;
Task_sleep (200);
执行{
状态= HeapBufMP_open (heap_name、heapHandle);
/*
*睡眠1个时钟周期以避免远程处理器脱机
*如果打开失败则使用中断
*
如果(状态< 0){
Task_sleep (1);
}
} while (status < 0);
printf ("heapHandle %x\n"、heapHandle);
/*使用 MessageQ 注册该堆*/
MessageQ_registerHeap ((IHeap_handle) heapHandle、HEAPID);
/*创建本地消息队列*/
MessageQ = MessageQ_create (Core1_queue_name、NULL);
if (MessageQ == NULL){
System_abort ("MessageQ_create failed\n");
}
/*打开远程消息队列。 旋转、直至其就绪。 *
执行{
状态= MessageQ_open (CORE0_queue_name、&remoteQueueId);
/*
*睡眠1个时钟周期以避免远程处理器脱机
*如果打开失败则使用中断
*
如果(状态< 0){
Task_sleep (1);
}
} while (status < 0);
// System_printf ("测试为 c\n");
// Task_sleep (200);
/*获取消息*/
执行{
状态= MessageQ_get (MessageQ、(MessageQ_Msg *)&msg、10);//MessageQ_Forever
} while (状态< 0);
system_printf ("test_num 为%d\n"msg->test_num);
MSG->TEST_num=20;
// remoteQueueId = MessageQ_getReplyQueue (msg);
status = MessageQ_Put (remoteQueueId、(MessageQ_Msg) msg);
如果(状态< 0){
System_abort ("MessageQ_Put 出现故障/错误\n");
}
System_printf ("测试完成了\n");
BIOS_exit (0);
}