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.

[参考译文] TDA4VM:C7x IPC 问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/891317/tda4vm-c7x-ipc-issue

器件型号:TDA4VM

您好~

最近我测试了运行 Vision_apps、当我尝试在 MCU2_1和 C7x 之间使用共享存储器时、我发现 C7x 有时从共享存储器读取数据失败。

我在 C7x 上运行的代码如下所示:

AppMemCacheInv(地址,大小);

memcpy (data、addr、size);

千分之一的概率可能是错误的。

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

    您能否提供更多详细信息? 比如 MCU 2_1上的缓存设置和区域设置、CMU 页表设置和 C7x 上的缓存设置?

    此致、
    Shyam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Shyam Jagannathan、
    感谢您的回复。
    C7x 至 CONFIG 共享存储器的代码与 '/vision_apps/apps/basic_demo/app_tirtos/c7x_1/main.c'相同。 具体代码如下:
    MMU_initMapAttrs (&attrs);
    attrs.Indattrx = MMU_AttrIndx_MAIR7;
    (笑声)
    RetVal = MMU_MAP (DDR_Shared_MEM_ADDR、DDR_Shared_MEM_ADDR、DDR_Shared_MEM_SIZE、&attrs);/* DDR *
    if (RetVal == false)
    转至 MMU_EXIT;
    MCU2_1的配置与'/vision_apps/apps/basic_dem演 示/app_tirtos/MCU2_1/linker_mem_map.cmd'相同。  具体代码 如下:
    /* DDR 中共享内存缓冲区的内存[大小512.00 MB ]*/
    DDR_Shared_MEM:origin = 0xAE000000,length = 0x20000000
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您提供详细信息、在 MCU2_1端、您是否每次都更新数据? 您能否告诉我们在 MCU2_1上完成的缓存操作?

    在向 C7x 发送中断以读取 MCU2_1之前、可能必须对其执行缓存写回操作。

    此致、
    Shyam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好~
      为什么在 C7x 存储器操作中调用此函数两次?
    void appMemFences()
    #IF 定义(C71)
    _mfenced();
    _mfenced();
    #endif
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    A72通过共享存储器将数据传输到 C71。 当 C71读取共享存储器时、 它通常使用 appMemCacheInv 读取错误的数据。

    但是,  当 C71读取共享存储器时:appMemCacheInv+ memcpy + appMemCacheWbInv,这是可以的!

    为什么?  

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

    "A72通过共享存储器将数据传输到 C71。 当 C71读取共享存储器时、 它通常使用 appMemCacheInv 读取错误的数据。"

    您能告诉我们您是如何检查数据是否错误的吗?

    此致、
    Shyam

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

    您好!

    A72将 4字节整数数据写入共享存储器、并通过 IPC 将4字节整数发送到 C71。  
    C71接收 IPC 后、会将 IPC 接收到的数据与从共享存储器读取的数据进行比较。

    然后 C71将 ACK +整数发送到 A72。 在 A72收到 ACK 后、它确认 ACK 中的整数是否是上次发送的整数、然后发送下一个时间.

    谢谢!

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

    到目前为止、有一个软件问题、因为 C7x 和 A72之间不存在自动缓存一致性。
    因此、我们必须执行如下缓存操作、 
      1.当 A72写入执行缓存 WB 时、在 C7x 上执行缓存 Inv。
      2.当 C7x 写入执行缓存 WB 时、在 A72上执行缓存 Inv。
    软件错误应在后续 SDK 版本中修复、直到需要缓存操作。
    此致、
    Shyam
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    一般情况下:

      C7x 读取:cacheinv + memcpy
      C7x 写入:memcpy + cachewb

    但是、A72->C7x:

       C7x 读取:cacheinv + memcpy + cachewb
       C7x 写入:memcpy + cachewb

    当 C71从 A72读取共享数据时, C71必须添加 CacheWB。  这将暂时解决问题。 对吗?

    谢谢!

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

    您好!

    C7x 读取:cacheinv + memcpy (是目标、DDR 或 L3或 L2)

    如果 memcpy 目标是 DDR、我们将需要一个 cachewb、但如果目标是 L2 cachewb、则不需要。

    此外、假设您已相应地对 C7x MMU 进行了编程。

    此致、
    Shyam

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

    代表 Michael Cui 的答复。

    C7x 从 A72读取共享内存数据:  cacheinv + memcpy,--失败

    C7x 从 A72读取共享内存数据: cacheinv + memcpy + cachewbinv、--OK

    C7x 写入从 A72共享内存数据: memcpy + cachewb、--OK

    我想 我们不需要使用 cachewbinv 操作来读取。  cachewbinv 的作用是什么?

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

    C7x 从 A72读取共享内存数据:  cacheinv + memcpy,--失败

    您能告诉我 memcpy 的目标地址是什么吗? 如果目标地址是 DDR、则可能需要 cachewbinv、如果目标地址是 L2 SRAM、则不需要 cachewbInv。

    此致、
    Shyam

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

    谢谢 Shyam。 目的地址为 DDR。

    在与 Michael Cui 通话后、我可以帮助您添加更多详细信息:他可能不会清晰地表达。

    1. a72将数据写入共享 DDR,然后执行 CacheWB。  更正:没有 CacheWB,但它们使用带有 o_sync 选项的 mmap。

    2. C71将高速缓冲器连接到共享 DDR。 如果您现在读取该值、您将极小的机会获得错误的值。

    3. C71对本地堆执行 memcoy、然后执行 CacheWB、我们可以始终获得正确的结果。

    ZM

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

    ZM、

    3.是预期行为。 如果要 使用最新值"查看"DDR 中本地堆的内容、必须使用 CacheWB 才能将 L1D 写入缓冲区中的更改提交到 DDR。

    作为实验、您可以尝试将目标地址更改为 L2SRAM。 在这里、您不需要高速缓存 WB、因为 L1D 和 L2是一致的。 我希望这能回答你的问题。


    此致、
    Shyam