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:Linux-RT 系统中 A53和 R5之间的通信延迟问题

Guru**** 2480245 points
Other Parts Discussed in Thread: AM6442

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1410313/am6442-communication-latency-issues-between-a53-and-r5-in-a-linux-rt-system

器件型号:AM6442

工具与软件:

从以下 URL 下载了 TI 的 Linux 内核、并使用 Linux 内核的 RT (实时)版本切换到了 ti-rt-linux6.6.6.y-cicd 版本。

https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/

使用 rpmsg_char_simple.c 中的以下示例代码

e2e.ti.com/.../4276.rpmsg_5F00_char_5F00_simple.c

测试了超过100,000次、并使用命令./rpmsg_char_simple -r 2 -n 100000和 chrt -f -p 10 $!设置优先级。 测试结果如下图所示:

从图中可以看出、最大延迟为1177us、这个值太高了、不符合我们的电流要求。 是否有优化的空间?

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

    尊敬的 TI 专家:

    您能否检查此问题是否与下面的主题有关?

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1388960/sk-am64b-rpmsg-between-a53-and-r5-performance-update/5328241?

    客户在选择 am64x 之前需要提高此性能、因此这对我们提供支持非常重要。

    谢谢!

    Kevin

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

    大家好、

    我看到您在前一个线程中找到了我的示例测试代码。

    关于测试输出的所有注释

    平均延迟输出
    请注意、 代码中的平均延迟测量计算会因较长的测试运行(例如、数百万或数十亿次运行)而中断。 我仍然没有找到一个清晰的方法来计算出那么多迭代的加权平均值-我最终在 Excel 中手动计算它用于那些早期的测试(导入 Histogram.txt ,乘以延迟测量的次数,执行总和(),然后除以测量的总数)。

    100,000次迭代的测试是否代表边缘情况?
    否 如果你真的想得到一个长期行为的感觉,我会尝试以数百万或数十亿的运行量运行。 说了这句话,不要运行测试-我想谈谈你的结果。

    我自那时以来了解到、这项工作的优先事项确实应超过50项。 -p 80或-p 98已被建议作为未来测试的良好设置。

    您的结果与我的结果大不相同-我们来弄清楚原因

    即使在我使用 Stress-ng 在 A53内核上添加一组后台负载时、在30亿次迭代中、平均延迟为30-35 us、并且延迟仅超过1毫秒2次。 您的平均延迟降低了约30倍: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1388960/sk-am64b-rpmsg-between-a53-and-r5-performance-update/5328241#5328241 

    您的 A53内核的运行频率是多少?

    Linux 上同时运行着哪些其它软件?

    您正在使用什么文件系统?

    您的文件系统在哪里运行? (即、关闭 SD 卡? 您是否使用 NFS 访问 PC 上的文件系统? NFS 文件系统不能用于此类延迟测试)

    如果只使用下载页面中的默认文件系统映像、在 SD 卡上运行、您会看到什么结果?
    SDK-AM64X-SDK 软件开发套件(PROCESSOR-SDK-LINUX)|德州仪器 TI.com
    tisdk-default-image-am64xx-evm

    您的用例是什么? 平均和最坏情况下的延迟目标是什么?  

    这将是一个更长的讨论。 请记住这一点、但现在让我们重点了解一下您的初始测试结果与我的测试结果有何不同。

    此致、

    Nick

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

    您好、Nick J ü、

    目前、CPU 以1GHz 的频率运行。 我正在使用以下 文件系统。

    默认情况下、文件系统放置在 SD 卡上以进行操作。 只有系统的默认任务、没有其他任务。 系统启动后、我运行以下任务:

    /rpmsg_char_simple -r 2 -n 100000 & chrt -f -p 10 $!

    我不确定我的工作环境是否与您的?相同

    此致、

    Mack

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

    另外、我们正在使用的 SDK 版本为10.00.07.04.as (如下所示):

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

    Mack、您好!

    讨论测试环境

    好的、这就是我希望您使用的环境。

    我对 SDK 10.0的预编译进行了测试。 我可能应该在实际的 SDK 10.0版本上再次运行测试、以确保内容一致。 我可能需要几天时间才能完成设置。

    关于 RT Linux 的免责声明

    同时、我们将讨论您的用例。 在投入大量开发时间之前、我想确保将 RT Linux 包含在关键控制路径中实际上是有意义的。 请记住、RT Linux 不是真正的实时操作系统。 我们可以使 RT Linux 在统计上有可能 满足某些延迟、但 RT Linux 无法保证满足某些延迟。 因此、如果每年一次或每两年一次的延迟要求缺失会破坏您的设计、我们不建议将 RT Linux 置于延迟关键型控制路径中。

    更多有关这方面的想法、请参阅
    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1085663/faq-sitara-multicore-system-design-how-to-ensure-computations-occur-within-a-set-cycle-time 

     有关用例的问题  

    您想对处理器执行什么操作、以及您打算在每个内核上运行哪些任务?

    您要在内核之间传输多少数据?

    需要的平均延迟是多少?

    需要什么最坏情况下的延迟?

    此致、

    Nick

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

    您好、Nick

    1. 讨论"缺少一年一次或每两年一次的延迟要求 "

      我们没有设备运行一年或几年的情况、因此我们不需要考虑该情况。

    2. 介绍"处理器的用途"

      我们在 AM64x 中使用 R5F 内核进行电机驱动、A53主要向 R5F 发送命令以控制电机运行。 目前、我们使用 AM6442、它有两个 A53内核。 将来、我们可以将实时任务和非实时任务分开、将实时任务放在一个内核上、而将非实时任务放在另一个内核上。 例如、向 R5F 内核发送命令的任务是实时任务、我们将在专用于实时任务的 CPU 上运行它们。

    3. 讨论"内核之间将传输多少数据"

      我们向 R5F 发送最多4K 的数据。

    4. 讨论"所需的平均延迟是什么以及最坏情况下所需的延迟是什么"

      我们只关心最坏情况下的延迟。 目前、我们的要求是最大延迟不应超过100微秒(us)。

    此致、

    Mack

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

    Mack、您好!

    缺少延迟要求  

    让我们进一步讨论这一点。 如果最大延迟偶尔超过100us、会发生什么情况? 整个系统是否会出现故障、或者只要极少数情况下出现故障、是否正常?

    传输的数据量  

    由于您的用例可能 要求一次传输超过496字节的数据、因此我们不希望仅使用 RPMsg 进行数据传输(每个 Linux RPMsg 数据包最多只能保存496字节。 与仅发送一组 RPMsg 消息相比、分配共享存储器区域并在共享存储器就绪时设置通知机制的效率更高。

    零复制示例将是您的良好起点。 我还在致力于将代码移植到 Linux 内核6.6上、希望有时间在接下来的几天内完成移植。

    https://git.ti.com/cgit/rpmsg/rpmsg_char_zerocopy/

    最坏情况延迟  

    这是最大延迟单向延迟还是往返延迟? 如果是单向延迟、是 Linux --> R5F、R5F --> Linux、还是两者兼而有之?

    该延迟是否包含计算时间? 或者只是在时间内从一个内核获取数据到另一个内核?

    请记住、在 Linux 中、中断响应时间将是 Linux 对 R5F 中断做出反应的限制因素。 如需了解更多详情、请访问上面提供的链接: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1085663/faq-sitara-multicore-system-design-how-to-ensure-computations-occur-within-a-set-cycle-time

    您可以根据循环测试基准了解默认 AM64x SDK 10.0文件系统的开箱即用中断响应延迟:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/10_00_07_04/exports/docs/devices/AM64X/linux/RT_Linux_Performance_Guide .html#Stress-ng-and-circular 测试

    此致、

    Nick

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

    零复制更新

    对于观看 zerocopy repo 的任何人、您会看到、我们只是为使用 Linux 内核5.10和 Linux 内核6.1的客户拆分了分支 ti-linux-6.1、我刚刚将一些修补程序合并到主分支中、为 Linux 内核6.6添加 remoteproc_cdev 支持: https://git.ti.com/cgit/rpmsg/rpmsg_char_zerocopy/

    请在使用内核6.6之前等待一天左右。 我仍然需要对自述文件进行一些重大更新以说明所有步骤。 暂定时间表是
    * Linux SDK 10.0:本周为所有受支持的设备增加了支持
    * MCU+ SDK 10.0:支持将一次增加一个处理器-可能需要几周或更长的时间。 在此之前、您可以使用早期版本的 MCU+ SDK。
    *基准代码:由于多个客户从低延迟的角度看待这个项目,我开始使用代码进行基准测试和提高性能。 代码将在到期时添加、确切时间待定
    * AM62Px 支持:将最终添加,确切时间待定。 如果您是 AM62Px 客户、但仍有支持尚未添加、请创建新的 e2e 主题并请求我。

    有关构建 AM64x RTOS 零复制代码的说明

    看起来 AM64x 代码自 SDK 8.4以来似乎尚未修改、但我刚刚验证了、如果引发编译错误的 Uint32变量更改为 uint16、则可以使用 MCU+ SDK 9.0编译 AM64x 代码、这不确定其他处理器是否需要类似的修改。 我还没有使用内存配置器工具(SDK 9.1及更高版本)尝试使用 SDK 版本的 AM64x 项目。

    在 Linux 计算机上的构建如下所示:

    // copy the rtos project to the MCU+ SDK
    ~/sdks/mcu_plus_sdk_am64x_09_00_00_35$ mkdir examples/drivers/ipc/ipc_rpmsg_zerocopy_linux
    ~/sdks/mcu_plus_sdk_am64x_09_00_00_35$ cp -r ~/git/rpmsg_char_zerocopy_worktree/rpmsg_char_zerocopy/rtos/* examples/drivers/ipc/ipc_rpmsg_zerocopy_linux/
    // build the examples
    // I had to go fix the uint32/uint16 build error here
    ~/sdks/mcu_plus_sdk_am64x_09_00_00_35$ make -s -C examples/drivers/ipc/ipc_rpmsg_zerocopy_linux/am64x-evm/system_freertos all
    // copy the R5F0_0 output to my EVM
    ~/sdks/mcu_plus_sdk_am64x_09_00_00_35$ scp examples/drivers/ipc/ipc_rpmsg_zerocopy_linux/am64x-evm/r5fss0-0_freertos/ti-arm-clang/ipc_rpmsg_zerocopy_linux.release.out root@192.168.1.164:~

    此致、

    Nick

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

    您好、Nick

    延迟要求  

    如果最大延迟偶尔超过100us、则整个器件将失去精度。 因此、我们不能允许这种情况发生。

    最坏情况延迟  

    该最大延迟是往返延迟。 A53和 R5F 之间的通信时间、R5F 和 A53之间的通信时间是指硬件通信时间、而不是应用发送和接收数据所需的时间。 以前、我们使用 EtherCAT 总线测量从发送数据到接收数据的时间、该时间在20-30微秒之间。 此测量还指网卡发送和接收数据之间的间隔、而不是应用层的间隔。

    这里、我有一个问题:为了实现下图所示的性能、我需要采取哪些步骤?

    此致

    Mack

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

    Mack、您好!

    提供设计建议时需要了解更多详细信息

    好的。 我需要有关您预期用例的更多详细信息。 我不知道公共论坛是最简单的方法、还是有更好的方法给我提供这方面的资料。 我要邀请 Kevin 提供他的建议。

    我需要一些细节、如所示
    *您的延迟要求的确切开始时间和结束时间是什么,开始和结束时间之间需要执行的确切步骤是什么(例如, 您的系统是否通过 EtherCAT 控制元件,然后我们在接收 EtherCAT 消息和发送 EtherCAT 消息之间有100usec 的时间? 我们是否使用 PRU 子系统来执行电机控制?)
    *我们期望每个内核会做些什么?
    *内核之间每个方向传输的数据是什么?
    *是要传输的数据量变量,还是始终为4096字节? 如果我们在内核之间传输不同数量的数据、那么每定量的数据是否有不同的延迟要求?

    以便复制我的测试结果  

    我现在准备好使用 SDK 10.0 RT Linux 构建 AM64x 板。 我正在完成零复制示例的 Linux 部分、因为这将是测试您用例性能的起点。 移植完成后、我会告诉您。

    免责声明- RPMsg 可能不是适合您用例的 IPC 方法

    根据您的具体用例、我们可能无法使用 RPMSG 作为内核之间的信令机制。 该 IPC 协议的设计目的是易于使用并轻松上溢至 Linux 驱动程序、但并非针对超低延迟而设计。 这并不意味着您的用例是不可能的-有许多不同的方法可以在不同的内核之间发送信号和传递数据。 但它确实意味着软件开发工作将更加繁重、因为您无法仅仅复制粘贴代码。

    此致、

    Nick

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

    Mack、您好!

    零复制更新

    Linux SDK 10.0支持已添加到 AM62x、AM62Ax 和 AM64x 的主分支中:
    https://git.ti.com/cgit/rpmsg/rpmsg_char_zerocopy/ 

    请在未来几周和几个月内对存储库进行额外更新。 除了 我之前的回复中列出的更新之外,我们可能会将构建过程从 autotool 更新为 cmake (仍然评估这是否对这个项目有意义)。

    其他更新  

    我已经重写了上面发现的 RPMSG 延迟的基准测试代码、并已开始将类似的基准测试功能添加到零复制项目中。 我将在开始测试和调试基准测试代码时提供其他更新。

    此致、

    Nick

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

    您好、Nick

    rpmsg_char_zerocopy使用命令(./rpmsg_char_zerocopy -r 2 -n 100、)测试了示例、但出现了以下问题。

    使用命令时(./rpmsg_char_zerocopy -r 2 -p 14 -n 100)、出现以下错误。 您能否建议如何正确设置remote_endpt参数并解释为什么屏幕截图中出现错误消息?

    此致、

    Mack

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

    Mack、您好!

    摘要:零复制代码未加载到 R5F 内核中。 我认为您仍在加载默认的 RPMsg Echo 固件。

    详细信息

    对于 remoteproc ID、请参阅以下文件:
    https://git.ti.com/cgit/rpmsg/ti-rpmsg-char/tree/include/rproc_id.h

    我在上周使用此命令进行了测试、该命令没有问题(我将 Linux devicetre 文件中的0xa500_0000修改为我的共享存储器区域):
    ./rpmsg_char_zerocopy -r 2 -n 100 -e /dev/dma_heap/carveout_ipc-memories@a5000000

    -r 2指 R5F0_0、如果您在 R5F0_0上加载了正确的固件并进行运行、它应该能够正常运行

    16是 R5F 固件中定义的 RPMsg 端点号:
    https://git.ti.com/cgit/rpmsg/rpmsg_char_zerocopy/tree/rtos/ipc_rpmsg_zerocopy.c#n60

    另一方面、13和14是在默认 RPMsg Echo 固件中定义的 RPMsg 端点。
    来自 mcu_plus_sdk_am64x_09_02_01_05/examples/drivers/ipc/ipc_rpmsg_echo_Linux/ipc_rpmsg_echo.c

    #define IPC_RPMESSAGE_SERVICE_PING        "ti.ipc4.ping-pong"
    #define IPC_RPMESSAGE_ENDPT_PING          (13U)
    
    /* This is used to run the echo test with user space kernel */
    #define IPC_RPMESSAGE_SERVICE_CHRDEV      "rpmsg_chrdev"
    #define IPC_RPMESSAGE_ENDPT_CHRDEV_PING   (14U)
    

    后续步骤  

    在运行 RPMsg Echo 代码时、您可以尝试运行开箱即用的 echo 示例、查看其是否按预期工作:
    https://dev.ti.com/tirex/explore/node?a=7qm9DIS__LATEST&node=A__Ab31zORiXVgIbeWGmbktOA__AM64-ACADEMY__WI1KRXP__LATEST

    然后、您可以按照以下步骤将零复制代码加载到 R5F 内核中、而不是 RPMsg 回声代码:
    https://dev.ti.com/tirex/explore/node?a=7qm9DIS__LATEST&node=A__AdAyuKWUWVV5j4wBc7C6XA__AM64-ACADEMY__WI1KRXP__LATEST

    警告:SDK 9.2.1和 SDK 10.0上的正常关闭可能会损坏  

    我在一天前才意识到这一点、因此我还没有时间进行测试。 但如果对 R5F 内核执行 echo > STOP、echo > START 会导致处理器冻结、这意味着正常关断被破坏。 在这种情况下、只需更新指向新固件的链接、然后重启处理器以加载新的 R5F 固件即可。

    此致、

    Nick

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

    您好、Nick J ü:

    1、我修改了如下所示的器件树。

    	apps-shared-memory {
    		compatible = "dma-heap-carveout";
    		reg = <0x00 0xa6000000 0x00 0x2000000>;
    		no-map;
    	};

    设备节点 cerveout_apps-shared-memory 出现在/dev/dma_heap 目录下。 使用以下命令./rpmsg_char_zerocopy -r 2 -n 100 -e /dev/dma_heap/carveout_apps-shared-memory 仍然会导致以下错误。

    2、我按照以下步骤将您的零复制代码加载到 R5F 内核中、而不是 RPMsg 回声代码:
    https://dev.ti.com/tirex/explore/node?a=7qm9DIS__LATEST&node=A__AdAyuKWUWVV5j4wBc7C6XA__AM64-ACADEMY__WI1KRXP__LATEST

    发生以下错误、我使用的是 RT 版本的 SDK 10.00.07。

    您使用的 SDK 版本是否与我的版本相同?

    我是否需要刷写 R5F 内核上的任何固件?

    此致、

    Mack

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

    Mack、您好!

    误差输出给出了正确的步骤。 如果 R5F0 core1仍在运行、则不能停止 R5F0 core0。 因此、您需要首先禁用 core1。

    不过、 我已确认 Remoteproc 驱动程序中有一个错误、因此平稳关机在 SDK 10.0中不能正常工作。 因此、在更新 Remoteproc 固件链接后、您将需要重新启动电路板。 然后、Remoteproc 驱动程序会在引导期间将新固件加载到 R5F 内核中。

    下面 是 我希望您执行的确切步骤:

    // SDK 10.0
    am64xx-evm login: root
    root@am64xx-evm:~# uname -a
    Linux am64xx-evm 6.6.32-rt32-ti-rt-g04a9ad081f0f-dirty #1 SMP PREEMPT_RT Fri Jul 26 14:42:37 UTC 2024 aarch64 GNU/Linux
    
    // first, let's check what happened during boot time
    // we can see that both r5f0_0 and r5f0_1 booted successfully
    // this is one way to see which remoteprocX value was assigned to each core
    // remember remoteprocX mappings can change every boot
    root@am64xx-evm:~# dmesg | grep remoteproc
    [    9.932368] platform 78000000.r5f: configured R5F for remoteproc mode
    [    9.961286] remoteproc remoteproc0: 78000000.r5f is available
    [    9.971516] k3-m4-rproc 5000000.m4fss: configured M4 for remoteproc mode
    [    9.972892] remoteproc remoteproc0: powering up 78000000.r5f
    [    9.972928] remoteproc remoteproc0: Booting fw image am64-main-r5f0_0-fw, size 434436
    [    9.974851] remoteproc remoteproc1: 5000000.m4fss is available
    [   10.003441] remoteproc remoteproc1: powering up 5000000.m4fss
    [   10.003471] remoteproc remoteproc1: Booting fw image am64-mcu-m4f0_0-fw, size 88248
    [   10.038734] platform 78200000.r5f: configured R5F for remoteproc mode
    [   10.055169] remoteproc remoteproc2: 78200000.r5f is available
    [   10.067912] remoteproc remoteproc2: powering up 78200000.r5f
    [   10.067942] remoteproc remoteproc2: Booting fw image am64-main-r5f0_1-fw, size 141772
    [   10.096189] remoteproc remoteproc0: remote processor 78000000.r5f is now up
    [   10.098237] remoteproc remoteproc1: remote processor 5000000.m4fss is now up
    [   10.129346] remoteproc remoteproc2: remote processor 78200000.r5f is now up
    ...
    
    // it doesn't matter where your R5F binary is stored.
    // For this test, my binary and userspace application is in /root/
    root@am64xx-evm:~# ls
    ipc_rpmsg_zerocopy_linux.release.out  rpmsg_char_zerocopy
    
    // this is where the remoteproc driver looks for firmware to load
    root@am64xx-evm:~# cd /lib/firmware/
    
    // where are the links currently pointing?
    root@am64xx-evm:/lib/firmware# ls -al
    total 24788
    drwxr-xr-x  8 root root    4096 Feb 27 19:49 .
    drwxr-xr-x 75 root root   49152 Mar  9  2018 ..
    -rw-r--r--  1 root root    2040 Mar  9  2018 LICENCE.ibt_firmware
    -rw-r--r--  1 root root    2046 Mar  9  2018 LICENCE.iwlwifi_firmware
    lrwxrwxrwx  1 root root      42 Feb 27 19:49 am64-main-r5f0_0-fw -> /root/ipc_rpmsg_zerocopy_linux.release.out
    lrwxrwxrwx  1 root root      79 Mar  9  2018 am64-main-r5f0_0-fw-sec -> /usr/lib/firmware/ti-ipc/am64xx/ipc_echo_test_mcu1_0_release_strip.xer5f.signed
    lrwxrwxrwx  1 root root      59 Mar  9  2018 am64-main-r5f0_1-fw -> /usr/lib/firmware/mcusdk-benchmark_demo/am64-main-r5f0_1-fw
    lrwxrwxrwx  1 root root      79 Mar  9  2018 am64-main-r5f0_1-fw-sec -> /usr/lib/firmware/ti-ipc/am64xx/ipc_echo_test_mcu1_1_release_strip.xer5f.signed
    
    // I already have am64-main-r5f0_0-fw pointing to my firmware
    // but let's pretend I also wanted to load the same binary into r5f0_1
    root@am64xx-evm:/lib/firmware# ln -sf ~/ipc_rpmsg_zerocopy_linux.release.out am64-main-r5f0_1-fw
    
    // is the link updated?
    root@am64xx-evm:/lib/firmware# ls -al
    total 24788
    drwxr-xr-x  8 root root    4096 Mar  7 11:19 .
    drwxr-xr-x 75 root root   49152 Mar  9  2018 ..
    -rw-r--r--  1 root root    2040 Mar  9  2018 LICENCE.ibt_firmware
    -rw-r--r--  1 root root    2046 Mar  9  2018 LICENCE.iwlwifi_firmware
    lrwxrwxrwx  1 root root      42 Feb 27 19:49 am64-main-r5f0_0-fw -> /root/ipc_rpmsg_zerocopy_linux.release.out
    lrwxrwxrwx  1 root root      79 Mar  9  2018 am64-main-r5f0_0-fw-sec -> /usr/lib/firmware/ti-ipc/am64xx/ipc_echo_test_mcu1_0_release_strip.xer5f.signed
    lrwxrwxrwx  1 root root      42 Mar  7 11:19 am64-main-r5f0_1-fw -> /root/ipc_rpmsg_zerocopy_linux.release.out
    
    // reboot to load the new firmware
    root@am64xx-evm:/lib/firmware# reboot -f

    此致、

    Nick

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

    对于未来的读者、请在此处查找构建 R5F 代码的注意事项:
    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1410313/am6442-communication-latency-issues-between-a53-and-r5-in-a-linux-rt-system/5407807#5407807

    此致、

    Nick

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

    Mack、您好!

    我想向您提供部分最新信息。

    TI-rpmsg-char 示例已更新、可用于测试

    我已经更新了您之前找到的 ti-rpmsg-char 示例代码、现在该代码应该能够计算数十亿次测试运行的平均延迟。 这与您在一周左右发现的测试代码不同、在测试代码中的平均延迟计算会因大量测试运行而中断。 提醒一下、对于上一个线程中的10亿次测试运行、我必须通过将直方图数据导入到 Excel 中并在 Excel 中计算平均值: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1388960/sk-am64b-rpmsg-between-a53-and-r5-performance-update/5328241#5328241来计算平均延迟

    更新后的代码如下所示:

    我还不会将其推送到公共存储库、因为我可能想要进行其他更改、以便将延迟基准测试集成到未来的 Linux_Performance_Guide 文档中:https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/10_00_07_04/exports/docs/devices/AM64X/linux/RT_SDK.html 

    e2e.ti.com/.../0001_2D00_Update_2D00_max_2D00_message_2D00_size_2D00_to_2D00_496.patch

    e2e.ti.com/.../0002_2D00_Replace_2D00_fixed_2D00_number_2D00_of_2D00_read_2D00_bytes.patch

    e2e.ti.com/.../0003_2D00_example_2D00_add_2D00_latency_2D00_avg_2D00_worst_2D00_case_2D00_histogram.patch

    初始测试结果  

    在了解到我尚未优化文件系统和 Linux 内核的情况下、这与使用开箱即用的默认文件系统获得的 RPMsg 性能一样好。 添加共享存储器读取和写入将增加更多延迟。 如果这些数字不足以满足您的用例需求、则需要评估 Linux 和 R5F 之间的其他信令方法。

    通过 RPMsg 发送1个字节的延迟远短于通过 RPMsg 发送496个字节的延迟。 这个发送496字节10亿次迭代的测试仍然在运行、但我会在测试完成后立即添加结果。

    测试方法  

    软件

    RT Linux 文件系统:
    来自 https://www.ti.com/tool/download/SDK-AM64X 的 tisdk-default-image-am64xx-evm.rootfs.wic.xz、PROCESSOR-SDK-LINUX 10.00.07.04

    R5F 代码:
    使用在文件系统映像上预构建的 ipc_rpmsg_echo_linux 固件

    Linux 用户空间代码:
    将上述补丁应用于 https://git.ti.com/cgit/rpmsg/ti-rpmsg-char/

    修改 Linux 用户空间代码中的这些行、并重新编译应用程序、以便在发送1个字节、496个字节或其他内容之间进行选择:

                    /* select how many bytes to send per message */
    
                    /* send 1 byte */
                    sprintf(packet_buf, "0");
                    /* send 4 bytes */
                    //sprintf(packet_buf, "0123");
                    /* send 32 bytes */
                    //sprintf(packet_buf, "01234567890123456789012345678901");
                    /* "normal" test: do the hello message */
                    //sprintf(packet_buf, "hello there %d!", i);
                    /* maximum test: send 496 bytes (i.e., 495 bytes plus null termination) */
                    //sprintf(packet_buf, "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234");

    我重命名了输出文件、以便跟踪哪个二进制发送了多少字节。

    最后、我禁用了 R5F 子系统的 core1、并使用 core0运行测试(目的是确保另一个内核上运行的代码不会影响延迟)。

    运行的测试如下所示:
    与 R5F0_0交谈。 运行1字节测试10亿次、并将优先级提高到50以上和99以下
    ./rpmsg_char_simple_1byte -r 2 -n 1000000000 & chrt -f -p 80 $!

    另一个可能的测试是在 Linux 上添加后台负载。 在这种情况下、命令将如所示
    Stress-ng --cpu-method=all -c 4 & ./rpmsg_char_simple_1byte -r 2 -n 1000000000 & chrt -f -p 80 $!

    肠道检查:测试10,000次迭代  

    功能 平均延迟 最坏延迟
    ./rpmsg_char_simple_1byte -r 2 -n 10000 & chrt -f -p 80 $! 28us 205us
    ./rpmsg_char_simple_496 byte -r 2 -n 10000 & chrt -f -p 80 $! 147 μ s 257us

    未绘制这些测试的直方图

    测试、迭代次数为10亿次  

    功能 平均延迟 最坏延迟
    ./rpmsg_char_simple_1byte -r 2 -n 1000000000 & chrt -f -p 80 $! 28us 203usec
    ./rpmsg_char_simple_496 byte -r 2 -n 1000000000 & chrt -f -p 80 $! 147 μ s 334 μ s

    功能 直方图
    ./rpmsg_char_simple_1byte -r 2 -n 1000000000 & chrt -f -p 80 $!
    ./rpmsg_char_simple_496 byte -r 2 -n 1000000000 & chrt -f -p 80 $!

    此致、

    Nick

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

    发送496字节的10亿次测试运行结果已在上方进行了更新。

    此外、该测试将验证我更新后的代码中使用的更新后平均值和最坏情况计算。 我将在下一个零复制示例中添加相同的测量值。

    此致、

    Nick

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

    Mack、您好!

    我将从10月7日到10月11日度假。 请告诉我,如果你需要我之前的任何东西,我会尝试为你做,在我去度假之前。

    此致、

    Nick

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

    您好、Nick:

    我已经测试了 rpmsg_char_zerocopy 示例、从 A53内核发送4096字节数据到 R5F 内核、然后让 R5F 内核返回4096字节返回到 A53内核。 最大往返时间约为350微秒、基本上符合我们的要求。 我有一个问题:rpmsg_char_zerocopy 示例和 rpmsg_char_simple 示例有什么区别? 您能说明一下他们的原则吗?

    此致、

    Mack

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

    Mack、您好!

    这两个示例之间的区别是什么?

    rpmsg_char_simple 将一个 RPMSG 从 Linux 用户空间发送到远程内核、然后远程内核发回相同的消息。 在上面我修改的代码(https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1410313/am6442-communication-latency-issues-between-a53-and-r5-in-a-linux-rt-system/5434861#5434861)中、您可以发送一条1字节的消息、最多是496字节的消息。

    rpmsg_char_zerocopy 设置共享存储器区域。 Linux 将数据复制到共享存储器区域、然后发送一个 RPMsg 以通知远程内核可以读取该数据。 远程内核读取共享存储器、将不同的数据模式写入共享存储器、然后将 RPMSG 发送回 Linux 用户空间应用。 最后、Linux 用户空间会读取共享存储器、并检查数据是否已按预期方式修改。

    Codesys 问题  

    我们的"常规"循环测试结果在 SDK 文档中报告。 对于 SDK 10.0、我们看到了大约50-60us 的最坏情况循环测试结果:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/10_00_07_04/exports/docs/devices/AM64X/linux/RT_Linux_Performance_Guide .html

    但是、我的一位团队成员报告说、在使用 Codesys 时、Linux 周期时间会出现巨大尖峰。 导致延迟较大的原因是 Codesys CodeMeter 许可证应用程序。 有关这些测试的更多信息、请参阅 https://www.ti.com/lit/spradh0中的"优化"一节。

    在 Codesys 运行时、您是否还会看到更大的循环测试结果? 如果您仍然看到较小的循环测试结果、您要做些什么来防止 CodeMeter 代码损害性能?

    我的团队仍在了解 Codesys、因此我们可能无法了解某些内容(例如 CodeMeter 实际上不使用某些 Codesys 许可证运行)。

    其他更新  

    我没有时间做我想做的测试零复制之前我的假期。 我将回到10月14日这一周。

    让其他人检查您的测试代码会有所帮助(以确保代码实际测试您希望代码测试的内容)。 如果您希望我在我返回后 重温一下您的测试代码、请与 Kevin Peng 分享、我在回来后会重温一下。

    此致、

    Nick

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

    您好!

    对延迟答复深表歉意。 如果您需要我的其他资源来启用 IPC、请告诉我。

    CoDeSys 运行时的循环测试结果、您能给我什么信息吗?

    此致、

    Nick

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

    对于未来的读者、我们已开始就 Linux 驱动程序和远程内核之间的 IPC 进行新的讨论。 讨论内容如下:
    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1441319/am6442-creating-ipc-between-linux-kernel-driver-and-r5f 

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

    您好!

    关闭螺纹、因为很长时间没有响应。 如果您想继续讨论、请随时回过头来。

    此致

    Ashwani