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.
您好~
最近我测试了运行 Vision_apps、当我尝试在 MCU2_1和 C7x 之间使用共享存储器时、我发现 C7x 有时从共享存储器读取数据失败。
我在 C7x 上运行的代码如下所示:
AppMemCacheInv(地址,大小);
memcpy (data、addr、size);
千分之一的概率可能是错误的。
您能否提供更多详细信息? 比如 MCU 2_1上的缓存设置和区域设置、CMU 页表设置和 C7x 上的缓存设置?
此致、
Shyam
您好!
感谢您提供详细信息、在 MCU2_1端、您是否每次都更新数据? 您能否告诉我们在 MCU2_1上完成的缓存操作?
在向 C7x 发送中断以读取 MCU2_1之前、可能必须对其执行缓存写回操作。
此致、
Shyam
A72通过共享存储器将数据传输到 C71。 当 C71读取共享存储器时、 它通常使用 appMemCacheInv 读取错误的数据。
但是, 当 C71读取共享存储器时:appMemCacheInv+ memcpy + appMemCacheWbInv,这是可以的!
为什么?
"A72通过共享存储器将数据传输到 C71。 当 C71读取共享存储器时、 它通常使用 appMemCacheInv 读取错误的数据。"
您能告诉我们您是如何检查数据是否错误的吗?
此致、
Shyam
感谢您的介绍、
到目前为止、有一个软件问题、因为 C7x 和 A72之间不存在自动缓存一致性。
因此、我们必须执行如下缓存操作、
一般情况下:
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