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.

[参考译文] MSRAM-AM243X:MCU-PLUS-SDK 到 PruIcss DRAM 通信

Guru**** 2463330 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1469534/mcu-plus-sdk-am243x-msram-to-pruicss-dram-communication

器件型号:MCU-PLUS-SDK AM243X

工具与软件:

您好!
我需要将数据从 msram 传输到 PRU DRAM 或 PRU 共享 DRAM 或反之。 后台、我对 pru0进行了编程、将其用作 RGMII 驱动器、以 1Gbps 的速率进行发送和接收。 我需要在300Bytes 附近发射、而 RGMII 只需大约3us。 我进行了一些测量以确定采用哪种方法将数据从 PRU DRAM 获取到 msram、反之亦然。

PruIcss_writeMemory 根据数据量而定、最慢、不能用于我的用途。
使用 memcpy 将数据直接从 r5f 存储器复制到 PRU DRAM 的速度为4us、~300字节也较慢。
我使用了 udma_memcpy_interrupt 示例并针对两个测量对其进行了修改。 对于 DMA 来说、这两者看起来都很慢。 这或许可以改善吗?

我发现的快速方法是让 PRU 处理副本。 为此、我使用 lbbo msram -> sbco DRAM 和 lbco DRAM -> sbbo msram。
另一个耗时因素是 PRU 和 r5f 之间的中断。 r5f 到 PRU 中断大约需要200ns、Pru 到 r5f 大约需要890ns。
下一张图显示了将数据从 r5f 复制到 msram ->将中断发送到 PRU -> PRU 将数据从 msram 复制到 DRAM 的时间。 另一种方法是:

与 RGMII 的3us 相结合、读取数据大约为6.5us、写入大约为5.5us。 我需要每个时间都接近4us。 是否有办法更快地从 msram 获取数据到 PRU DRAM?

谢谢。此致

卢卡斯

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

    大家好、Lucas:

    首先、之前围绕读取/写入延迟完成的所有工作都可以在本常见问题解答中找到。 如果您尚未:
    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1096933/faq-pru-how-do-i-calculate-read-and-write-latencies

    对于更高的读取速度、我还建议查看 XFR2VBUS 硬件加速器(请参阅 TRM 第6.4.6.3.1节 PRU_ICSSG XFR2VBUS 硬件加速器)。

    TRM 中提供了该 代码的编程指南、您也可以参阅此主题。

    此致、

    Nitika

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="6346141" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1469534/mcu-plus-sdk-am243x-msram-to-pruicss-dram-communication 通过将其与 RGMII 的3us 相结合、读取数据大约为6.5us、写入大约为5.5us。 我需要每个时间都接近4us。 是否有办法更快地从 msram 获取数据到 PRU DRAM?
    [报价]

    如前所述、将来自 MSRAM 的 XFR2VBUS 直接用于读取和写入(可在120ns 左右完成64字节)。 使用不同的组(AM64/AM243中每个组128KB)进行读取和写入、以避免争用。

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

    您好!

    感谢您的答复。 Im 仍在验证 xfr2vbus 的时序。 我会添加我的时间安排以供将来参考、并在问题开始处理后立即解决。  

    此致卢卡斯

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

    嗨、Nitika、

    感谢您的答复。 我按照 TRM 和此常见问题解答条目对 xfr2vbus 进行编程阅读: SK-AM64:跟进问题:如何使用 PRU_ICSSG XFR2VBUS 硬件加速器读取/写入数据-处理器论坛-处理器- TI E2E 支持论坛

    我还遇到了 PRU 卡住的问题、因为 RD_BUSY 永远不会清除。 更糟糕的是、在发出读取时 RD_BUSY 标志总是被设置、而且永远不会被清除、因此下次我启动程序时、它会卡在第一个循环中。 如另一个主题中所述、只能通过关断和为电路板供电来清除它。 我还尝试在所有字节就绪后用零&18、12;XOUT 0x60、&R18、12停止自动读取、但这也更改了 RD_BUSY 或任何其他标志的状态。


    这是我的汇编器代码:

    xfr2vbus_mem_read:
      零 R18、12
      ldi r19.w2、0x7000;将地址设置为 msram start
      lbbo _r0.w2、r19、0、2;从0x70000000读取数据大小

    xfr2vbus_wait_rd_busy_clear:
      XIN 0x60、&R18、1
      qbbs xfr2vbus_wait_rd_busy_clear、r18.b0、0;等待 RD_BUSY 清除、程序在这里停止、因为 RD_BUSY 被清除

      LDI R18、0x0007;64字节自动模式
      添加 r19.W0、r0.W0、0;添加数据偏移(当前未使用)
      XOUT 0x60、&R18、10;开始 xfr2vbus 数据读取

    xfr2vbus_wait_for_data:
      XIN 0x60、&R18、1;清除命令 FIFO? 始终读为0x05
      qbbc xfr2vbus_wait_for_data、r18.b0、2;等待直到 RD_DATA_FL 置位
      XIN 0x60、&R2、67;读取64字节/清除数据 FIFO
      sbco &r2, c24, r0.w0, 64;将数据存储在 DRAM 中
      Sub r0.w2、r0.w2、64;解码数据计数器
      添加 r0.W0、r0.W0、64;包括 DRAM 位置
      qblt xfr2vbus_wait_for_data、r0.w2、64;重复执行直到读取所有数据

      零&18、12
      XOUT 0x60、&R18、12;停止自动读取

    (编辑:修复了最后一个 qblt 标签并为可读性添加了缩进)

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

    大家好、Lucas:

    请允许我花些时间对我的设置进行测试、然后回复给您。

    此致、

    Nitika

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

    嗨、Nitika、

    您是否找到时间在您的设置上进行测试?

    此致、
    卢卡斯

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

    大家好、Lucas:  

    谢谢您的 Ping。 由于其他承诺、上周大部分时间我都无法获得服务。

    我也在我的设置中重现了您的问题、并且看到了相同的行为。

    我实验了几个东西,并使它与下面的方法工作:

    xfr2vbus_wait_rd_busy_clear:
        xin 	0x60, &R18, 1
        qbbs 	xfr2vbus_wait_rd_busy_clear, R18.b0, 0 ; Wait for RD_BUSY
    
        ldi32   R19, 0x30080000 ; DMEM0 address
        ldi     R20, 0x0
    
    xfr2vbus_read_data:
        ldi32	R18, 0x4
        xout    0x60, &R18, 12
    
    wait_for_read_data_fifo:
        xin  	0x60, &R18, 1
        qbbc 	wait_for_read_data_fifo, R18.b0, 2
    
        xin  	0x60, &r2, 32 ; Perform read
    
        add		R19, R19, 0x20 ; Set address for read
        add  	R27, R27, 0x1 ; Increment count
    
        qbge 	xfr2vbus_read_data, R27, 4 ; repeat until all data is read
    
        halt ; end of program

    根据我观察到的情况、以下代码行设置 R18的 RD_BUSY 位、重新启动程序时仍会设置该位、从而导致环路卡住。

      XOUT 0x60、&R18、12;停止自动读取

    此代码通过重新排列操作序列来解决此问题、从而防止在程序重新运行之前立即进行任何 XOUT 操作。

    您能否在您的代码中尝试上述逻辑、并告知我它是否可以解决问题。

    此致、

    Nitika