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.

[参考译文] CCS/AM5726:使用 DMA 使用 AM5726时、MMCSD 随机失败

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/948364/ccs-am5726-mmcsd-randomly-fails-using-dma-using-am5726

器件型号:AM5726

工具/软件:Code Composer Studio

你好!

我对 MMCSD 驱动程序和 DMA 的使用有疑问。  

我们已转到 PDK 1_0_17和 CCS 9.3

我们遇到了一个问题,MMCSD_open()有时会挂起,我们需要重新启动系统。

当我们将 MMCSD 驱动程序配置为使用中断(无 DMA) 10时、它似乎正常工作、但一旦我们将其配置为使用*。cfg 文件中的 DMA、并对其进行 C 代码随机失败。

之前、我们有一个修改过的 MMCSD 驱动程序与 PDK_1_0_8 ( 正在工作)一起使用。

我一直在研究驱动程序、我认为我可能会发现一个错误。  

如果在使用 DMA 时读取完成后没有 cache_invalidate、请参阅下面带粗体标记的行

文件 MMCSD_v1.c 中的第2681行至2697行:

*在此处等待传输完成。
*可以从这里阻止、因为 MMCSD 的 Hwi 将解除阻止
*出错时
*
已启用#ifdef MMCSD_EDMA_ENABLED
if (0U!= hwAttrs->enableDma && transaction->cmd!=MMCSD_CMD (19U))

  IF (HS_MMCSD_Xfer_TYPE_RX == cmdbj.cmd.xferType)
  {
    MMCSD_osalPendLock (object->readSem、SemaphoreP_WAIT_FOREVER);

    MMCSD_osalCache_Inv(对象->dataBufIdx,(事务->blocksize *事务->blockCount));
  }
  其他
  {
    MMCSD_osalPendLock (object->writeSem、SemaphoreP_WAIT_FOREVE);
  }

#endif

添加后、我们的系统似乎可以使用 DMA 正常工作

是否有人可以验证这是否正确。

迁移到 PDK_1_0_17后、其他所有内容都可以正常工作。 :-)

巴西(BR):

PER-Anders Strand

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

    您好!

    你是对的。 读取数据的 EDMA 传输完成后、您必须在读取缓冲区之前使缓存无效。

    同样、您应该先从缓存中写回数据、然后 EDMA 才能传输数据。

    我认为 MMCSD 驱动程序假定应用程序会保持高速缓存一致性、因此驱动程序不会在每次传输时在内部调用高速缓存操作。

    此致、

    斯坦利

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

    大家好、是的、这可能是一个解决方案、但我可以在使用 PDK 中的 FatFs 的示例应用中看到、调用 MMCSD 读取的低级例程不会使任何缓存无效。

    我在文档/头文件中没有看到任何注释、即如果您启用了 DMA (使用这些库)、您需要在读取后使缓存无效、那么为什么不将其添加到驱动程序中?

    我还认为最好检查提供给 MCCSD 读取/写入函数的指针(启用 DMA 时)是否已对齐、以避免用户错误。

    我们现在已经使用这些功能修补了自己的 PDK-17。

    巴西(BR):

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

    如果 EDMA 缓冲区位于非缓存区域、则无需进行缓存维护。

    驱动程序不知道这一点、因此在驱动程序中添加高速缓存操作可能会给应用程序增加意外开销。

    我必须仔细检查是否为示例中使用的缓冲区启用了高速缓存、以查看这是不跳过高速缓存操作的原因。

    如果没有其他问题、我将关闭此主题。 谢谢。