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

IPC通信问题

IPC模板用的是messageQ,实现双核通信,就是core0接收外部中断,然后通知core1处理数据,处理完后给core0一个通知;主要流程是这样的:

1.core0初始化配置,建立任务task0,接受外部中断,然后MessageQ_put(),给core1中断;

2.core1运行任务task1,一直MessageQ_get(),等到中断后,数据处理完成,然后再MessageQ_put()给core0一个中断;

初始化函数:

Void tsk0_func(UArg arg0, UArg arg1)
{
if (MultiProc_self() == 0) {
/*
* Create the heap that will be used to allocate messages.
*/
HeapBufMP_Params_init(&heapBufParams);
heapBufParams.regionId = 0;
heapBufParams.name = HEAP_NAME;
heapBufParams.numBlocks = 4;
heapBufParams.blockSize = sizeof(MessageQ_MsgHeader);
heapHandle = HeapBufMP_create(&heapBufParams);
if (heapHandle == NULL) {
System_abort("HeapBufMP_create failed\n" );
}
}
else {
/* Open the heap created by the other processor. Loop until opened. */
do {
status = HeapBufMP_open(HEAP_NAME, &heapHandle);
/*
* Sleep for 1 clock tick to avoid inundating remote processor
* with interrupts if open failed
*/
if (status < 0) {
Task_sleep(1);
}
} while (status < 0);
}

/* Register this heap with MessageQ */
MessageQ_registerHeap((IHeap_Handle)heapHandle, HEAPID);

/* Create the local message queue */
messageQ = MessageQ_create(localQueueName, NULL);
if (messageQ == NULL) {
System_abort("MessageQ_create failed\n" );
}

/* Open the remote message queue. Spin until it is ready. */
do {
status = MessageQ_open(nextQueueName, &remoteQueueId);
/*
* Sleep for 1 clock tick to avoid inundating remote processor
* with interrupts if open failed
*/
if (status < 0) {
Task_sleep(1);
}
} while (status < 0);

/* Allocate a message to be ping-ponged around the processors */
msg = MessageQ_alloc(HEAPID, sizeof(MessageQ_MsgHeader));
if (msg == NULL) {
System_abort("MessageQ_alloc failed\n" );
}
}

在开发板上运行的时候,第一个中断能够执行core0->core1->core0,但是第二个开始就出现问题,具体明天再贴出来(数据在公司),

但是我觉得应该和IPC的初始化有关系,大虾帮我看下,初始化哪里不正确了?谢谢

eric long:

今天再次试验了一下,发现了这个问题:即使在单核中,建立两个任务task0和task1

task0()

{

    MessageQ_put(remoteQueueId, msg);

。。。。。。。。

}

task1()

{

    MessageQ_get(messageQ, &msg, MessageQ_FOREVER);

     。。。。。。。。

}

task0发中断,task1接受中断,即使单核通信也报错:

报错信息:assertion failure:A_invalidMsg:Invalid message

但是若将两者放在一个任务,亦即:

task3()

{

  MessageQ_put(remoteQueueId, msg);

 MessageQ_get(messageQ, &msg, MessageQ_FOREVER);

。。。。。。。。。。。。。。。。。。。

}

则运行没有问题。是不是MessageQ_put和MessageQ_get不能放在不同的任务中执行啊?哪位高手解释一下,谢谢

eric long:

回复 eric long:

此问题是由于初始化的问题。

eric long:

回复 eric long:

再问:6678运行1GHZ频率:

1:Task_sleep(100)表示延迟100ms么?

2:ndk的helloword的UDP测试程序能够跑多少速率?感觉好慢啊

赞(0)
未经允许不得转载:TI中文支持网 » IPC通信问题
分享到: 更多 (0)