Part Number: TMS320F28377D
Other Parts Discussed in Thread: C2000WARE
目前程序架构为:CPU1做控制算法和pwm等功能,CPU2专门用来通讯,CPU之间通过IPC进行数据交流
程序需要离线运行,即写入flash中,两个核都需要将部分函数搬入ram中运行以提高运行速度,其中CPU1搬入的函数如下:
//需要搬入ram中运行的函数
#ifdef _FLASH
#pragma CODE_SECTION(EPWM2_ISR,"ramfuncs");
#pragma CODE_SECTION(Getresult,"ramfuncs");
#pragma CODE_SECTION(set_epwmcmp,"ramfuncs");
#pragma CODE_SECTION(PI_stop,"ramfuncs");
#endif
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
Getresult();
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
set_epwmcmp();
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
PI_stop();
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
EPWM2_ISR();//中断函数
#endif
CPU2中搬入ram中的函数如下:
#ifdef _FLASH
// These are defined by the linker (see device linker command file)
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadSize;
extern Uint16 RamfuncsRunStart;
#pragma CODE_SECTION(IPC11_RX,"ramfuncs");
#pragma CODE_SECTION(CPU01toCPU02IPC1IntHandler,"ramfuncs");
#endif
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
IPC11_RX();
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
CPU01toCPU02IPC1IntHandler();//中断函数
#endif
问题在于当我将CPU2中的接收函数和IPC中断函数搬入ram中时,程序卡死在CPU2的中断函数当中,CPU1中的程序正常运行。目前有以下具体的问题:
1.CPU1程序完全在flash中运行和完全在ram中运行速度差别不大,而CPU2中差别会比较大,请问这是否正常?如果将中断函数搬入ram中,那么中断函数中所用到的子函数是否也需要搬入ram中?
2.CPU2中的程序完全在flash中程序可以正常运行,一旦我将中断函数搬入ram中程序就会卡死在IPC中断函数中,请问两个核是否可以同时将函数搬入ram中运行?是否需要修改cmd文件?
3.我仔细看了例程中CPU1和CPU2的cmd文件,发现每个分区的地址都是一样的,datasheet中说每个CPU都有独立的ram区和flash区,双核程序flash初始化之后两个CPU的ram区和flash区在地址上都是重合的,这是否与datasheet的描述相矛盾?还是说需要在cmd文件中定义每个ram和flash的归属权?
CPU1中的发送函数如下:
/* 数据发送 */
void IPC11_TX(Uint16 *AMBFB)
{
Uint16 i;
if(IPCRtoLFlagBusy(IPC_FLAG11) == 1)//如果CPU2设置了标志位
{
if((MemCfgRegs.GSxMSEL.bit.MSEL_GS0) == 1)//设置CPU1作为GS0 RAM 的主控
{
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS0 = 0;
EDIS;
}
for(i=0;i<10;i++)//将数据写入共享ram
{
pusCPU01BufferPt[i] = AMBFB[i];
}
//将共享ram中的数据写入CPU2-1的消息ram所指定的位置
IPCLtoRBlockWrite(&g_sIpcController2, pulMsgRam2[1],(uint32_t)pusCPU01BufferPt,10,IPC_LENGTH_16_BITS,ENABLE_BLOCKING);
IPCRtoLFlagAcknowledge(IPC_FLAG11);
//IPCLtoRFlagClear(IPC_FLAG11);
}
}
CPU2中的IPC中断程序如下:
__interrupt void
CPU01toCPU02IPC1IntHandler (void)
{
tIpcMessage sMessage;
GPIO_WritePin(37,1);
IPCLtoRFlagSet(IPC_FLAG11);
// Continue processing messages as long as CPU01toCPU02 GetBuffer2 is full
while (IpcGet (&g_sIpcController2, &sMessage,
DISABLE_BLOCKING)!= STATUS_FAIL)
{
switch (sMessage.ulcommand)
{
case IPC_BLOCK_WRITE://CPU1将数据写进共享ram
IPCRtoLBlockWrite(&sMessage);
IPC11_RX();
break;
case IPC_BLOCK_READ:
IPCRtoLBlockRead(&sMessage);//CPU2将指定地址的数据写入共享ram
break;
default:
//ErrorFlag = 1;
break;
}
}
// Acknowledge IPC INT1 Flag and PIE to receive more interrupts
IpcRegs.IPCACK.bit.IPC1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
GPIO_WritePin(37,0);
}
第一次做双核的程序,问题比较多,希望有前辈能抽出宝贵的时间帮我解答一下疑惑,如果能留下联系方式就更好了,不胜感激。