器件型号: AM2612
尊敬的专家:
我正在从事 AM261x-LP 的内核 1 和内核 0 之间的 IPC 通信。 我修改了示例 L2_enet_switch、使内核 1 接收数据包、然后将数据包发送到内核 0。 通信的工作方式如下:
- 以太网 pkt 从 Core 1 接收
- 生成 ISR 并发布信标
- RX 任务运行并写入内核 0 和内核 1 之间的共享存储器内经过排队的数据包
- 内核 1 将通知内核 0(IPC Notify 机制)收到新数据包
- 内核 0 唤醒并从其自己 RAM 内的共享 RAM 复制数据包
对共享 RAM 的每次访问都由一个 spinlock 提供保护。 我在 共享 RAM 上阅读帖子 、我的存储器映射如下所示:
- OCRAM 存储体 0:SBL +内核 0
- OCRAM 组 1:CPPI 描述+内核 1(包括 Enet DMA 数据包池)
- OCRAM 存储体 2:内核 1 和内核 2 之间的共享存储器。 它只是一个 2KB 区域(用于 1 个完整的以太网数据包)、数据包被复制到/从中复制。 MPU 配置方式类似、两者均用于内核

当我在 Core 0 中执行 memcpy 时出现问题、我无法解释原因:memcpy 需要的时间正好是 85 μ s、而 Core 1 需要的时间是 3.75 μ s。

代码片段为:
namespace Core0
{
static EthFrame internalFrame;
// Called inside the IPC callback
static void ethTakePkt()
{
spinlock_lock(SPINLOCK_0);
CacheP_inv((void*)ðPkt, sizeof(ethPkt), CacheP_TYPE_L1D);
hal_gpio_on(DEBUG_PIN_0);
memcpy((void*)&internalFrame, (void*)ðPkt, sizeof(EthFrame));
hal_gpio_off(DEBUG_PIN_0);
spinlock_unlock(SPINLOCK_0);
return;
}
}
namespace Core 1
{
// Called inside RX Task
static void copyFrame(EthFrame *frame)
{
spinlock_lock(SPINLOCK_0);
hal_gpio_on(DEBUG_PIN_1);
memcpy((void*)ðPkt, (void*) frame, sizeof(EthFrame));
hal_gpio_off(DEBUG_PIN_1);
CacheP_wbInv((void*)ðPkt, sizeof(EthFrame), CacheP_TYPE_L1D);
spinlock_unlock(SPINLOCK_0);
}
}
namespace Common
{
volatile EthFrame ethPkt __attribute__((aligned(128), section(".bss.eth_pkt")));
}
我检查生成的代码并通过删除它来确认编译器未优化 memcpy。
有什么想法为什么 Core 0 需要很长的时间来复制数据?