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:使用 DMA 读取 AM64x PRU 内核上的外部 ADC 数据

Guru**** 2486065 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1426062/am6442-using-dma-to-read-external-adc-data-on-am64x-pru-core

器件型号:AM6442

工具与软件:

尊敬的 TI 团队:  

我正在开发一个 PRU 应用、该应用处理从外部 ADC 收集的数据、采样率约为48 MHz。 PRU 负责捕获数据并将其推入循环缓冲区、其中主 应用程序(在 A53内核或 R5F 内核上运行)将访问数据以进行进一步分析。


我正在寻求以下方面的指导:

1. 如何构建 PRU 固件以确保数据在不丢失的情况下被捕获?

2. 使用 DMA 将数据从 PRU 移动到主处理器的系统存储器是否可行? 如果是、设置 PRU 和系统内存之间的 DMA 通道的最佳方法是什么?

3. 在 PRU 和主处理器之间以如此高的数据速率传输数据时、是否存在任何延迟或同步问题?

4. 在 Linux 或 R5F 上运行的更高级别软件,最大限度地减少延迟并确保数据及时可用的最佳方法是什么?

5. 有助于此配置的任何现有示例或文档。

感谢您提供任何建议、包括有关此主题的参考代码或文档。

谢谢!

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

    您好!

    您是否已了解此代码? 它 为 R5F <--> PRU <-->外部 ADC 提供代码

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/10_00_00_20/exports/docs/api_guide_am64x/DRIVERS_PRU_ADC.html

    此致、

    Nick

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

    您好、Nick。

    我回顾了您建议的有关 R5F <->PRU <-->外部 ADC 的示例。 给定的示例演示了 PRU 和 R5F 内核之间的 IPC 机制。 在本例中、用于通过 IPC 传输数据的 API 需要(15 + 10 *缓冲区数量)个周期来发送数据、我实际上测量了该时序、而发送单个缓冲区大约需要70ns。 此持续时间太高、无法满足我们的要求。

    是否有其他方法可以在30ns 内实现类似的功能?

    谢谢!
    Shivangi

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

    Shivangi、您好!

    您是如何进行分析的?

    我假设您遵循了以下步骤?

    1) 1)编译了代码并保留了从 mcu_plus_sdk_am64x_10_00_00_20/source/pru_io/driver/pru_ipc.c 生成的汇编指令

    2)您可以通过查看生成的汇编代码来查看周期数

    对于将来的读者、您可以在此处查看用 C 语言代码生成汇编代码的步骤:
    -keep_asm
    https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/10_00_07_04/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab3.html 

    使用混合 C 和组装

    根据生成的汇编代码以及您自己设计的需求、您可能直接用汇编语言编写更多优化的代码。

    有关在混合 C 和汇编语言中进行编码的指导如下:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/10_00_07_04/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab2.html

    此致、

    Nick

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

    对我有更多的想法

    核心频率

    您的 PRU 内核的运行频率是多少? 写入的示例代码可能为时钟周期写入、以便以特定的速率递增(例如、每个 PRU 时钟周期的速率为5ns (200MHz)或4ns (250MHz))。 AM64x PRU 内核能够运行的最快速度为333MHz (确切值为3ns、而不是3.03ns)。

    在多个内核之间拆分任务  

    我觉得示例 ADC 代码是写入以在单个 PRU 内核(icss_g0_pru0)上运行的。

    一种很常见的软件设计选择是仅放置用于管理 PRU 内核上 IO 接口的代码、然后放置用于将数据移入和移出 RTU 内核上 PRU 子系统的代码。 从而在您的用例中实现更高性能。

    此致、

    Nick

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

    您好、Nick。


    感谢您的建议。
    我们将尝试您建议的方法。
    但是、关于 RTU_PRU 内核、我们需要一些更多详细信息:用于了解 RTU_PRU 内核的示例代码和文档。

    该 RTU_PRU 内核与常规 PRU 内核有何不同?

    为什么在数据表中 RTU_PRU 内核被称为"辅助"?

    谢谢。

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

    您好、Vraj、

    您可以将 RTU 想象成 基本上与 PRU 内核类似、只不过它无法访问 PRU GPI/PRU GPO 信号。

    请查看技术参考手册(TRM)的"Processors and Accelerators">"PRU">"PRU_ICSSG Overview"一章、获取一个很高的概述。

    这些较旧的视频可能包含一些其他详细信息:请查看主题> PRU-ICSSG 简介
    https://www.ti.com/video/series/pru-training-series.html

    至于基本的 RTU 示例、我在 PRU 软件支持包(PSSP)中提供了其中一些示例、这些示例可能是您的良好起点:
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am64x

    此致、

    Nick

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

    您好、Nick。
    感谢您的建议。  

    根据生成的汇编代码以及您自己的设计需求、您或许可以直接在汇编语言中编写更优化的代码。

    我们已经为 PRU 内核配置了333MHz 频率。 我们使用 混合的 C 和汇编语言实现了优化代码、并获得了70ns 的 IPC 时间。

    在 ADC 示例中、我们根据 IPC 的给定设置了解了什么:
    -使用 PRU IPC 发送函数,我们将为1个通道发送1KB 的数据。
    - AS、 NO.of data 字节=(缓冲区数量)*(NO.of block)*(blocksize)*(datasize)



    但是、当我们实际执行示例时、我们观察到:
    -它正在读取一个存储器地址128次(块大小),然后跳转到下一个存储器地址。
    -它总共只读取8 (没有缓冲区)内存地址。

    上述观察结果是否正确?

    此致、
    Shivangi

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

    此外、使用以下命令的 PRU 可使用 IPC 发送数据:

     M_PRU_IPC_SEND     R1.b0、ADC_DATA_REG_1、R0.b0、R29、CONFIG_PRU_IPC0_RX_INTR_ENABLE CONFIG_PRU_IPC0_RX_EVENT

     温度范围 r1.b0 是数据寄存器的起始地址。

    在我们的用例中、我们需要传递地址 ICSS_SMEM_CONST 而不是 r1.b0 . 因为我们的数据存储在 PRU 的本地共享存储器中。
    您能建议一个传递地址的方法吗 ICSS_SMEM_CONST IPC 发送 API 中。

    谢谢!
    Shivangi

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

    Shivangi、您好!

    这些都是好问题。 在一周的剩余时间内休假之前、我的时间已经用完了、因此我需要将您的线程重新分配给另一位团队成员。 如果您在几个工作日内未收到回复、请随意 ping 该主题。

    此致、

    Nick

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

    尊敬的 Shivangi:

    有关如何实现 PRU IPC 的更多信息、请参阅 MCU+ SDK 的 PRU IPC 页面- https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/latest/exports/docs/api_guide_am64x/DRIVERS_PRU_IPC.html

    您能建议一种传递地址的方法吗 ICSS_SMEM_CONST 在 IPC 发送 API 中。[/QUOT]

    。  M_PRU_IPC_SEND 完成的 S 结束数据包到每个缓冲区的共享存储器、R5F 内核从中读取数据包。

    请更正我的错误、但您曾提到输入数据本身位于共享存储器(存储器位置0x00010000)、这可能会在使用 PRU IPC 时导致存储器损坏。

    您能否提供有关用例的更多信息、您是如何对 SMEM 进行分区来存储数据的?

    此致、

    Nitika