Thread 中讨论的其他器件: TMDS64EVM
工具/软件:
您好:
我将尝试通过 GPMC 接口以突发的方式传输数据、以尽可能提高吞吐量。
瞬间、GPMC 以 16 位和中等 33.33MHz 时钟运行。
该 GPMC 参数在 TRM 中称为 ATTACHEEDDEVICEPAGELENGTH(CONFIG1_I 的 24:23 位)。 与标准 OMAP-LGPMC 驱动程序和 Linux 器件树结合使用 、它被称为 GPMC、BURST-LENGTH、具有略微不同的参数表示法。 也就是说 、GPMC、BURST-LENGTH 指定最大突发长度(以字为单位)、而不是从其编码到 ATTACHEDDEVICEPAGELENGTH 中的值。 例如、当 GPMC、BURST-LENGTH 设置为 16 时、ATTACHEDDEVICEPAGELENGTH 被找到为 10 个二进制文件、对应于 16 个字。 因此、这似乎没问题。
我在第一个实例中发现了一个奇怪的事情 、那就是 SDK(我暂时使用 11.00.09.04)不支持 32 个字的最大突发长度、根据 TRM、这应该适用于 16 位模式。 出于测试目的、我对 OMAP-LGPMC 驱动程序打了一点补丁、以便能够 通过器件树设置将 ATTACHEEDDEVICEPAGELENGTH 设置为 11。
现在、相应的 GPMC 地址窗口可以被 Linux 进程占用、然后像正常存储器一样进行访问。 这是有效的、我看到在读取和写入期间使用了突发。
为了在主存储器和某个 GPMC 窗口之间移动数据,使用 SDK 附带的 memcpy () 应该是明智的。 虽然我没有详细检查,但我认为 memcpy () 实现通常针对处理器进行了高度优化。
例如、这将是一段代码、将 64 字节数据从主存储器中的某个缓冲区 buffer1 移动到表示 GPMC 区域内存储器的某个指针 GPMC_space、然后在 buffer2 处返回到主存储器:
memcpy ((void *) GPMC_space、(void *) buffer1、64);
memcpy ((void *) buffer2、(void *) GPMC_space、64);
需要注意的是、我确实使用 GPMC_SPACE 进行测试、是 GPMC 窗口的起点 — 所以保持了一致。 buffer1 和 buffer2 通常在 C 函数的代码中声明为 64 位整数组。 AFAIK 编译器放置与此类数组的数据类型对齐 — 因此它们应在这里与 64 位对齐。
事实证明、对于写入、在 GPMC 接口上仅出现长度为 8 个字的突发、而对于读取、则使用长度为 16 个字的突发。
突发长度设置为 16(而不是 32)对实际突发长度没有影响。
因此、通过使用处理器、只能生成 8 个字的写入突发长度、这里匹配 16 个字节、而读取 16 个字的突发长度或者 可以创建 32 个字节。
这是正常行为、是否有一些调整来优化它? GPMC 肯定不会连接到处理器的高速缓存一致性机制。 但缓存行大小至少为 64 字节。 我不知道如何在处理器中处理这个问题。 但我认为确实有一个很好的机会一次可以传输 64 个字节。
谢谢、
Mario