【问题标题】:How to make many FreeRTOS tasks wait for one other to complete initialization如何让多个 FreeRTOS 任务相互等待完成初始化
【发布时间】:2018-05-23 12:41:05
【问题描述】:

我有一个init 任务和几个工作任务。在某些时候,工作人员必须等待init 完成一些设置。我正在尝试使用二进制信号量来做到这一点。

当调度程序启动时,所有任务都准备好运行。因此,为了保证工作人员等待,信号量必须在调度程序启动之前“被init 任务占用”。 (否则,工作人员甚至可以在 init 被安排之前获得信号量。)

我该怎么做?或者我应该如何解决这个问题?

【问题讨论】:

    标签: synchronization task semaphore freertos rtos


    【解决方案1】:

    当您有多个任务等待信号或事件时,二进制信号量不是正确的机制。对于二进制信号量,一次只有一个任务可以获取该信号量,并且当给出二进制信号量时,只有一个任务准备好运行。我想每个等待任务都可以占用,然后立即将信号量提供给下一个等待任务,但这似乎很奇怪。

    您能否简单地将 Init 任务设为最高优先级任务,直到它完成必要的初始化。由于优先级较低,其他任务在初始化完成之前不会运行。初始化完成后,您可以删除 Init 任务或降低其优先级。

    如果优先级不是一个选项,那么您可能应该使用事件位(事件标志)。对于您的用例,事件位是比二进制信号量更好的机制,因为当 Init 任务发出事件信号时,可以使多个等待任务准备好运行。

    【讨论】:

    • '我想每个等待任务都可以占用,然后立即将信号量提供给下一个等待任务'——这并不奇怪,很好:)
    【解决方案2】:

    二进制信号量就可以了。将其初始化为 0 个单位。

    启动所有其他线程,并让它们在适当的点等待信号量,如果它们得到一个单元,则在继续之前立即再次发布该单元。所有的都必须等待,因为 sema 没有单位。

    根据需要继续初始化,然后发出信号量信号。然后,所有等待的线程将在获得单元并再次回发时一个接一个地运行。

    【讨论】:

      【解决方案3】:

      如果你只有一个工作任务,二进制信号量就可以工作。您可以将信号量创建为“不可用”/“已采用”,并且初始化任务将在初始化完成时xSemaphoreGive 信号量,通知单个工作任务初始化已完成。但是,当您有多个任务时,只有其中一个能够获取/获取信号量。

      计数信号量可以工作。信号量的容量应该等于工作任务的数量,并且它应该以空开始。作为系统设计人员,您知道 init-task 旨在在启动时拥有底层资源,因此 init-task 不必在第一次初始化时获取信号量。初始化后,您应该为每个工作人员调用一次xSemaphoreGive。当/如果您想重新初始化,请为每个工作任务调用一次xSemaphoreTake。为此,工作人员必须定期“释放”信号量,然后重新获取它。

      如果您只初始化一次,也可以使用Event Group。您的 init-task 可以使用xEventGroupSetBits 表示初始化已完成。您的工作任务可以使用xEventGroupWaitBits 等待初始化任务完成。

      【讨论】:

      • 谢谢,我会看看事件位。但是对于我最初提出的解决方案,如何“将信号量创建为“不可用”/“已采用”?我只能看到xSemaphoreCreateBinary( void );,它没有参数来告诉它是否应该最初可用或被占用。
      • 啊...似乎 binary semaphores 总是按照 FreeRTOS 中的方式创建。此外,正如我所提到的,二进制信号量不适用于多个工作任务。
      • @not-a-user 二进制信号量是在空状态下创建的,必须先给出才能取。 Init 任务没有必要获取信号量。 Init 任务将在必要的初始化完成后提供信号量(从不使用它)。把它想象成一个信号。 Init 任务通过给出信号量来断言/设置信号。其他任务通过获取信号量等待信号。但是二进制信号量的问题是,一次只有一个等待任务可以取二进制信号量。
      • '二进制信号量的问题是一次只有一个等待任务可以获取二进制信号量' - 这不是问题。当等待线程获取单元并运行时,它将单元发送回信号量以供下一个线程获取:)
      • @MartinJames,这可以工作,但如果您需要重新初始化(如果有必要),您不会知道所有工作任务都已停止。但好点!
      猜你喜欢
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      相关资源
      最近更新 更多