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.

[参考译文] 66AK2G12:ARM 和 DSP 之间的 IPC RPMSG 消息队列消息传递开销随着 DSP 工作所花的时间按比例增加

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1237962/66ak2g12-ipc-rpmsg-message-queue-messaging-overhead-between-the-arm-and-dsp-increases-proportionally-with-the-time-spent-doing-work-the-dsp

器件型号:66AK2G12

在我们的项目中、我们 将在 ARM/Linux 处理器上接收音频数据、将数据放入共享存储器区域、然后传送 DSP/BIOS 来执行音频数据的处理。  一旦 DSP 完成音频处理、则会将相同的 IPC 消息返回至 ARM、表示处理完成、并可能会发送下一条消息。  此过程按预期运行、但需注意一点;随着 DSP 处理音频数据所用的时间增加、ARM 接收 DSP 返回消息和音频后处理所需的时间也增加。  开销的增加大约为 DSP 处理其工作所花费时间的18%。  

我们测试了 ARM/Linux 应用程序来测量用于各种 DSP 工作的单条消息的往返时间。  下面是测量表:

Linux 单调耗时往返 TX/RX 时间(毫秒)

DSP 处理延迟(毫秒)

开销(毫秒)

延迟百分比形式的开销

0.15

0

0.15

100

6.27

5

1.27

20.25518341

12.38

10

2.38

19.22455574

24.58

20

4.58

18.63303499

36.79

30

6.79

18.4561022

当 DSP 不执行任何工作时、IPC 消息需要0.15ms 往返时间。  我们假设这是 ARM 和 DSP 之间往返数据包的"基本"开销。  随着 DSP 上的处理延迟的增加、开销也会增加。  我们期望往返时间应接近 DSP 处理延迟+基本开销(.15ms)加上/减去一些小差异。  但我们发现、开销随着 DSP 处理的增加而增加。  如果您从 ARM/Linux 端进行的所有往返测量中减去基本开销(.15ms)、开销大约为 DSP 上进行处理所花费时间的18%。  

我们正在尝试了解这种额外开销来自哪里?  我们已尝试了以下所有功能、但仍然看到相同的行为:  

  1. 非 RT 内核与 RT 内核
  2. 作为 RT 运行 Linux 线程与不运行 RT
  3. 从 L2SRAM 运行 DSP 与从 DDR 运行 DSP (与 Linux 共享)
  4. 将 DSP RX 消息队列单独移至 L2SRAM (在 DDR 中含代码)
  5. 具有或不具有在 ARM 上运行的任何其他进程-除了内置/标准进程(在非 RT 与 RT 内核中涉及)
  6. Task_sleep ()作为 DSP 中的延迟与硬编码 NOP 环路相比在实际音频处理中的延迟
  7. 轮询返回数据包的 RX MessageQ 与永远等待

作为完整性检查、我还使用库存工具执行了完全相同的实验、 IPC_3_50_04_08/exmaamples/66AK2G_Linux_elf/ex02_MessageQ  链路演示应用程序。  我所做的唯一改动是、在接收消息之后、在返回消息之前、在 Linux 应用程序中添加计时仪表、并在 DSP 中添加固定的延迟。

应用程序 c 我添加了

Clock_gettime (clock_monotonic、&start_mono);

App_exec() 在分配和添加消息之前

Clock_gettime (clock_monotonic、&end_mono);

diff = 1000000000 *(end_mono.tv_sec - start_mono.tv_sec)+ end_mono.tv_nsec - start_mono.tv_nsec;
printf ("rt:%llu 纳秒\n"、diff);
fflush (stdout);

从 DSP 再次接收并释放消息之后执行最后一次写入。

server.c 我添加了

Task_sleep (X);  

server_exec() 在收到消息后、但在返回之前。

这一采用"样本"消息队列演示应用的实验得到的结果是相同的。  随着 DSP 中 X 的值增加、往返开销也增加;往返时间不仅仅是基本开销(.15ms)+ Task_sleep (X)、它大约是基本开销(.15ms)+ Task_sleep (X)+.18 (Task_sleep (X)。

我们希望有人可以帮助了解这种额外开销来自哪里?

谢谢。

杰里米

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

    您好、Jeremy、

    在深入讨论之前、我只需在此列出一些支持注意事项:根据 SDK 页面的 RTOS 亮点部分 和本 E2E 声明、我们无法再为在 K2G 内核上运行的 TI_RTOS/DSP/BIOS 提供设计支持。 这意味着我们针对 DSP 或 IPC 3.x 软件可提供的支持将会受到限制。

    那么、 您是否使用了 "默认"IPC3.x 配置? 如果没有,也许你可以考虑使用一个替代的交通工具和司机:https://software-dl.ti.com/processor-sdk-rtos/esd/docs/06_03_00_106/rtos/index_Foundational_Components.html#optimizing-notify-and-messageq-latency

    此致、

    尼克

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

    感谢您输入 Nick -我将尝试使用链接中列出的一些优化方法进行实验。  我们在 DSP 上启用了跟踪-这可能是有用的吗?   跟踪特性似乎会呈现"常量"开销、而我们看到的开销与我们在 DSP 上"工作"的时间量成正比、但值得一试。   

    它就像我们忙于处理 DSP 时、在后台"积累"工作、当 DSP 可以再次运行并返回处理后的数据时、我们会因这种累加的工作而受到惩罚。

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

    您好、Jeremy、

    我假设此跟踪功能会留下您可以读取的日志?  如果 IPC 3.x 在 AM62/AM64等器件上的工作方式与后来的 RPMSg I 支持的类似、我预计跟踪日志仅在写入日志时需要处理时间-因此假设您看到的日志是相同或类似的、 如果造成延迟差异的是布线本身、我会感到惊讶。 尽管只是为了确保这一点、但没有引线并没有什么坏处。

    此致、

    尼克