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.

AM6442: ipc_rpmsg_echo_linux: 在Linux系统下的R5F、M4F之间无法使用RPMsg进行数据传递

Part Number: AM6442
Other Parts Discussed in Thread: TMDS64EVM

评估板: TMDS64EVM

MCU+SDK: V08.05

Linux SDK: V08.05

TI的技术支持你好:

需求:我这边有个项目规划了要使用A53核运行Linux系统并且需要与R5FSS0-1进行数据传递。每个R5F核之间也需要进行数据传递,比如R5F0_0与R5F0_1进行数据传递、R5F0_0与R5F1_0进行数据传递。通过阅读MCU+SDK文档里的ipc_rpmsg_linux_echo例子部分相关内容,了解到该例程的功能可以实现Linux系统下A53核与其他R5F核、M4F核的数据传递,R5F0-0与其他R5F核、M4F核进行数据传递。

问题:

当实际测试ipc_rpmsg_linux_echo示例时,发现R5F0-0和其他R5F内核和M4F内核不能使用RPMsg进行数据传输。运行linux系统的A53核和其他R5F和M4F核可以正常使用RPMsg进行数据传输。

R5FSS0-0 <--> R5FSS0-1    (X)

R5FSS0-0 <--> R5FSS1-0    (X)

R5FSS0-0 <--> R5FSS1-1    (X)

R5FSS0-0 <--> M4F             (X)

A53 <--> R5F   (√)

A53 <--> M4F   (√)

我现在遇到的问题其实之前在E2E上就有人问过,但似乎还没有讨论出这个问题的最终解决方法

(1) AM6442: AM6442: ipc_rpmsg_echo_linux: rpmsg exchange between RTOS/NORTOS CPUs failed - Processors forum - Processors - TI E2E support forums

 

  • 为了分析问题出在哪和让问题尽快地被解决。我在我这边对IPC_rpmsg_linux_echo例子进行一些简单的修改。并对修改的程序做了一些测试。

    修改的内容及测试结果如下所示。

    首先在一些关键节点调用DebugP_log,DebugP_log的内容通过在example.syscfg上配置Debug Log -->Enable Uart Log进行打印输出。

    1)[R5FSS0-0] 我在ipc_rpmsg_echo.c文件的第205行下调用DebugP_log来输出相关日志(ipc_rpmsg_linux_echo-->ipc_rpmsg_echo_linux_am64x-evm_r5fss0-0_freertos_ti-arm-clang)。由于例子里的RPMessage_send()RPMessage_recv()函数都是选择SystemP_WAIT_FOREVER来作为调用参数。根据对RPMsg API部分的描述,RPMessage_send()RPMessage_recv()都是以阻塞的方式调用。通过添加DebugP_log想着看在R5FSS0-0程序的一些关键节点有没有被执行到。配置example.syscfg文件的R5FSS0-0,Debug Log 下选择使能Uart1(E15E14)进行日志打印输出。

    2)[R5FSS0-1] 我在ipc_rpmsg_echo.c文件的第141行下调用DebugP_log来输出相关日志(ipc_rpmsg_linux_echo-->ipc_rpmsg_echo_linux_am64x-evm_r5fss0-1_freertos_ti-arm-clang)。我想看看R5FSS0-1是否接收到R5FSS0_0通过RPMsg发送的数据。我还修改了示例的配置。配置example.syscfg文件的R5FSS0-1,Debug Log 下选择使能另一个Uart来打印log信息。

    3)linker.cmd文件和example.syscfg的MPU部分保持原样

    4)在TMDS64EVM上运行的Linux系统为TI的Linux SDK。直接在TI官网上下载.wic文件,使用SD卡去启动Linux系统并运行。

    保存上面的修改的工程保存并编译。将生成xxx.out文件复制到linux系统里,在Linux系统里面重新配置R5F,M4F的可执行文件(3.6. IPC for AM64x — Processor SDK AM64X Documentation)。在Linux的Debug窗口输入reboot重新启动Linux系统。可以看到程序执行的输出结果如截图所示:

    1. R5F0-0核程序执行输出结果: 

    从上面的输出中我们可以看到,RPMessage_recv()函数好像没有成功执。并且阻塞在那了。

    2. R5F0-1核程序执行输出结果: 

    从上面的截图内容可以知道。R5F0-1没有收到R5F0-0核通过RPMsg传过来的数据。因为不满足if上的判断,if内部的内容没有被执行。

    3. Linux端rpmsg_char_simplerpmsg_client_sample的测试和Linux SDK文档的说明一致。

    通过上面的测试是否可以判断在R5FSS0-0上已经将数据通过RPMsg的方式发送到某一片“共享内存区域”?。但是并没有通知其他R5F核、M4F核使用RPMessage_recv()将数据读出来?从而导致程序的执行阻塞在RPMessage_recv()部分?

  • 根据上面的分析。我继续对ipc_rpmsg_linux_echo的工程做修改。基于上面所做的修改,我对该ipc_rpmsg_linux_echo例子里所有工程的linker.cmd和example.syscfg文件做修改。

    被修改的工程:

    ipc_rpmsg_echo_linux_am64x-evm_m4fss0-0_freertos_ti-arm-clang

    ipc_rpmsg_echo_linux_am64x-evm_r5fss0-0_freertos_ti-arm-clang

    ipc_rpmsg_echo_linux_am64x-evm_r5fss0-1_freertos_ti-arm-clang

    ipc_rpmsg_echo_linux_am64x-evm_r5fss1-0_freertos_ti-arm-clang

    ipc_rpmsg_echo_linux_am64x-evm_r5fss1-1_freertos_ti-arm-clang

    修改的内容参考ipc_rpmsg_echo例子的linker.cmd和example.syscfg文件。

    对于linker.cmd,修改了USER_SHM_MEM、LOG_SHM_MEM、RTOS_NORTOS_IPC_SHM_MEM所对应的地址数据。

    对于example.syscfg,对该文件内的所有R5F核工程的MPU-ARMv7-->CONFIG_MPU_REGION4-->Region Start Address由0xA5000000改成0x701D0000。

    • example.syscfg

    • linker.cmd

    修改ipc_rpmsg_echo.c文件第99行,将gMsgEchoCount从100000改为10。

    保存上面的修改的工程保存并编译。将生成xxx.out文件复制到linux系统里,在Linux系统里面重新配置R5F,M4F的可执行文件(3.6. IPC for AM64x — Processor SDK AM64X Documentation)。在Linux的Debug窗口输入reboot重新启动Linux系统。可以看到程序执行的输出结果如截图所示:

    1. R5F0-0核程序执行输出结果: 

    2.R5F0-1核程序执行输出结果: 

    通过上面R5FSS0-0和R5FSS0-1的输出结果的两张截图可以看到。

    经过这次测试的结果,是否可以认为R5FSS0-1可以使用RPMsg接收到来自R5FSS0-0的数据。并且将数据回传给R5FSS0-0。R5FSS0-0端也能接收到其他R5F核与M4F核所传递回来的数据?

    由于程序经过修改,此时Linux系统无法完全启动。

    Linux系统启动到打印Reached target System Initialization日志后,就循环打印下面三句话

    omap_i2c 20010000.i2c:controller time out

    omap_i2c 20010000.i2c:controller time out

    ssd1307fd 1-003c: Couldn’t send I2C command

    通过修改linker.cmd和example.syscfg文件。R5FSS0-0似乎能够通过RPMsg与其他R5F和M4F内核通信,但Linux系统无法正常启动。

    因为我不熟悉Linux的操作系统。因此除了上面的操作和rpmsg_char_simple相关联.so库被重新连接。没有对TI的Linux SDK做过其他更改。

    希望我的测试可以为TI的工程师定位问题提供一点帮助

    希望TI可以提供指导!

    如何让ipc_rpmsg_linux_echo例子可以完全实现文档里面所描述的功能?(AM64x MCU+ SDK: IPC RP Message Linux Echo (ti.com))

  • 您好,

    不知道您这边是否可以直接在英文论坛发帖询问?因为您的问题较复杂,这样可以避免转述时可能会出现的问题。

  • 您好,

    好的谢谢,英文论坛的工程师应该会在24-48h小时内给到您答复(今天仍然是国外的假期),如果周三前没有给到您答复我们来帮您催促下。

  • 您好,

    我们会先把中文论坛的这个帖子关闭,如果您需要任何帮助可以随时reopen该贴,谢谢!