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.

[参考译文] J784S4XEVM:bootApp &IPC 故障问题

Guru**** 2952510 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1620309/j784s4xevm-bootapp-ipc-fail-issue

器件型号: J784S4XEVM

您好:

我有关于在使用 J784S4_EVM 进行测试时的 IPC 相关问题。

RTOS、Linux SDK 版本:11.01.

我正在使用引导系统 BootApp 以下阶段:

  • 设置自动扭矩 (mcu1_0)

  • 状态 1 (MCU2_0、MCU2_1)

  • 阶段 2. (mcu3_0、mcu3_1、mcu4_0、mcu4_1)

  • 阶段 3. (mpu1)—使用预构建的映像

此外、我还参考 IPC 示例(bootApp + IPC 示例)、实现了 MCU 内核之间以及 MCU 和 MPU 内核之间的 IPC 通信。

总流程如下:

  1. 等待 bootApp 映像加载完成。

  2. 映像加载完成后、启动 IPC 任务(此时 Linux 内核仍在引导)。

  3. 呼叫Ipc_mpSetConfig、IpcInitPrms_init和Ipc_init。

  4. 致电Ipc_loadResourceTable和Ipc_initVirtIO。

  5. 致电RPMessageParams_init和RPMessage_init。

  6. 创建每个内核的 RPMessage 接收任务 (ti.ipc4.ping-pong、rpmsg_chrdev)。

  7. 创建 RPMessage 根据内核数发送任务。

  8. 创建rpmsg_vdevMonitorFxn任务:

    • Ipc_lateVirtioCreate调用和 RPMessage_lateInit

    • 将ti.ipc4.ping-pong服务通知IPC_MPU1_0使用RPMessage_announce。

/*------------------------------------------------*/
/* Size of various Memory Locations for each core */ 
/*------------------------------------------------*/
#define DMA_SPACE_SIZE  0x00100000 /*  1MB */
#define IPC_DATA_SIZE   0x00100000 /*  1MB */
#define EXT_DATA_SIZE   0x00100000 /*  1MB */
#define MEM_TEXT_SIZE   0x00100000 /*  1MB */
#define MEM_DATA_SIZE   0x00100000 /*  1MB */
#define DDR_SPACE_SIZE  0x00B00000 /* 12MB */

#define CORE_TOTAL_SIZE 0x01000000 /* 16MB (IPC_DATA_SIZE + R5F_MEM_TEXT_SIZE + R5F_MEM_DATA_SIZE + DDR_SPACE_SIZE) */

/*-----------------------------*/
/* Start address for each core */ 
/*-----------------------------*/

#define MCU1_0_ALLOCATED_START   DDR0_ALLOCATED_START                     /* 0xA0000000 */  
#define MCU1_1_ALLOCATED_START   MCU1_0_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA1000000 */ 
#define MCU2_0_ALLOCATED_START   MCU1_1_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA2000000 */
#define MCU2_1_ALLOCATED_START   MCU2_0_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA3000000 */
#define MCU3_0_ALLOCATED_START   MCU2_1_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA4000000 */
#define MCU3_1_ALLOCATED_START   MCU3_0_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA5000000 */
#define MCU4_0_ALLOCATED_START   MCU3_1_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA6000000 */
#define MCU4_1_ALLOCATED_START   MCU4_0_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA7000000 */

(Linux 器件树中定义的 IPC 存储器区域和 linker.cmd 存储器布局的配置相同。)

我面临两个问题:

首先 MCU2_1、MCU3_1 和 MCU4_1 根本不工作。
启用或启动这些内核是否需要任何特殊配置?

7bff0593-cd62-4def-8430-d3396790ba48.png

 

   /* Initialize the param */
    RPMessageParams_init(&cntrlParam);

    /* Set memory for HeapMemory for control task */
    cntrlParam.buf         = pCntrlBuf;
    cntrlParam.bufSize     = rpmsgDataSize;
    cntrlParam.stackBuffer = pTaskBuf;
    cntrlParam.stackSize   = IPC_TASK_STACKSIZE;
    cntrlParam.ctrlTaskPriority   = IPC_CTRL_TASK_PRIORITY;
    RPMessage_init(&cntrlParam);             

    run_rpmsg_receiver();

    run_rpmsg_sender();

#if !defined(BUILD_MPU1_0) && defined(A72_LINUX_OS) && defined(A72_LINUX_OS_IPC_ATTACH)
    TaskP_sleepInMsecs(30000);
    /* Respond to messages coming in to endPt ENDPT_PING */
    TaskP_Params_init(&taskParams);
    taskParams.priority = 10;
    taskParams.stacksize = 0x1000;
    taskParams.arg0 = 0;

    if (NULL == TaskP_create(&rpmsg_vdevMonitorFxn, &taskParams))
    {
        Ipc_Trace_printf("IPC VDEV Monitor task creation failed!!!");
    }
    //RecvRPMessage_lateannounce();
#endif /* !defined(BUILD_MPU1_0) && defined(A72_LINUX_OS) && defined(A72_LINUX_OS_IPC_ATTACH) */

秒 、在上面描述的代码中、如果TaskP_sleepInMsecs(30000);未设置为足够长的延迟、则会出现内核严重错误以及如下所示的错误。

ti-sci_fail.png

即使延迟增加、virtio 设备也会按如下所示注册、但经过一段时间后、MCU1_0 上仍会出现错误。
(MCU2_0、MCU3_0 和 MCU4_0 继续正常运行。)

virtio_list.png

希望您能就此问题提供帮助。

谢谢你。

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    const CSL_ArmR5MpuRegionCfg  gCslR5MpuCfg[CSL_ARM_R5F_MPU_REGIONS_MAX] =
    {
        {
            /* Region 0 configuration: complete 32 bit address space = 4Gbits */
            .regionId         = 0U,
            .enable           = 1U,
            .baseAddr         = 0x0U,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_4GB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 1U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)FALSE,
            .cachePolicy      = 0U,
            .memAttr          = 0U,
        },
        {
            /* Region 1 configuration: ATCM memory */
            .regionId         = 1U,
            .enable           = 1U,
            .baseAddr         = 0x0U,
    #if defined(BUILD_MCU1_0) || defined(BUILD_MCU2_0) || defined(BUILD_MCU3_0) || defined(BUILD_MCU4_0)
            /* Use 64KB, for Core 0, to cover Lock-step mode where TCMs are combined */
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_64KB,
    #elif defined(BUILD_MCU1_1) || defined(BUILD_MCU2_1) || defined(BUILD_MCU3_1) || defined(BUILD_MCU4_1)
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_32KB,
    #endif
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
        {
            /* Region 2 configuration: 1 MB OCMC RAM */
            .regionId         = 2U,
            .enable           = 1U,
            .baseAddr         = 0x41C00000,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_1MB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
        {
            /* Region 3 configuration: 8 MB MSMC3 RAM */
            .regionId         = 3U,
            .enable           = 1U,
            .baseAddr         = 0x70000000,
    #if defined(SOC_J784S4)
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_8MB,
    #elif defined(SOC_J742S2)
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_4MB,
    #endif
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
        {
            /* Region 4 configuration: 2 GB DDR RAM */
            .regionId         = 4U,
            .enable           = 1U,
            .baseAddr         = 0x80000000,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_2GB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
        {
            /* Region 5 configuration: 32 KB BTCM */
            /* Address of ATCM/BTCM are configured via MCU_SEC_MMR registers
               It can either be '0x0' or '0x41010000'. Application/Boot-loader shall
               take care this configurations and linker command file shall be
               in sync with this. For either of the above configurations,
               MPU configurations will not changes as both regions will have same
               set of permissions in almost all scenarios.
               Application can chose to overwrite this MPU configuration if needed.
               The same is true for the region corresponding to ATCM. */
            .regionId         = 5U,
            .enable           = 1U,
            .baseAddr         = 0x41010000,
    #if defined(BUILD_MCU1_0) || defined(BUILD_MCU2_0) || defined(BUILD_MCU3_0) || defined(BUILD_MCU4_0)
            /* Use 64KB, for Core 0, to cover Lock-step mode where TCMs are combined */
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_64KB,
    #elif defined(BUILD_MCU1_1) || defined(BUILD_MCU2_1) || defined(BUILD_MCU3_1) || defined(BUILD_MCU4_1)
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_32KB,
    #endif
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_NON_CACHEABLE,
            .memAttr          = 0U,
        },
        {
            /* Region 6 configuration: 128 MB FSS DAT */
            .regionId         = 6U,
            .enable           = 0U,
            .baseAddr         = 0x50000000,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_128MB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 0U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_WB_WA,
            .memAttr          = 0U,
        },
        {
            /* Region 7 configuration: Ring buffer */
            .regionId         = 7U,
            .enable           = 1U,
    #if defined(BUILD_MCU1_0)
            .baseAddr         = 0xA0000000,
    #elif defined(BUILD_MCU1_1)
            .baseAddr         = 0xA1000000,
    #elif defined(BUILD_MCU2_0)
            .baseAddr         = 0xA2000000,
    #elif defined(BUILD_MCU2_1)
            .baseAddr         = 0xA3000000,
    #elif defined(BUILD_MCU3_0)
            .baseAddr         = 0xA4000000,
    #elif defined(BUILD_MCU3_1)
            .baseAddr         = 0xA5000000,
    #elif defined(BUILD_MCU4_0)
            .baseAddr         = 0xA6000000,
    #elif defined(BUILD_MCU4_1)
            .baseAddr         = 0xA7000000,
    #endif
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_2MB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 1U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)FALSE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_NON_CACHEABLE,
            .memAttr          = 0U,
        },
        {
            /* Region 8 configuration: Ring buffer */
            .regionId         = 8U,
            .enable           = 1U,
            .baseAddr         = 0xAC000000,
            .size             = CSL_ARM_R5_MPU_REGION_SIZE_64MB,
            .subRegionEnable  = CSL_ARM_R5_MPU_SUB_REGION_ENABLE_ALL,
            .exeNeverControl  = 1U,
            .accessPermission = CSL_ARM_R5_ACC_PERM_PRIV_USR_RD_WR,
            .shareable        = 0U,
            .cacheable        = (uint32_t)FALSE,
            .cachePolicy      = CSL_ARM_R5_CACHE_POLICY_NON_CACHEABLE,
            .memAttr          = 0U,
        },
    };
    

    CSL_ArmR5MpuRegionCfg配置设置如上所示、dorprocboot在 uEnv.txt 文件中也设置为 0。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您能否分享完整的日志和代码而不是代码片段?

    您如何测试与 MCU1-0 和 MPU1-0 的通信?

    您应该使用 rpmsg_char_simply 命令 (Linux 必须启动通信而不是 MCU1_0)

    此致

    Tarun Mukesh  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我会根据请求附加源代码和引导日志。
    您可以首先查看该 boot_app/boot_app_main.c 文件。
    (对于)  rpmsg_char_simple  test、如果 virtio 上显示通道创建消息、且相应的远程处理器上未出现 TI-SCI 错误、则它将正常运行。
     
    谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    上周五我不在办公室。

    让我分析一下日志、然后返回给您。

    此致

    Tarun Mukesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    错误是由于 sciserver 无法对来自 A72 的 sciclient 调用进行寻址

    如果您增加下面的 sciserver 任务的优先级,超过引导应用程序任务函数 5  

    appPrms.taskPriority[SCISERVER_TASK_USER_LO]= 1;
    appPrms.taskPriority[SCISERVER_TASK_USER_HI]= 4;

    此致

    Tarun Mukesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的答复。 由于 3 月 1 日是公共假日、因此推迟了答复。 很抱歉耽误你的时间。

    我更改了如下所示的任务优先级、

      appPrms.taskPriority[SCISERVER_TASK_USER_LO]= 4;
      appPrms.taskPriority[SCISERVER_TASK_USER_HI]= 5;
      IPC 任务= 3、IPC Recv 任务= 3、发送任务= 3

    因此、我能够确认 MCU2_1 和 MCU3_1 现在是否正常运行。 然而、与 MPU 的通信仍然无法正常工作。

    (不再像以前那样发生 TI-SCI 误差)

    事件组等待完成。启动 IPC 任务
    IPC_SETUP(内核:mcu1_0)…

    mcu1_0 <->MCU2_0、Ping- 1000、Pong - 1000 已完成

    mcu1_0 <->MCU2_1、Ping- 1000、Pong - 1000 已完成

    mcu1_0 <-> mcu3_0、Ping- 1000、Pong - 1000 已完成

    mcu1_0 <-> mcu3_1、Ping- 1000、Pong - 1000 已完成

    mcu1_0 <-> mcu4_0、ping- 1000、pong - 1000 已完成

    mcu1_0 <-> mcu4_1、Ping- 1000、Pong - 1000 已完成

    此外、如果我删除TaskP_sleepInMsecs、则根本不会打印乒乓日志。 即使未建立与 MPU1 的通信、仍应打印与其他内核的乒乓消息、但不应打印。

        run_rpmsg_receiver();
    
        run_rpmsg_sender();
    
    #if !defined(BUILD_MPU1_0) && defined(A72_LINUX_OS) && defined(A72_LINUX_OS_IPC_ATTACH)
        TaskP_sleepInMsecs(30000);
        /* Respond to messages coming in to endPt ENDPT_PING */
        TaskP_Params_init(&taskParams);
        taskParams.priority = 3;
        taskParams.stacksize = 0x1000;
        taskParams.arg0 = 0;
    
        if (NULL == TaskP_create(&rpmsg_vdevMonitorFxn, &taskParams))
        {
            Ipc_Trace_printf("IPC VDEV Monitor task creation failed!!!");
        }

    rpmsg_vdevMonitorFxn任务似乎在加载 Linux Remoteproc 驱动程序之前正在运行、因此我添加了TaskP_sleepInMsecs延迟。 能否就此提供一些指导?

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    让我来解释一下。 这一切都与任务的顺序和优先级有关。

    当您运行 rpmsg_vdevMonitorFxn 作为其自己的任务时、它会在创建任务时立即开始执行。 如果该任务具有更高的优先级(或者甚至相同的优先级),它可能会  在 rpmsg_responderFxn(接收者任务)   被实际安排并准备好收听之前调用 RPMessage_announce,()。
    通过在 taskp_create    循环之后将代码移动到 run_rpmsg_preceiver () 中、可以 保证特定的序列:
    1. 接收人任务已创建。
    2. 端点已注册。
    3. 只有这样、 MPU (Linux) 才会通过 RPMessage_announce 通知 该服务存在。
    在修改后的版本中、代码在单个执行线程中运行。 在尝试建立 Virtio 握手 (ipc_lateVirtioCreate) 并向 Linux 宣布自身之前、您会强制 MCU 完成其本地接收器基础架构的设置。
    在最初的多任务处理版本中、 rpmsg_vdevMonitorFxn 和 rpmsg_responderFxn  都在竞争 CPU 周期。 如果 Linux 收到通知、但 MCU 接收器任务尚未完全初始化其栈或内部句柄、则来自 Linux 的前几条消息可能会被丢弃或导致同步失败。
    我希望你能理解这一点。
    此致
    Tarun Mukesh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是非常有帮助的。 谢谢你。