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.

[参考译文] AM62A7:tiovx_modules_dequeue_buf/acquire 互斥锁/解锁问题?

Guru**** 2399305 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1451673/am62a7-tiovx_modules_dequeue_buf-acquire-mutex-lock-unlock-issue

器件型号:AM62A7

工具与软件:

似乎出队/获取都有一个流、它们返回时没有解锁()。

https://github.com/TexasInstruments/edgeai-tiovx-apps/blob/develop/modules/core/src l154/tiovx_modules.c#L154

https://github.com/TexasInstruments/edgeai-tiovx-apps/blob/develop/modules/core/src vads/tiovx_modules.c#L908

是否有一些更高级别的 openvx 行为应该防止此错误发生?  
这 应该同时适用于 vx_graph_schedule_mode_queue_auto 和 manual 吗?

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

     排队 API 也是如此:
    https://github.com/TexasInstruments/edgeai-tiovx-apps/blob/develop/modules/core/src

    但排队("队列已满")/获取("无可用缓冲区")方案似乎不太可能在正确编写的应用程序中发生、
    出队情形("空队列")似乎是一个完全合法的情形

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

    让我与团队一起回顾并返回。

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

    谢谢。

    另外、您能否 向我指出文档/源代码、这些代码可以帮助我了解  在硬件完成写入新缓冲区后哪些代码调用 tiovx_modules_enqueue_buf?

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

    您好、Yogesh、您有任何有关此方面的更新吗?

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

    您好!

    在您位于 TIOVX 图形本身的边界时、通常会从 HLOS/Linux 侧调用 tiovx_modules_enqueue_buf 和类似函数来进行缓冲池管理。

    您想问的是这个情况(TIOVX 的边界)还是 TIOVX 堆栈中的情况、这与图形中的节点如何在节点之间进入队列/出队相关。 在图形内部、这将在中间节点之间自动发生--这是 TIOVX 堆栈本身的一部分、而不是你在这里看到的 tiovx-modules/apps。 TIOVX 内部的保护效果将比这些兼容 HLOS/Linux 的 API 更好

    从从 Linux 等 HLOS 运行的 tiovx-apps 中、可以尝试从没有可用缓冲区的池中取消缓冲区队列、并在缓冲区已满时类似使其进入队列。 因此、我在执行此操作之前会遇到运行时错误。 此处的保护受到限制、用户应检查返回的缓冲区是否为空。

    • 似乎在返回之前应该先解锁... 我对此有疑问。

    请确认这是否与 TIOVX 图形的边界相关或在图形中。 这将会改变答案以及指向您的位置。

    注:我解锁了该主题帖、但不能取消标记为已解析。 那么我们可以创建一个新的线程、因为它会阻止我们。

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

    您好、T S:

    我们有信号用于获取缓冲区、因此它会被阻止、直到可用的缓冲区。 那么会发生该误差
    https://github.com/TexasInstruments/edgeai-tiovx-apps/blob/d9958735a492c7281f3dc4508fa21386e611b31d/modules/core/src 149/tiovx_modules.c#l149.

    对于出队、如您所指出的、OpenVX 出队 API 会阻止并等待缓冲区进入队列并进行处理

    此致
    Rahul T R

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

    尊敬的 Reese:  
    是、 上下文是图形边界。

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

    TS, Rahul 的回答是否回答了您的问题?

    例如、此处的捕获/显示测试是很好的参考。  

    正如 Rahul 所说、TIOVX 从队列将会阻塞这里。 与排队类似、它将是阻塞调用、直到缓冲池为新的缓冲区做好准备。  在某些情况下、这可能会导致竞态条件(例如在排队之前尝试取消队列)--我们通常会避免这种情况、方法是在启动应用程序的主体之前进入缓冲池队列。

    否则、互斥量将阻止多个线程同时访问缓冲池。 从技术上讲、不应该达到返回"NULL"的条件、我们可以消除该条件。

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

    我不关注、  
    我的理解是-  
    即使您 在"启动应用程序主体之前"排队、  
    如果您有一个线程 排队和一个线程出队、
    如果 DEQ 线程在 q 为空时尝试出队、则 enq 线程将无法再出队。

    严格来说、这个问题不是理论 问题-我们在 应用中遇到了这个问题。
    我可以尝试创建一个简单的示例来对此进行说明。

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

    您好、T S:

    在获取的情况下、我们在锁定 bufpool 之前执行 sem_wait
    因此、如果超过了 SEM_WAIT、这意味着有一个可用的缓冲区可供采集

    同样、在出队情况下、我们首先调用 OpevVX 出队 API、然后再锁定缓冲池

    您是否正在使用 TIOVX 应用的最新版本?
    如果没有、请切换到最新版本、然后检查是否仍能看到问题

    如果您提供了重现问题的简单示例、我很乐意查看并解决该问题

    此致
    Rahul T R