主题中讨论的其他器件:TDA4VH
工具与软件:
您好:
我最近发现了以下论坛主题:
我也一直在检查 PSDK 软件、但我在软件中看到的内容与上述主题中提供的答案之间似乎存在矛盾。
作为参考、我正在查看9.2.0.5 Linux ADAS 和 PSDK 软件版本(应该是最新版本)。
一些背景知识:
TDA4VH 具有 A72内核(计算集群)、R5f 内核和 C71 DSP 处理器。 根据 TI 的设计、Linux 内核提供了使用 RPMSG 与远程处理器进行通信的设施。 A72内核和远程处理器还可以在它们之间共享部分 DDR 存储器。 PSDK 发行版包含与内核连接的库和应用程序代码、用于使应用程序代码与远程处理器进行交互。
当前结构中、PSDK 代码具有一个 app_utils 层、该层为 tiovx 和视觉应用程序代码提供了一些抽象。 特别是,app_utils 提供诸如 appMemAlloc()、appMemMap()和 appMemCacheWb()以及 appMemCacheInv()等例程。
在 Linux 实现中、这些例程似乎使用 dma_bufs 接口、该接口使用 ioctls 来分配支持 DMA 的存储器区域。
这些例程依次由诸如 tivxMemBufferAlloc ()、tivxMemBufferMap ()和 tivxMemBufferUnmap ()等更高级别的 API 使用。
当然、在使用这些例程时必须考虑缓存一致性、因为分配的缓冲区会与远程处理器共享。
现在、问题就在这里:上面提到的论坛主题指出:
"对于 TDA4VH、每个 A72集群都直接连接到 MSMC3、因此两个 A72集群之间完全相干、但每个 C7x 不再直接连接到 MSMC3。 这意味着在 A72实例和 C7实例之间交换数据时需要执行一些软件缓存操作。"
要么这是不正确的、要么我漏掉了一些重要的东西。
下面是 tiovxMemBufferMap()函数的作用:
{
#if defined(SOC_AM62A)
appMemCacheWb(host_ptr, size);
#else
#ifndef A72
appMemCacheWb(host_ptr, size);
#endif
#endif
}
请注意、对于 A72处理器、它将完全跳过 appMemCacheWb()调用。 tiovxMemBufferUnmap()中存在相同的构造软。
根据我的分析、还有一个单独的共享存储器区域用于交换对象描述符、用于 IPC 模块。 例如调用 ownObjDescSend()时使用该函数。 从我可以看到的情况来看、描述符管理代码中根本没有缓存同步的配置。
鉴于 tiovx 代码似乎跳过/缺少这些缓冲区的任何软件缓存同步操作、我只能通过两种方式了解其可能实现方式:
1) Linux 在禁用高速缓存的情况下映射这些区域
2) Linux 正在以某种方式将这些区域映射为启用缓存、同时也确保了硬件缓存与远程处理器的一致性。
我的问题是:我正在尝试在不同的操作系统(在 A72内核上运行)上实现对 PSDK 库的支持、我希望能够像 Linux 一样托管它。 但我很难找到管理缓存一致性的正确方法。 当前、共享存储器区域以缓存禁止的方式映射、并且可以正常运行。 我说"正常工作"时、这意味着我使用代客泊车演示(app_tidl_AVP)。 它会按预期通过 DP1显示端口连接器处理帧并在外部监视器上显示进度。 但这意味着 A72内核对共享存储器区域的访问比我想要的要慢得多。 如果我尝试将这些区域映射为启用高速缓存、则演示根本不会运行。
这给我留下了几个重要的问题:
1) 1)上一个讨论主题中的答案是否真的正确? A72内核上是否确实需要软件缓存操作来与 C71内核同步? PSDK 软件本身似乎与此相矛盾。
2) 2)如果可以实现硬件高速缓存一致性、则需要哪些特定的 Arm MMU 页面属性来确保实现这一点? 此外、是否还需要任何其他配置、例如 MSMC 模块? (请不要回复这个问题、说"看看 TI Linux 有什么功能"、因为如果我知道源代码中有什么内容、我现在就会这样做。)
不幸的是、另一个线程会说:"TI SDK 中的软件设计为遵循上述规则。 大多数 A72和 C7x 群集级别的最终用户都可能在框架 API 抽象之上添加/构建应用程序、因此他们可能不担心底层管道。" 我想我不是"大多数用户"。
-法案