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.

[参考译文] AM5718:DDR 与 OCMC 上存储器缓冲器的不同行为

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1431482/am5718-different-behaviour-of-memory-buffer-on-ddr-vs-ocmc

器件型号:AM5718

工具与软件:

专家、您好!!

我已经经历了一些奇怪的行为,我想问你任何类型的提示,在哪里看.

我在 DDR 存储器中有一个缓冲器、该缓冲器由 A15 (Linux)写入并由 C66x (TI-RTOS)异步读取。 C66x 在大多数情况下读取的数据是正确的、但有时(如果 C66x 在被 A15写入后短时间读取缓冲区)它会碰巧有错误的数据。 我已经看到它完全损坏,部分损坏(大小的损坏的部分的16字节)或权利。

我们实现了从 C66x 到 IPU1 (TI-RTOS)的通知、以检查 C66x 正在读取的同一存储器地址、我们发现 IPU1看到数据与 C66x 一样错误、但如果我们几秒钟后让 IPU1再次读取相同的存储器位置、结果似乎是正确的。

我们认为 DMA 可能存在某种问题、因此我们在缓冲区前后添加了健全签名(每次读取缓冲区时 A15都会写入/更新新值、不是详细的哈希)、并且我们看到大多数情况下两个签名都正常、有时其中一个签名未正确更新、在极少数情况下、没有签名。

我们也认为内存可以在 Linux-A15端缓存、但/dev/mem (与 mmap 一起使用)似乎没有缓存。 这是真的还是在/dev/mem?上有任何形式的纪念

C66x (MAR 寄存器)和 IPU1 (Ammu)均不高速缓存缓冲区所在的内存区域。  

所以,最后的 somersault 是将缓冲区从 DDR 移动到 OCMC ,它的工作是完美的!

您是否愿意告诉我任何我可以检查/调查的东西、以了解为什么它在 OCMC 上工作、但在 DDR 上不工作? 有基准吗? 有什么想法吗? Cach é? DMA? 其他? 我应该重点关注 EMIF-DDR 和 OCMC 之间的哪些差异?

感谢你 indadvanced 任何帮助!

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

    您好、Ro、

    我将在内部对此进行询问。  

    您看到多个器件出现了这种情况吗?  

    它是否在任何点工作并有一定的延迟?

    -若苏厄

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

    您好、Josue:

    不得不说、这一次我只在开发单元中尝试了功能、因为当我们面对它时、我们急于将软件版本部署到生产单元中。 这也是我决定将缓冲区重新定位到 OCMC 的原因、因为我们已经剩余了一些可用空间。 但我可以告诉您、当所有内核将我的器件的 DDR 用于其他系统目的时、它可以正常工作、因此我尝试了不同的地址。

    我有一点担心、因为只要我们在 DDR 强制中需要类似的东西、这可能(将)会再次发生。

    实际上,我"遭受"相当相同的效果,一段时间以前(可能一年)在另一个单元的相同的设备硬件。 当时我正在开发另一个功能、这些功能必须最终位于非易失性存储器中。 我的第一种方法是将缓冲器作为 PoC 放在 DDR 中、但当我因类似的怪异行为而卡住时、我最终将缓冲器重新定位到最终目标的非易失性 RAM 中、它会正常工作、与最近一次完全相同。

    在那"旧"问题之后,我猜是 Linux 正在缓存 DDR 区域,我原来在那里找到了缓冲区,但我到达了一个死端,没有找到原因,我不能再投入更多的时间在它。

    这就是为什么这次我也想到了 Cachee,但我们的 Linux 操作系统团队的同事告诉我/dev/mem 没有缓存,所以我试图找到任何其他的原因,这种奇怪的行为,如 DMA ,可能会以不同的方式为 DDR 或 OCMC。

    我很确定,这一定是我不知道的,某种"特殊照顾",需要采取的 DDR ,这就是为什么我认为在土牢, DMA 或可能是一个更多的访问内存,从更多的内核在"同时"和一些访问保护缺乏...

    RO

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

    您好、Ro、

    更深入地了解这一点之后、您是否在使用自己的 IPC 解决方案? 如果要使用 AM57的现有 IPC 基础架构、这难道不是一个很好的备选操作吗?  

    A15内核和 C66内核不一致、必须对非缓存缓冲区进行写入。 您描述的问题听起来像是缓存一致性问题。

    请参见 Bootlin 培训 幻灯片中的以下图片:

    看起来像是第三个图形的情况、其中写入未完全刷新并且数据已过时。  

    我相信、IPC 堆栈内会解决此类问题。

    请参见以下链接中的第一个问题 :https://software-dl.ti.com/processor-sdk-linux/esd/AM57X/09_02_00_133/exports/docs/linux/Foundational_Components_。html#faq-asked-questions

    -若苏厄  

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

    您好、Josue:

    我同意,它听起来像一个缓存一致性问题,就像你指出的情况下( BTW,非常感谢你的 Bootlin 培训和支持!)... 再次咨询我们的 Linux 操作系统领域同事(这就是我花了一些时间来回答的原因)、我们看到 open 函数的内部代码涉及/dev/mem.上的特殊标志 POR (不)可缓存 第一批测试似乎可以与 DDR 中的缓冲区一起正常工作、因此是的、这似乎是高速缓存一致性问题。

    关于使用现有 IPC 基础设施、我们过去曾尝试过、但面临一些"挑战"、例如、在 TI-RTOS SWI 调用中、MessageQ_put 函数有时会在80-100ms 内卡住、这没有明显的原因(我猜是内部 GateMP);在将共享区域从 DDR 移至 OCMC 时出现编译错误;而且、我们无法找到将共享 EM 区域共享到多个不同的 ACM15-Linux 二进制文件(我的意思是: 使用 IPU 和 C66x 访问同一共享区域的不同二进制文件。 此外、据我所知、CMEM 已被弃用。

    CMEM 的"问题"是切换到 mmap 的最有说服力的原因、我们已经通过非易失性存储器和 OCMC 在内核之间的多个通信"通道"中使用了这种方法。 数据并从 IPU 传输到 A15。

    谢谢、此致

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

    RO、

    由于这是非 TI 实现、因此超出了我们的支持范围。

    我能做的最好的 事情就是鼓励你在读之前做一个无效,写后冲洗。

    好的

    若苏厄