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.

[参考译文] PROCESSOR-SDK-AM62X:从 PRU 内核直接访问 DDR 存储器

Guru**** 2393725 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1493896/processor-sdk-am62x-direct-access-to-ddr-memory-from-pru-core

器件型号:PROCESSOR-SDK-AM62X

工具与软件:

如何从 PRU 内核直接访问 DDR 存储器?

下面的文章介绍了对于 AM62x、可以直接访问 DDR 存储器的第一个4GB 区域、而没有任何特殊限制、而超过4GB 的区域需要通过 RAT 进行访问。

e2e.ti.com/.../4207270

我知道 PRU 内核的 DDR 存储器的地址范围如下、是这样吗?

第一个4GB 区域:
DDR16SS0_SDRAM 0x008000000 0x0100000000 2GB
DDR16SS0_SDRAM 0x0880000000 0x0900000000 2GB

区域超过4GB:
DDR16SS0_SDRAM 0x0900000000 0x0A00000000 4GB

如何在命令文件中定义 DDR 存储器区域?
"第 n 页"是什么?
什么是"CREGISTER"?

小程序

第2页:
PRU_SHAREDMEM:org = 0x00010000 len = 0x00008000 CREGISTER=28

DDR:org = 0x80000000 len = 0x00010000 CREGISTER=31
L3OCMC : org = 0x40000000 len = 0x00010000 CREGISTER=30

如何在 C 源代码中使用分配在 DDR 存储器区域中的用户定义段?
能否在 C 源代码中使用"#pragma "对其进行定义?

#pragma CODE_SECTION (symbol ,"section name ")
#pragma DATA_SECTION (symbol、" section name ")

主域上的外设示例使用结构体、联合体和位字段。

e2e.ti.com/.../5363849

RAM 中的数据结构能否以类似的方式处理?

此致。

大辅

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

    您好 Daisuke-San、

    在本次讨论中、我们可以遵循几个不同的方向。

    请帮助我了解您要做的事情  

    如果您修改了 linker.cmd 文件、则 SECTIONS 条目、如所示  
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am62x/PRU_Hardware_UART/AM62x_PRU0.cmd

    然后、我假设您需要修改编译器放置不同变量和数据结构的位置。 这是您想做的事情吗?

    例如、在我上面链接的示例中、您可以看到 PRU 正在执行的指令(指令)将进入.text > IMEM (指令内存)。 同时、经过初始化的变量、未初始化的变量、栈等将全部放入本地 DMEM 中。

    请记住、该存储器的所有部分都具有单周期访问权限(即、只需要1个 PRU 时钟来加载数据)。 因此、这意味着您的 PRU 代码将以 PRU 时钟速率运行、因为新指令可以在每个时钟周期执行、程序数据将在下一个时钟周期可访问等 如果将任何数据移至 DDR、则每次代码需要时、访问该数据将需要更多时钟周期。

    您是否正在尝试执行其他操作、例如为程序读取数据、或为其他人写入数据以供使用? (例如、Linux 应用程序?) 这可能不需要对链接器命令文件进行任何更改。

    您可以在此处看到一个在 DDR 中写入乒乓缓冲器的示例:
    https://git.ti.com/cgit/apps/tida01555/tree/PRU_ADS8688_Controller/PRU_ADS8688_Controller.c 
    其中该文件是此 AM335x 示例设计的一部分:
    https://www.ti.com/tool/TIDA-01555
    https://www.ti.com/lit/ug/tidudn4a/tidudn4a.pdf?ts = 1743177071956 

    此致、

    Nick

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

    您好、Nick San、

    感谢您的答复。

    您是在尝试其它操作、例如为程序使用读入数据、还是为他人使用写数据? (例如、Linux 应用程序?) 可能不需要对链接器命令文件进行任何更改。[/QUOT]

    我们的客户希望在 PRU 内核和 Linux 端之间共享数据。

    我建议我们的客户遵循 AM335x 示例并使用 C 源代码中的指针访问 DDR 存储器。

    我想澄清一下 PRU 内核用于访问 DDR 存储器的地址。 我知道 PRU 内核的 DDR 存储器的地址范围如下、是这样吗?

    第一个4GB 区域:
    DDR16SS0_SDRAM 0x008000000 0x0100000000 2GB

    区域超过4GB:
    DDR16SS0_SDRAM 0x0880000000 0x0900000000 2GB
    DDR16SS0_SDRAM 0x0900000000 0x0A00000000 4GB

    此致、

    大辅

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

    您好 Daisuke-San、

    PRU 存储器映射看起来是什么样子的?

    请参阅技术参考手册(TRM)
    处理器和加速器> PRU > PRUSS 顶级资源函数说明> PRUSS 内存映射

    基本上、PRU 会将本地资源放置在地址0x0000_0000 - 0x0004_0000处。 对于所有0x0004_0000以上的地址、PRU 仅使用您在第2章"存储器映射"中看到的系统存储器映射。

    那么... 这对于 DDR 访问意味着什么?  

    DDR 的较低2GB 范围从0x8000_0000变为0xFFFFFFFFF。 PRU 只能访问32位地址、因此对于所有这些 DDR、PRU 将仅使用实际的 DDR 地址。

    为了访问大于32位的存储器地址、PRU 需要配置本地 RAT、以将一些 PRU 的本地32位地址空间转换为器件级48位地址。

    在哪里可以找到有关 RAT 的更多信息?  

    我并不知道有任何配置 PRUSS RAT 的具体示例(到目前为止、我的所有客户都已在低2GB 的 DDR 中放置了 PRU 关注的 DDR 区域)。 但是、您可以 在 AM62Ax Academy 的 MCU 部分中找到我撰写的有关 MCU+ SDK 内核的 RAT 的文档。 我将链接到 AM62Ax Academy、因为我们仍在撰写 AM62x Academy 的 MCU 部分:
    https://dev.ti.com/tirex/explore/node?node=A__AXBsTEetU2hiTMZSzq4row__AM62A-ACADEMY__WeZ9SsL__LATEST

    某些特定于 MCU+的信息不适用于 PRU、但我希望能够很好地解释这些概念。

    此致、

    Nick