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.
如题,我想实现基本的多核之间的IPC通信,考虑一种简单的通信方式,
利用IPCGR和IPCAR寄存器实现IPC
比如核0周期性地将消息message发给核1,核1将收到的消息进行简单处理(如简单的加法),再发给核2接收.
一下是3个project的代码
核0:
#include <std.h>
#include <log.h>
#include <c6x.h>
#include "ipccfg.h"
#include "cslr_intgen.h"
#include <stdio.h>
CSL_IntgenRegs *ipcRegsPtr = (CSL_IntgenRegs*)(0x02A80540);
main()
{
LOG_printf(&trace, "starting IPC on core %d\n",DNUM);
// enable IPC interrupt
C64_enableIER(1<<4);
}
unsigned long received_message;
unsigned long send_message = 0;
void sendIPCmsgPRD(unsigned long send_message)
{
LOG_printf(&trace, "send message %d to core 1 on core 0",send_message);
ipcRegsPtr->IPCGR1 = (send_message & 0xFFFFFFF) << 4;
// generate interrupt
ipcRegsPtr->IPCGR1 |= 1;
send_message++;
}
核1:
#include <std.h>
#include <log.h>
#include <c6x.h>
#include "ipccfg.h"
#include "cslr_intgen.h"
#include <stdio.h>
CSL_IntgenRegs *ipcRegsPtr = (CSL_IntgenRegs*)(0x02A80540);
main()
{
LOG_printf(&trace, "starting IPC on core %d\n",DNUM);
// enable IPC interrupt
C64_enableIER(1<<4);
}
unsigned long received_message;
unsigned long send_message;
void IPCisr(void)
{
received_message = (ipcRegsPtr->IPCGR1 >> 4) & 0xFFFFFFF;
LOG_printf(&trace,"receive message %d from core 0 on core 1", received_message);
// clear IPCAR
ipcRegsPtr->IPCAR1 = 0xFFFFFFFF;
send_message = received_message + 10;
LOG_printf(&trace, "send message %d to core 2 on core 1",send_message);
ipcRegsPtr->IPCGR2 = (send_message & 0xFFFFFFF) << 4;
// generate interrupt
ipcRegsPtr->IPCGR2 |= 1;
}
核2:
#include <std.h>
#include <log.h>
#include <c6x.h>
#include "ipccfg.h"
#include "cslr_intgen.h"
#include <stdio.h>
CSL_IntgenRegs *ipcRegsPtr = (CSL_IntgenRegs*)(0x02A80540);
main()
{
LOG_printf(&trace, "starting IPC on core %d\n",DNUM);
// enable IPC interrupt
C64_enableIER(1<<4);
}
unsigned long received_message;
unsigned long send_message;
void IPCisr(void)
{
received_message = (ipcRegsPtr->IPCGR2 >> 4) & 0xFFFFFFF;
LOG_printf(&trace,"receive message %d from core 1 on core 2", received_message);
// clear IPCAR
ipcRegsPtr->IPCAR2 = 0xFFFFFFFF;
}
但是debug的时候,在trace里面发现3个核上都只执行到main函数的 LOG_printf(&trace, "starting IPC on core %d\n",DNUM);这一句,
后面的周期函数void sendIPCmsgPRD和中断函数IPCisr都没有执行,不知道怎么回事,请教一下各位。
从代码看,应该使用了BIOS。如果利用BIOS调度中断,CSL的中断相关函数不应该使用。从现象看需要先查核0的sendIPCmsgPRD()为何没有被调用。