器件型号: DRA821U
主题: DRA821 中讨论的其他器件
您好 TI、
我们正在使用 DRA821 J7200 为定制板开发一个 Cortex-R5F 固件。
因此、我们将 FREERTOS-J7200(版本 11.01.00.02)与 PROCESSOR-RTOS-SDK 配合使用。
对于 PROCESSOR-LINUX-SDK、我们将 Linux-J7200(版本 10.00.07.03)与 linux-ti-staging-rt_6.6 内核配合使用。
我们的 Cortex-R5F 固件用作 DM-Firmware、在 A72 引导过程开始后由 SPL 加载该 DM-Firmware。
对于与 Linux 和 EthFw 的处理器间通信、我们实现了以下函数来初始化 IPC:
STATIC UINT32 Ipc_RemoteProc[] =
{
IPC_MPU1_0, IPC_MCU1_0, IPC_MCU2_0, IPC_MCU2_1,
};
STATIC CONST UINT32 Ipc_NumRemoteProc = sizeof(Ipc_RemoteProc) / sizeof(Ipc_RemoteProc[0]);
STATIC UINT8 Ipc_VDevMonStackBuf[IPC_TASK_STACKSIZE] STACK(8);
STATIC UINT8 Ipc_RPMessageTaskBuf[IPC_TASK_STACKSIZE] STACK(8);
STATIC UINT8 Ipc_RPMessageBuf[IPC_RPMSG_DATA_SIZE] __attribute__ ((section("ipc_data_buffer"), aligned(8)));
STATIC UINT8 Ipc_VirtIOBuffer[IPC_VIRTIO_BUF_SIZE] __attribute__ ((section("ipc_data_buffer"), aligned(8)));
RESULT_TYPE Ipc_Init(UINT32 selfProcId)
{
RESULT_TYPE result = RES_ERR;
INT32 status;
Ipc_InitPrms initPrms;
/* Step 1: Initialize the multiproc with a list of all cores that are required to participate in the communication */
status = Ipc_mpSetConfig(selfProcId, Ipc_NumRemoteProc, Ipc_RemoteProc);
if (status == IPC_SOK)
{
/* Initialize params with defaults */
IpcInitPrms_init(0U, &initPrms);
initPrms.printFxn = &Ipc_Print;
/* Step 2: Init IPC driver */
status = Ipc_init(&initPrms);
TRACE_ERR_IF((status != IPC_SOK), status, "Error setting up RemoteProc (Core : %s) \r\n", Ipc_mpGetSelfName());
}
if (status == IPC_SOK)
{
/* Step 3: Load resource table */
status = Ipc_loadResourceTable((void *)&ipc_remoteproc_ResourceTable);
}
if (status == IPC_SOK)
{
/* Step 4: Initialize VirtIO */
Ipc_VirtIoParams virtIoParam;
virtIoParam.vqObjBaseAddr = (void*) Ipc_VirtIOBuffer;
virtIoParam.vqBufSize = Ipc_NumRemoteProc * Ipc_getVqObjMemoryRequiredPerCore();
virtIoParam.vringBaseAddr = (void*) IPC_VRING_BASE_ADDRESS;
virtIoParam.vringBufSize = IPC_VRING_BUFFER_SIZE;
virtIoParam.timeoutCnt = IPC_VIRTIO_TIMEOUT;
status = Ipc_initVirtIO(&virtIoParam);
TRACE_ERR_IF((status != IPC_SOK), status, "Failed to init virtIO");
}
if (status == IPC_SOK)
{
/* Step 5: Init RPMessage */
/* Initialize the param and set memory for HeapMemory for control task */
RPMessage_Params cntrlParam;
RPMessageParams_init(&cntrlParam);
cntrlParam.buf = &Ipc_RPMessageBuf;
cntrlParam.bufSize = IPC_RPMSG_DATA_SIZE;
cntrlParam.stackBuffer = &Ipc_RPMessageTaskBuf;
cntrlParam.stackSize = IPC_TASK_STACKSIZE;
status = RPMessage_init(&cntrlParam);
TRACE_ERR_IF((status != IPC_SOK), status, "Failed to init RPMsg");
}
if (status == IPC_SOK)
{
/* Step 6: Create RPMessage monitor task */
Ipc_CreateMonitorTask();
result = RES_OK;
}
return result;
}
如果我通过存储器中的调试器将 Cortex-R5F 固件与 EthFw 一起加载并通过调试器启动该固件、则此初始化很有效。
但是、如果我设置了与 DM-Firmware 相同的 Cortex-R5F 固件并让其从 SPL 开始、则会从 RPMessage_init () 中收到数据中止异常、并显示消息: 
您能提供一些此错误和行为可能来自哪里的信息吗?
为什么只有从 SPL 开始才会发生这种情况?
此致、
Frank
