您好,
我正在尝试将数据从一个CPU1传递到CPU2,反之亦然(以阵列形式)。 我已成功地将数据从CPU1传输到CPU2,但似乎不能实现相反效果。
以下是两个数组,其中具有用于内存分配的#pragma语句:
#pragma DATA_SECTION(mT,"Cpu1ToCpu2RAM") uint16_t mT[4]; #pragma DATA_SECTION(iT,"Cpu2ToCpu1RAM") uint16_t iT[2];
在CPU1中更新MT,如果在以下ISR中传递到CPU2,则由CPU1触发:
interrupt void probe_CPU2(void)
{
// stuff to ship to CPU2 dummy update --------------------
if((ISR_count1 % 40000) == 0){
slider1++;
slider2 += 2;
}
// Communicate with CPU2 via IPC
SendDataToCpu2 = slider1;
SendAddrToCpu2 = slider2;
IpcRegs.IPCSENDDATA = (Uint32) SendDataToCpu2; // Write the result to the IPC data register
IpcRegs.IPCSENDADDR = (Uint32) SendAddrToCpu2; // Write the result to the IPC addr register
IpcRegs.IPCSET.bit.IPC1 = 1; // Set the IPC1 flag for CPU2
RecDataFromCpu2 = (Uint16) IpcRegs.IPCRECVDATA; // Read data on IPC data register
RecAddrFromCpu2 = (Uint16) IpcRegs.IPCRECVADDR; // Read data on IPC addr register
// Arrays management
// Transfer modulation signals from CPU1 to CPU2
mT[0] = slider1;
mT[1] = slider2;
mT[2] = slider1;
mT[3] = slider2;
// data updated by CPU2 --- NOT WORKING!!!
input1 = iT[0];
input2 = iT[1];
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; // Acknowledge PIE group 3 to enable further interrupts
EPwm2Regs.ETCLR.bit.INT = 1; // Clear EPWM1_INT flag to allow further interrupts
}
此ISR为CPU2设置IPC1标志,以使用以下ISR (在修改后)进行响应:
interrupt void ipc1_isr(void)
{
// Read data from CPU1
temp1 = (Uint16) IpcRegs.IPCRECVDATA;
temp2 = (Uint16) IpcRegs.IPCRECVADDR;
// Send data back to CPU1 multiplied
IpcRegs.IPCSENDDATA = (Uint16) temp1*4; // send CPU2.CLA response back to CPU1
IpcRegs.IPCSENDADDR = (Uint16) temp2*4;
ISR_count1_cpu2++; // ISR coutner
if(ISR_count1_cpu2 % 20000 == 0){
dummy1++;
iT[0] = dummy1;
iT[1] = dummy1 + 1;
}
// Return from interrupt house keeping
IpcRegs.IPCACK.bit.IPC1 = 1; // Clear IPC1 bit
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge PIE group 1 to enable further interrupts
}
调试我在CPU2中看到正确更新了mt时没有问题。 我也可以看到它在CPU2中正确更新,但我看不到CPU1对它的任何修改,因为input1和input2变量始终保持0,而不使用它的实际新值更新,CPU2确实修改了该值。
似乎我可以从CPU1修改mt并使它对CPU2可见,这是可以的,但似乎虽然我可以在CPU2中修改它的阵列,但我看不到CPU1的修改发生。
我们非常感谢您的任何帮助。
非常感谢,
尼古拉