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.

[参考译文] TDA4AL-Q1:[TDA4AL] IPC 用户空间性能问题

Guru**** 2398695 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1487488/tda4al-q1-tda4al-ipc-userspace-performace-question

器件型号:TDA4AL-Q1

工具与软件:

您好:

   研究 A72和 R5F 内核之间的 IPC。 My SDK 中  10.01.00.04。

   我已经运行 rpmsg_char_simple 来测试回扫。 从输出日志中可以看到往返延迟时间。 它花费了大约90ms 的时间。 但我们需要更短的响应时间。

   我们怎么能做到这一点? 因为 IPC 是基于邮箱和共享内存。 为什么要花费很多往返时间?

root@j721s2-evm:/# rpmsg_char_simple -r 0 -n 100
创建了 Endpt 器件 rpmsg-char-0-6457、FD = 4端口= 1025
在 rproc id 0上使用 rpmsg 设备 rpmsg-char-0-6457交换100条消息...

发送消息#0:你好,那里0!
收到的消息#0:往返延迟(usecs)= 300220
你好!
发送消息#1:您好!
收到的消息#1:往返延迟(usecs)= 120220
您好!
正在发送消息#2:您好!2!
收到的消息#2:往返延迟(usecs)= 120665
你好!
发送邮件#3:你好那里3!
收到的消息#3:往返延迟(usecs)= 96650
你好!
发送消息#4:你好,那里4!
收到的消息#4:往返延迟(usecs)= 94130
你好!
发送消息#5:你好那里5!
收到的消息#5:往返延迟(usecs)= 91095
你好、5岁!
发送消息#6:你好那里6!
收到的消息#6:往返延迟(usecs)= 94505
您好!6!
发送消息#7:你好那里7!
收到的消息#7:往返延迟(usecs)= 97245
你好、7岁!
发送消息#8:你好,那里8!
收到的消息#8:往返延迟(usecs)= 98030
你好!
发送消息#9:你好,那里9!
收到的消息#9:往返延迟(usecs)= 91040
你好!
发送消息#10:你好那里10!
收到的消息#10:往返延迟(usecs)= 90415
你好、10岁!
发送消息#11:你好,那里11!
收到的消息#11:往返延迟(usecs)= 91065
你好!
发送消息#12:你好那里12!
收到的消息#12:往返延迟(usecs)= 90400
你好、12岁!
发送消息#13:你好,那里13!
收到的消息#13:往返延迟(usecs)= 92485
你好!
发送消息#14:你好,那里14!
收到的消息#14:往返延迟(usecs)= 90995
你好、14岁!
发送消息#15:你好那里15!
收到的消息#15:往返延迟(usecs)= 91660
你好、15岁!
发送消息#16:你好那里16!
收到的消息#16:往返延迟(usecs)= 100330
你好、16岁!
发送消息#17:你好那里17!
收到的消息#17:往返延迟(usecs)= 92455
你好、17岁!
发送消息#18:你好,那里18!
收到的消息#18:往返延迟(usecs)= 96590
你好、18岁!
发送消息#19:你好那里19!
收到的消息#19:往返延迟(usecs)= 102675

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

    您好!

    指定工程师不在办公室、敬请期待响应延迟。

    此致、

    Manojna

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

    您好!

    您可以查看 https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/10_01_00_04/exports/docs/pdk_jacinto_10_01_00_25/docs/datasheet/jacinto/datasheet_j721e.html 吗 ?

    所有 J7器件的 IPC 都保持不变。 您可以参考以上链接中的 IPC 性能数据。

    这大约是从 rpmsg_char_simple 示例发送到 R5F 内核并返回到 A72的"Hello world"时间。

    您可以通过在两端编写更好的示例来优化它。

    此致

    Tarun Mukesh

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

    大家好、 Tarun Mukesh:

       下表图片中、我有一些问题:

       1.测量单位是什么? 是 ms (毫秒)还是 us (微秒)?

       2.软管芯 A72是什么? 这是否意味着 A72会将回波发送到每个其他内核(MCU R5F0或主 R5F0或 C66x1等)并返回到 A72时间? 测试存储是否从 A72到其他核心往返时间、对吗?

       3.不同的数据大小是什么意思? 为什么不同尺寸有不同的性能? 是由内存复制引起的吗?

       4.从我的测试日志显示"往返延迟(usecs )= 102675",它是102ms ,对吗? 我认为这是很差的表现!

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

    大家好、 Tarun Mukesh:

       还有一个问题是什么是 BIOS? 这意味着 A72运行 Linux SDK 吗?

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

    您好!

    [报价 userid="642242" url="~/support/processors-group/processors/f/processors-forum/1487488/tda4al-q1-tda4al-ipc-userspace-performace-question/5714778 #5714778"]   1.测量单位是什么? 是 ms (毫秒)还是 us (微秒)?[/QUOT]

    我们的链接中已经提到了它。

    2. 软管芯 A72是什么? 这是否意味着 A72会将回波发送到每个其他内核(MCU R5F0或主 R5F0或 C66x1等)并返回到 A72时间? 测试商店是否从 A72到其他核心往返时间、对吗?

    主机内核 A72是 A72、用于启动发送的数据并回显。

    [报价 userid="642242" url="~/support/processors-group/processors/f/processors-forum/1487488/tda4al-q1-tda4al-ipc-userspace-performace-question/5714778 #5714778"]    3.不同的数据大小是什么意思? 为什么不同尺寸有不同的性能? 是由内存副本引起的吗?[/QUOT]

    有  

    4. 我的测试日志显示"往返延迟(usecs)= 102675"、结果是102ms、对吧? 我认为这是很差的性能!

    性能数字基于 BIOS 而不是 Linux。 您将 BIOS 与 Linux 进行比较的数据不正确。

    BIOS 是基本操作系统、而不是 Linux 或任何类型的 HLOS。

    此致

    Tarun Mukesh

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

    大家好、 Tarun Mukesh:

       谢谢您的评论!

       这是一个不错的方法。 我可以对 rpmsg_char_simple 执行什么操作? 减小数据大小? 还有其他理想吗? 因为往返时间太长! 或任何其他建议方式?

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

    您好!

    让我来检查一下、然后返回给您。

    此致

    Tarun Mukesh

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

    您好!

    我检查了 Linux 代码、我们正在测量发送呼叫前和接收消息后的时间。

    clock_gettime(CLOCK_MONOTONIC, &ts_current);
    		ret = send_msg(rcdev->fd, (char *)packet_buf, packet_len);
    		if (ret < 0) {
    			printf("send_msg failed for iteration %d, ret = %d\n", i, ret);
    			goto out;
    		}
    		if (ret != packet_len) {
    			printf("bytes written does not match send request, ret = %d, packet_len = %d\n",
    				i, ret);
    		    goto out;
    		}
    
    		ret = recv_msg(rcdev->fd, 256, (char *)packet_buf, &packet_len);
    		clock_gettime(CLOCK_MONOTONIC, &ts_end);
    		if (ret < 0) {
    			printf("recv_msg failed for iteration %d, ret = %d\n", i, ret);
    			goto out;
    		}

    send_msg()从用户空间调用内核级 API 导致 Linux 操作系统中的延迟、但我们无法在 Linux 操作系统端避免这种情况。

    在另一端 R5F 上、当使用 MCU1_0时、sciserver (强制任务)的优先级高于 IPC_ECHO_TEST;如果在 IPC_ECHO_TEST 任务与 sciserver 之间发生任何上下文切换、则可能会导致延迟一段时间。

    也许您可以用仅含 IPC_ECHO_TEST 任务的其他任意 R5F 内核进行检查、看看从中得到的更多数据。

    此致

    Tarun Mukesh

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

    大家好、 Tarun Mukesh:

       根据您的评论、我 在 MCU R5F 和 MAIN R5F 上测试 rpmsg_char_simple。 主 R5F 性能电池低于 MCU R5F。 但它似乎仍然具有大约70ms 的更大往返时间。

       我如何改进它? 因为我有一个应用 场景:

         1. MCU R5F 将从 CAN 总线获取 CAN 数据。

         2.如果发生某种紧急问题,将通过 IPC 从 A72向 MCU R5F 或从 MCU R5F 向 A72发送通知。

       因此、我们需要快速验证 IPC 通知往返时间。 对于 IPC 的快速响应时间、您有何建议?   

    在 MCU 域 R5F 上测试:rpmsg_char_simple -r 0 -n 10000

    发送消息#3194:你好那里3194!
    收到的消息#3194:往返延迟(usecs)= 89515
    你好!
    发送消息#3195:你好那里3195!
    收到的消息#3195:往返延迟(usecs)= 106435
    你好、那里3195!
    发送消息#3196:你好那里3196!
    收到的消息#3196:往返延迟(usecs)= 88340
    你好!
    发送邮件#3197:你好,那里3197!
    收到的消息#3197:往返延迟(usecs)= 87755
    你好、3197!
    发送消息#3198:你好,那里3198!
    收到的消息#3198:往返延迟(usecs)= 88600
    你好!
    发送邮件#3199:你好那里3199!
    收到的消息#3199:往返延迟(usecs)= 88045
    你好、3199!
    发送消息#3200:你好那里3200!
    收到的消息#3200:往返延迟(usecs)= 88680
    您好!3200!
    发送消息#3201:你好那里3201!
    收到的消息#3201:往返延迟(usecs)= 87420
    您好!3201!
    发送消息#3202:你好那里3202!
    收到的消息#3202:往返延迟(usecs)= 87950
    您好!3202!
    发送消息#3203:你好那里3203!
    收到的消息#3203:往返延迟(usecs)= 88345
    您好!3203!
    发送消息#3204:你好,那里3204!
    收到的消息#3204:往返延迟(usecs)= 89440
    您好!3204!
    发送消息#3205:你好那里3205!
    收到的消息#3205:往返延迟(usecs)= 89575
    您好!3205!
    发送消息#3206:你好那里3206!
    收到的消息#3206:往返延迟(usecs)= 88855
    您好!3206!
    发送消息#3207:你好,那里3207!
    收到的消息#3207:往返延迟(usecs)= 87800
    您好!3207!
    发送消息^C
    在处理信号2时进行清理和退出
    应用程序未关闭某些 rpmsg_char 器件
    收到的消息#3227:往返延迟(usecs)= 87670

    主 域 R5F 内核上的测试0:rpmsg_char_simple -r 2 -n 10000

    发送消息#2839:你好那里2839!
    收到的消息#2839:往返延迟(usecs)= 64900
    您好、2839!
    发送消息#2840:你好那里2840!
    收到的消息#2840:往返延迟(usecs)= 63945
    您好!2840!
    发送消息#2841:你好那里2841!
    收到的消息#2841:往返延迟(usecs)= 65010
    您好!2841!
    发送消息#2842:你好那里2842!
    收到的消息#2842:往返延迟(usecs)= 64365
    您好、2842!
    发送消息#2843:你好,那里2843!
    收到的消息#2843:往返延迟(usecs)= 80690
    您好!2843!
    发送消息#2844:你好那里2844!
    收到的消息#2844:往返延迟(usecs)= 61355
    你好、2844!
    发送消息#2845:你好那里2845!
    收到的消息#2845:往返延迟(usecs)= 60140
    您好!2845!
    发送消息#2846:你好那里2846!
    收到的消息#2846:往返延迟(usecs)= 60560
    你好、2846!
    发送消息#2847:你好那里2847!
    收到的消息#2847:往返延迟(usecs)= 60920
    您好!2847!
    正在发送消息#^C
    在处理信号2时进行清理和退出
    应用程序未关闭某些 rpmsg_char 器件
    收到的消息#2875:往返延迟(usecs)= 64185

    主 域 R5F 内核1上的测试:rpmsg_char_simple -r  2 -n 10000

    收到的消息#2806:往返延迟(usecs)= 86785
    您好!2806!
    发送消息#2807:你好那里2807!
    收到的消息#2807:往返延迟(usecs)= 71070
    你好、2807!
    发送消息#2808:你好那里2808!
    收到的消息#2808:往返延迟(usecs)= 68415
    您好!2808!
    发送消息#2809:你好那里2809!
    收到的消息#2809:往返延迟(usecs)= 68440
    您好!2809!
    发送消息#2810:你好那里2810!
    收到的消息#2810:往返延迟(usecs)= 67645
    您好!2810!
    发送消息#2811:你好那里2811!
    收到的消息#2811:往返延迟(usecs)= 69080
    你好、2811!
    发送消息#2812:你好那里2812!
    收到的消息#2812:往返延迟(usecs)= 69955
    你好、2812!
    发送消息#2813:你好那里2813!
    收到的消息#2813:往返延迟(usecs)= 68945
    你好、2813!
    发送消息#2814:你好那里2814!
    收到的消息#2814:往返延迟(usecs)= 68880
    您好、2814!
    发送消息#2815:你好那里2815!
    收到的消息#2815:往返延迟(usecs)= 68595
    你好、2815!
    发送消息#2816:你好那里2816!
    收到的消息#2816:往返延迟(usecs)= 68195
    你好、2816!
    发送消息#2817:你好那里2817!
    收到的消息#2817:往返延迟(usecs)= 68075
    你好、2817!
    发送消息#2818:你好那里2818!
    收到的消息#2818:往返延迟(usecs)= 68145
    你好、2818!
    发送消息#2819:你好那里2819!
    收到的消息#2819:往返延迟(usecs)= 68630
    你好、2819!
    发送消息#2820:你好那里2820!
    收到的消息#2820:往返延迟(usecs)= 68445
    你好、2820!
    发送消息#2821:你好那里2821!
    收到的消息#2821:往返延迟(usecs)= 68000
    你好、2821!
    发送消息#2822:你好那里2822!
    收到的消息#2822:往返延迟(usecs)= 67890

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

    您好!

    对于 Linux OS 端、没有任何需要修改的地方、这就是内部所需的时间。

    发送消息#2845:您好!2845!
    收到的消息#2845:往返延迟(usecs)= 60140

    在这里你几乎达到60毫秒,你的期望是多少?

    在 R5F 端、您可以将 IPC 保持为最高优先级的任务、以获得更好的结果。 但是、根据 MCU R5F、您应该将 sciserver 设置为最高优先级、而不是任何其他任务。

    此致

    Tarun Mukesh

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

    大家好、Tarun Mukesh:

       感谢您的评论和建议!

       我预计 IPC 往返延迟的平均值应为40ms (往返延迟)。 我可以这么做吗?

       如何测量从 SOC 到 MCU 的往返时间以及每个段上花费的时间? 我想对它进行测量、以便知道在哪里花费很长时间。 例如、userspace 到内核空间需要很多时间。 如何测量?

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

    大家好、 Tarun Mukesh:

       纠正了我的预期绩效。

       SoC 到 MCU 必须在40ms 内定期发送数据。 一个数据包中包含3000字节的数据大小。

       2. MCU 到 SOC 必须在10ms 内定期发送数据。 一个数据包中200字节的数据大小。

       作为我们的目标、SOC 到 MCU 数据大小为3000字节、但 IPC 最大值为496 (512-16)字节。 正如我所知、似乎有另一种通过 IPC 发送共享存储器数据地址的方法。 不通过 IPC 发送数据。 您是否有任何示例代码供我参考?

     

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

    你(们)好  

       我指的是网站 software-dl.ti.com/.../developer_notes_ipc.html

    • 为了减少延迟和/或发送更大的缓冲区、建议将指针/句柄/偏移量从离子堆传递到更大的共享存储器

       有任何示例吗?

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

    您好!

    [报价 userid="642242" url="~/support/processors-group/processors/f/processors-forum/1487488/tda4al-q1-tda4al-ipc-userspace-performace-question/5724939 #5724939"]
    • 为了减少延迟和/或发送更大的缓冲区、建议将指针/句柄/偏移量从离子堆传递到更大的共享存储器

       有任何示例吗?

    [报价]

    SDK 中没有这样做的示例。

    [报价 userid="642242" url="~/support/processors-group/processors/f/processors-forum/1487488/tda4al-q1-tda4al-ipc-userspace-performace-question/5724872 #5724872"]   作为我们的目标、SOC 到 MCU 的数据大小是3000字节、但 IPC 最大值是496 (512-16)字节。 正如我所知、似乎有另一种通过 IPC 发送共享存储器数据地址的方法。 不通过 IPC 发送数据。 您是否有任何示例代码供我参考?

    无参考代码。

     如何测量从 SOC 到 MCU 的往返时间以及每个细分市场上花费的时间? 我想对它进行测量、以便知道在哪里花费很长时间。 例如、userspace 到内核空间需要很多时间。 如何衡量?

    它在内核中花费的时间非常多地用于 Linux 操作系统。 由于操作系统驱动程序 API 不会进行更改或修改、因此这通常不会有太大帮助。

    目前您正在 R5F 内核上使用 IPC_ECHO_TEST、它不是优化的、打印需要很长时间、并且 sciserver 是最高优先级。

    在自定义 R5F 应用中、您需要将 IPC 任务保持为最高优先级并优化代码、而不打印任何控制台并检查响应时间。

    您是否使用 R5F 代码编写了定制应用程序?

    此致

    Tarun Mukesh

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

    大家好、 Tarun Mukesh:

         如果能做任何事情、我将尝试查看 ipc_echo_test!

       我看到另一个案例介绍了 rpmsg_char_zerocopy。 似乎可以在远程内核和 SoC 端之间发送更大的数据。 这是否也适用于 TDA4? 我可以使用它吗?

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

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

    您好!

    我们没有在 TDA4上使用这个、因此您可以看到没有示例。 如果不在此验证任何示例、我不能做更详细的评论。

    此致

    Tarun Mukesh  

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

    大家好、 Tarun Mukesh:

       感谢您发送编修。 我将首先关闭案例。 我将创建新案例的另一个问题。 非常感谢您的帮助!