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:二进制信标如何工作?

Guru**** 2557810 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/598286/rtos-how-does-binary-semaphore-works

工具/软件:TI-RTOS

大家好、有人能解释一下二进制信标是如何工作的???

如果信标已经过发布、然后再发布一个信标、这是否意味着二进制信标现在不可用? 如 In count = 0?  

此致、

Mitesh

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

    下面是二进制信号量的一些不同情形。 注意:计数= 0表示信标不可用(即、如果您调用挂起、则您将阻止或返回 false、如果您指定了零超时)。 计数= 1表示信号量可用

    使用案例
    计数= 0、调用带有超时的 Semaphore_pend、没有人调用 semaphore_post:您阻止(和其他运行的内容)、直到超时到期且返回代码为 false。 计数仍然为0。
    计数= 0、调用超时为零的 Semaphore_pend:返回代码为 false 时、立即返回。 计数仍然为0。
    计数= 0、调用带有超时的 Semaphore_pend、有人在您过期前调用 Semaphore_post:您阻止、直到发出 semaphore_post 调用。 如果优先级较高、则开始运行。 否则、您将处于就绪状态。 返回代码为 true、计数仍为0。
    计数= 0、没有人正在调用 Semaphore_pend、有人调用 semaphore_post:计数变为1。
    5。计数= 1、没有人正在调用 Semaphore_pend、有人调用 semaphore_post:计数保持为1。 (在这里、计数信标将变为2)。

    当您只需要执行操作而不关心多少次时、二进制信标会很有用。 我的例子是,我请我的十几岁的孩子把垃圾带走。 我必须多次询问他们(例如、多个 Semaphore_post)。 他们最终将垃圾取出一次。 让他们在一个晚上将其取出 N 次是没有意义的(但他们可能会因为响应缓慢而失去计算机权限:)。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ha ha;)很好的例子;)
    第3点)这是对的吗? 如果超时是永久性的并且 Semaphore_pend 正在等待... 如果有人发布信标、那么如果优先级足够高且信标计数= 0、则等待的信标任务将运行、这是有道理的。 如果由于某种原因挂起任务的计数不是高优先级、计数= 0、该怎么办? 还是在本例中为1?

    我将设计中的一些信标转换为二进制 b、因为正如您所说的、将二进制信标用于只需要运行一个的任务是合理的! 在我的设计中、我以100Hz 的频率在 UART 上发送一些数据、并在数据准备就绪时发布该信号量。 但我注意到的是、如果由于某种原因系统忙于执行其他操作、信标计数会保持 inc、并且当系统空闲时、它会多次发送相同的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问得好! 让我们将3分解为两个案例

    3:计数= 0、在任务 A 中调用具有超时的 Semaphore_pend、任务 B 在任务 A 的 pend 到期前调用 Semaphore_post:

    A.任务 A (挂起中的任务和被阻止的任务)的优先级高于任务 B (POST 的调用方)
    当任务 B 调用 POST 时、调度程序会发现任务 A 在信标上被阻止。 它不是递增计数、而是将计数保留为0。 调度程序还发现任务 A 的优先级更高、因此它使其成为正在运行的任务(并且任务 B 被抢先)。

    B.任务 A (挂起中的任务被阻止)的优先级与任务 B (POST 的调用方)相同或更低
    当任务 B 调用 POST 时、调度程序会发现任务 A 在信标上被阻止。 它不是递增计数、而是将计数保留为0。 调度程序还发现任务 A 的优先级相同或较低、因此它使任务"就绪"。 一旦任务 B 被阻止、任务 A 就可以运行(假设具有更高优先级的其他任务都没有准备好运行)。

    一些 RTOS 供应商处理不同的情况 b。 例如、我相信对于 FreeRTOS、计数不会递减。 这允许任务 B 调用 Semaphore_pend 并获取信标。

    因为它有点相关... TI-RTOS 确实为信标挂起队列提供了两种不同的行为(一个信标上有多个任务等待)。 默认方式是 FIFO。 在一个不可用的信标上调用 Semaphore_pend 的第一个任务将在一个发布发生时获得它。 另一种方法是按优先级排序。 当信标可通过 POST 获得时、最高优先级的任何人都将获得信标。 它们都有各自的用例。 您需要在.cfg 文件中启用优先级支持方法、因为它会增加少量占用空间。 内核的信号量 API 文档更详细地介绍了。

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

    感谢您的回复。 谢谢。