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.

[参考译文] TMS320C6678:tms320c6678的 MessageQ 存在一些问题

Guru**** 2617705 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581132/tms320c6678-some-problem-about-messageq-with-the-tms320c6678

器件型号:TMS320C6678

大家好,我已经阅读了有关 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);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    RTOS 团队已收到通知。 他们的反馈将在此处发布。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不清楚您是否有一个可执行文件或8个可执行文件。 我的建议是首先使用单个可执行文件-在可执行文件中,您可以使用 if 语句,如(核心0)执行...
    然后、从仅从内核0发送消息到内核1开始、查看您是否仍然收到错误。 向论坛报告、我们将从这里开始

    已运行