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.

[参考译文] RTOS/PROCESSOR-SDK-AM437X:Queue_get 的原子用法

Guru**** 2595140 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/640253/rtos-processor-sdk-am437x-atomic-use-of-queue_get

器件型号:PROCESSOR-SDK-AM437X
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

你(们)好

我想使用 SYS/BIOS Queue_get()函数从 我的空闲队列中取出元素。  我上次使用队列功能已经有一段时间(超过2年)了。

网址为(software-dl.ti.com/.../Queue.html)

我可以看到 Queue_get()以原子方式工作,这正是我需要的。 不过,如果队列为空,它将返回非空状态,手动状态将使用 Queue_empty()来检查队列中是否有任何元素。 这是一个非常糟糕的设计(至少在我的情况下)。 现在、我必须对队列进行我自己的保护、以确保我可以自动取出队列中的元素、并确保我确实获得了有效元素。
例如
1.保护对队列的访问

2.检查队列不为空

3.从队列中获取元素

4.取消对队列的访问保护

我相信在早期(DSP/BIOS)、如果队列为空、您会得到一个指向队列句柄的指针?

这是否仍然适用、如果适用、我是否 可以安全地使用它(考虑到 SYS/BIOS 的未来版本)?

/Mads

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对此进行了任何更新?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    这更多是一个 SYSBIOS 问题。 您在 AM437x 上是否有任何示例代码,如何在 SYSBIOS 内容中使用此 queue_get()? 谢谢!

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

    你(们)好 Eric

    我在我的代码中执行以下操作、它起作用。

    通过查看您的在线 SYS/BIOS 文档(请参阅我的第一篇文章中的链接)、此功能似乎已成为文档。

    //获取空闲队列元素
    PQ = Queue_get (qHandle);
    
    //如果返回的元素指向要处理,则队列为空!
    如果(PQ ==(void*) qHandle)
    返回 STAT_ERROR;
    

    但通过查看旧的 DSP/BIOS 文档、这是 que_get()的一个记录功能(我认为它与 Queue_get()相同)。 见 spru625e.pdf 第2-272页。

    http://software-dl.ti.com/targetcontent/legacy_files/targetcontent/bios/bios_5_20/sabios-e23/docs/packages/ti/bios/doc/spru625e.pdf

    旧文档的内容如下:

    使用空队列调用 que_get 会返回队列本身。 这提供了使用单个原子操作来检查队列是否为空的方法、以及在第一个元素不为空时删除并返回第一个元素的方法:

    如果((que_handle)(elem = que_get (q))!= q)` Process elem `

    我假设这也适用于非原子版本- Queue_dequeue()。

    此致、

    Mads

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

    文档具有误导性(最多)。 正确的是 SYS/BIOS'队列基本上与 DSP/BIOS 的 Que 相同。

    原子 Queue_get 始终返回非 NULL PTR (实际上是 Queue_Elem *)。 如果队列为空、则可以对照 Queue_Object 检查返回值。 如果它们相同、则队列为空(或者如果您正在遍历队列、则您已在尾处环回并回到开头)。

    Queue_dequeue 也是如此、只是它不是原子的。 如果您已经禁用了中断、因此无需在 API 中使用额外的原子代码、则此 API 非常有用。

    我将打开一个增强请求以清理文档。

    Todd