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.

[参考译文] AM263P4:AM263Px ICSS RAM 映射和访问

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1587512/am263p4-am263px-icss-ram-mapping-and-access

器件型号: AM263P4

1.DRAM 0 和 1“共享“

在处理 PRU_0 和 PRU_1 时、我们对其与 DRAM0 和 DRAM1 的交互方式感到惊讶。 我们将为这两个内核编写 c 代码、并根据示例代码编写链接器文件。 经过大量实验后、发现 PRU_0 数据 RAM 地址 0x00000000 转到 DRAM0 地址 0x00000000、ICSS 相对地址 0x00000000。 但意外地、PRU_1 数据 RAM 地址 0x00000000 转到 DRAM1 地址 0x00000000、ICSS 相对地址 0x00002000。 两个链接器文件都对数据 RAM 使用 0x00000000 的起始 RAM 地址和 0x2000 的长度。 我们还注意到 PRU_0 通过引用大于 0x2000 的地址来访问 DRAM1。 我们还注意到 PRU_1 始终无法直接使用 DRAM0。 这是令人惊讶的、因为技术参考手册将 DRAM0 和 DRAM1 描述为共享。  

2.在 ICSS 外进行 DRAM2 访问

我们能够确定 PRU 的两个内核可以按预期利用 DRAM2、并且该区域中的 PRU_0 和 PRU_1 之间交换数据。 但是、我们无法按预期使用 R5 内核 0_0 将值读取或写入 0x48010000。 真正有趣的是、如果 R5 内核 0_0 写入 0x48010000、它可以正确读回该值、但是两个 PRU 内核都无法从 0x00010000 检索该值。 在这些情况下、我们真的对 R5 内核 0_0 实际写入的内容感到困惑。 我们还验证了 MPU 设置是否正确、以允许对该区域进行读取/写入操作。

PRU 堆栈值的 CCS 显示

这不奏效。 在 CCS 中进行调试时、我们的局部变量都找不到正确的存储器地址。 我们能够通过浏览汇编代码来跟踪可变存储器位置、从而确定是否在 RAM 中正确地处理了这些代码。  

4. CCS 在内存查看器中显示 DRAM2

当在调试会话期间选择任一 Device_Memory 内核、并且存储器窗口设置为 PRU_PRU 时、0x00010000 (DRAM2) 处的所有值均显示为 0。 我们编写了测试代码来直接读取/写入该区域中的值、并验证数据流是否符合预期、它只是不会显示在存储器查看器中。

5、技术参考手册错误

在 SPRUJ55D(最新的 AM263P 技术参考手册)的第 2.3 节中、该文档按照预期将 PRU-ICSS 数据 RAM2 列为从 0x00010000 开始、到 0x0001FFFF 结束。 但它列出了此大小为 64KB、但没有。 我们认为这应该是 32KB、以便与说明 DRAM2 大小的文件中列出的位置和其他区域保持一致。

 

请澄清我们通过开发测试观察到的内容是 TI 期望的内容、但尚未在技术参考手册中明确记录。

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

    您好、

    [引述 userid=“619313" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1587512/am263p4-am263px-icss-ram-mapping-and-access

    1.DRAM 0 和 1“共享“

    在处理 PRU_0 和 PRU_1 时、我们对其与 DRAM0 和 DRAM1 的交互方式感到惊讶。 我们将为这两个内核编写 c 代码、并根据示例代码编写链接器文件。 经过大量实验后、发现 PRU_0 数据 RAM 地址 0x00000000 转到 DRAM0 地址 0x00000000、ICSS 相对地址 0x00000000。 但意外地、PRU_1 数据 RAM 地址 0x00000000 转到 DRAM1 地址 0x00000000、ICSS 相对地址 0x00002000。 两个链接器文件都对数据 RAM 使用 0x00000000 的起始 RAM 地址和 0x2000 的长度。 我们还注意到 PRU_0 通过引用大于 0x2000 的地址来访问 DRAM1。 我们还注意到 PRU_1 始终无法直接使用 DRAM0。 这是令人惊讶的、因为技术参考手册将 DRAM0 和 DRAM1 描述为共享。  

    [/报价]



    ICSS 级别:-

    DRAM0: — 0x00000000

    DRAM1: — 0x00002000

    DRAM2(也称为 SMEM)

    PRU0

    地址 0x00000000 将在 ICSS 级别访问 DRAM0、即 PRU0_DRAM0

    地址 0x00002000 将访问 ICSS 级别的 DRAM1、即 PRU0_DRAM1

    地址 0x00010000 将在 ICSS 级别访问 DRAM2

    PRU1

    地址 0x00000000 将在 ICSS 级别访问 DRAM1、即 PRU1_DRAM0

    地址 0x00002000 将访问 ICSS 级别的 DRAM0、即 PRU1_DRAM1

    地址 0x00010000 将在 ICSS 级别访问 DRAM2

    两个 PRU 内核都能够访问 DRAM0、DRAM1、DRAM2、在延迟方面也没有差异。

    在 am263px 上:

    R5F

    地址 0x48000000 将访问 DRAM0

    地址 0x48000000 + 0x10000 将访问 DRAM2

    地址 0x48000000 + 0x2000 将访问 DRAM1


    您可以运行 MCU_PLUS_SDK_PATH\examples\PRU_IO\empty 中可用的空示例以检查这些示例

    从此处下载 MCU PLUS SDK :- www.ti.com/.../11.00.00.19

    请检查下图、PRU0 在偏移 0x0 处写入、PRU1 在 DRAM0、DRAM1、DRAM2 中的偏移 0x04 处写入

    来自 PRU 器件存储器的 DRAM0


    来自 PRU 器件存储器的 DRAM1




    [引述 userid=“619313" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1587512/am263p4-am263px-icss-ram-mapping-and-access

    4. CCS 在内存查看器中显示 DRAM2

    当在调试会话期间选择任一 Device_Memory 内核、并且存储器窗口设置为 PRU_PRU 时、0x00010000 (DRAM2) 处的所有值均显示为 0。 我们编写了测试代码来直接读取/写入该区域中的值、并验证数据流是否符合预期、它只是不会显示在存储器查看器中。

    [/报价]




    来自 PRU 器件存储器的 DRAM2







    [引述 userid=“619313" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1587512/am263p4-am263px-icss-ram-mapping-and-access

    2.在 ICSS 外进行 DRAM2 访问

    我们能够确定 PRU 的两个内核可以按预期利用 DRAM2、并且该区域中的 PRU_0 和 PRU_1 之间交换数据。 但是、我们无法按预期使用 R5 内核 0_0 将值读取或写入 0x48010000。 真正有趣的是、如果 R5 内核 0_0 写入 0x48010000、它可以正确读回该值、但是两个 PRU 内核都无法从 0x00010000 检索该值。 在这些情况下、我们真的对 R5 内核 0_0 实际写入的内容感到困惑。 我们还验证了 MPU 设置是否正确、以允许对该区域进行读取/写入操作。

    [/报价]

    您也可以从  MCU_PLUS_SDK_PATH\examples\PRU_IO\empty 示例本身验证此验证

    DRAM2、通过连接 R5F0_0 实现。

    PRU0 在偏移 0 处写入、PRU1 在偏移 0x4 处写入



    [引述 userid=“619313" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1587512/am263p4-am263px-icss-ram-mapping-and-access

    5、技术参考手册错误

    在 SPRUJ55D(最新的 AM263P 技术参考手册)的第 2.3 节中、该文档按照预期将 PRU-ICSS 数据 RAM2 列为从 0x00010000 开始、到 0x0001FFFF 结束。 但它列出了此大小为 64KB、但没有。 我们认为这应该是 32KB、以便与说明 DRAM2 大小的文件中列出的位置和其他区域保持一致。

    [/报价]

    DRAM2 从 0x00010000 开始、到 0x17FFF 结束、您是正确的、在某些 TRM 位置、它是 32KB、记录错误、我将在内部跟进、感谢您的报告。




    [引述 userid=“619313" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1587512/am263p4-am263px-icss-ram-mapping-and-access

    PRU 堆栈值的 CCS 显示

    这不奏效。 在 CCS 中进行调试时、我们的局部变量都找不到正确的存储器地址。 我们能够通过浏览汇编代码来跟踪可变存储器位置、从而确定是否在 RAM 中正确地处理了这些代码。  

    [/报价]

    您能给我分享一下相关测试代码或图像吗?

    此致、
    Manoj。

     

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

    对于项目 1、您是否能够提供一个文档(例如技术参考手册)来支持此操作? 我的测试与您展示的内容非常接近、但我无法在常见 AM263Px 文档中找到该内容。

    对于第 3 项和第 4 项、 我应该已经规定我使用的是官方的 TI IDE CCS 20.2.0.12、您要显示的显然是基于 Eclipse 的已弃用 IDE。 建议您使用最新的 TI IDE 进行重新测试。

    对于项目 2、我将查看 SDK 中的示例并发回报告。

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

    对于项目 2、我查看了该示例并验证了该项目中 R5 和 PRU 之间的数据正在通过共享存储器区域进行传输。 根据以往的经验、我最初对不工作工程与示例代码之间的差异感到直觉是编译后的 C 代码错过了初始化步骤。 我们已经就 R2 作为堆栈指针有了经验。 查看示例中的汇编代码、有专门注明的代码、用于正确访问共享 RAM(第 73 行至第 77 行)。 我将尝试在我的项目中复制它。

    请在示例之外再研究记录这一点的位置。 由于栈指针初始化问题、我们已经浪费了数天的时间、这是另一个没有示例(在 c 代码中)、但需要添加某些示例的情况。

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

    您好、Nathan、

    我已将您的主题重新分配给将负责 AM263P TRM 更新的团队成员。

    我来自另一个团队、因此我将从 AM62x 的角度评论 DMEM 地址问题(相同的 PRU-ICSS 基础设施、我们只是没有在 AM62x 上引脚输出工业通信信号、因此我们称之为 PRUSS)。

    内存映射 — 本地与全局  

    处理器的其余部分应在 1 个地址访问 DRAM0、在其他地址访问 DRAM1。 这是“全局“存储器映射。 另一方面、每个 PRU 内核在不同的地址看到 DRAM0 和 1、即每个 PRU 的“本地“存储器映射。

    对于 AM62x TRM、请参阅 PRU 一章的“存储器映射“一节。 对于 AM26x 器件、请退出“PRUSS"器“器件、只需搜索章节标题的其余部分。

    仅供参考:16KB 的 IRAM、不是 12KB  

    几个月前、当我查看 AM26x TRM 时、我认为我看到 IRAM 被列为 12KB、但这是一个拼写错误。 AM26x 器件上实际上每个 PRU 内核有 16kB 的 IRAM。 不确定 AM26x 团队是否已修复此问题。

    此致、

    Nick

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

    我已经将编程共享 RAM 和栈指针初始化对话拆分为一个单独的 e2e 主题:
    关于:AM263P4:如何在 PRU ICSS 共享 RAM 中使用共享存储器区域

    AM26x 团队、在 TRM 讨论中有何意见?

    此致、

    Nick

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

    您好、Nick、

    我创建了一个 JIRA 以更新 TRM、这确实是 TRM 中的一个错误。

    jira.itg.ti.com/.../SMCUAPPS-1131