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.

[参考译文] Linux/BEAGLEBN:从 PRU 进行 DDR 访问

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/709506/linux-beaglebn-ddr-access-from-pru

器件型号:BEAGLEBN

工具/软件:Linux

我一直在深入研究文档和论坛、以及互联网上的众多来源、但我无法找到任何关于如何最有效地让 PRU 访问更大块的全局存储器(DDR)的确切答案。 用例包括帧缓冲器(PRU 从 DDR 读取)或数据采集器件(PRU 写入 DDR)。

在 RemoteProc RPMsg 之前如何执行此操作的示例有很多。 将存储器指针值从 Linux 传递到 PRU 是否微不足道(这会相当不安全、但如果这是实现速度所需的、那么也是如此。) 还是有一些 RemoteProc 或 RPMsg 机制?  

请提供指向文档的任何提示或指针!

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

    我已要求 PRU 专家发表意见。 同时,下面是 RemoteProc 文档链接: processors.wiki.ti.com/.../PRU-ICSS_Remoteproc_and_RPMsg
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在浏览论坛时、我找到了以下条目: e2e.ti.com/.../642081

    这个问题似乎意味着通过 RPMsg 共享主机存储器不允许最大可能的吞吐量。 真的是这样吗? 具体而言、开销到底在哪里? 对于共享主机存储器吞吐量可能最高的用例、即几 MB 主机存储器的固定缓冲器、例如、尽管 RPMsg 开销很大、但它仍然是可行的方法吗?

    替代方案、即通过器件树保留主机存储器、似乎是安全且合理直接的-或者这是否仍然需要具有根访问权限的/dev/mem? 我是否可以使用任何指向演示代码的指针?
    我非常希望得到一些指导。

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

    Markus、您好!

    RPMsg 用于 ARM 和 PRU 之间的通信、仅允许您发送492字节的消息。 从 PRU 到 ARM 需要一些时间 、如这里所述。

    PRU 可以访问整个存储器空间、因此无需任何特殊协议即可让 PRU 轻松读取大块存储器。

    如果我们知道您的用例、我可以为您提供更多详细信息。 例如、您只是读取 DDR 的 PRU 吗? 您是否尝试以特定速率读取特定数量的数据? 您是否正在尝试将信息从一个内核传递到另一个内核? 您是否正在尝试流式传输信息、例如音频?

    此致、  

    Nick

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

    您好、Nick、

    我真的想到了两个用例(我已经提到过它们)、它们是需要最大吞吐量的典型示例:

    1. 帧缓冲区:PRU 按顺序读取几 MB 主机 RAM (DDR)、并为某些显示生成适当的输出。
    2. 数据采集:PRU 按顺序将几 MB 数据从 ADC 写入主机 RAM (DDR)。

    在这两种情况下、控制功能当然是必要的、但让我们将它们放在一边、专注于最大 吞吐量。

    据我所知、在 PRU 侧、一旦知道地址范围、这就很简单。 我不太清楚如何在 Linux 端执行此操作、Linux 内存管理引入了许多抽象层。 我一直在想通过器件树分配固定数量的 RAM、然后在其上面创建一个存储器映射器件。 或者类似的东西...

    是否有任何示例说明如何最好地实现这一点?

    此致、

    Markus

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    处理此主题的人员今天不在办公室、下周将返回、然后将作出响应。
    此致、
    Schuyler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    BeagleBoard 论坛上提出了类似的问题: ""="">"RemoteProc DDR 访问:将映像从 PRU 传输到 ARM "

    我认为可以公平地说,人们对这个问题有着更广泛的兴趣。

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

    Markus、您好!

    RPMsg/RemoteProc 当前没有任何内置方法在内核之间移动大量数据。 它确实会对您是尝试从内核还是从用户空间访问 PRU 数据产生影响。

    解决移动数据问题的一些示例方法:

    1)(不是您的用例)如果每次传输的信息量小于8k 或12k、则 PRU 内核可以将数据加载到 ICSS 的本地 RAM 中(好处是 PRU 在此处的存储器访问比在 DDR 中的访问速度快得多。 我不确定 ARM 的延迟)。 只要 ICSS 未实现以太网、Linux 就不必保留该内存空间。

    2) 2) PRU 内核可以将数据加载到不同的内部存储器或外部 DDR 存储器中。 请记住、处理器外部的内存总是比处理器内部的内存慢。 Linux 可以在器件树中保留该 DDR 存储器空间。 查看 TIDA-01555 项目 PRU 和 ARM 之间交替缓冲区通信示例代码-该示例显示了 PRU 固件(查看控制器 PRU 的固件)、用户空间代码和器件树。 我还听说过使用 CMEM API 来保留 DDR 存储器、但我没有深入研究过该选项。

    3) DMA 可能比使用 memcpy (应使用 LBBO 汇编指令)具有速度优势、但我无法肯定。 我还没有亲自研究 DMA。

    在信令方面、您可以使用 RPMsg 来告诉一个内核、一个缓冲区已准备好读取。 如果您不需要发送消息(即您只需要中断)、则可以使用 INTC 系统事件进行通信、通信速度应快于 RPMsg。 uio 提供了另一种通信方式、但在这种情况下、TI 不支持 UIO。

    此致、  

    Nick

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

    我将此问题标记为已解决。 如果您有任何疑问、请回复!

    此致、
    Nick