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测试程序能够跑多少速率?感觉好慢啊