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.

TMS320C6472EVM上多核通信IPC方法的问题

如题,我想实现基本的多核之间的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()为何没有被调用。

x 出现错误。请重试或与管理员联系。