我有一个init
任务和几个工作任务。在某些时候,工作人员必须等待init
完成一些设置。我试图用二进制信号量来做这件事。
当调度程序启动时,所有任务都准备好运行。因此,为了保证工人等待,信号量必须由init
任务"采取。在调度程序启动之前。 (否则,工作人员可以在init
被安排之前获得信号量。)
我该怎么做?或者我该如何解决这个问题?
答案 0 :(得分:2)
当您有多个任务等待信号或事件时,二进制信号量不是正确的机制。使用二进制信号量,一次只能有一个任务获取信号量,并且在给出二进制信号量时,只有一个任务可以运行。我想每个等待的任务都可以采取,然后立即让信号量进入下一个等待的任务,但这看起来很奇怪。
在完成必要的初始化之前,您是否可以简单地将Init任务作为最高优先级的任务。由于优先级较低,其他任务在初始化完成之前不会运行。初始化完成后,您可以删除Init任务或降低其优先级。
如果优先级不是一个选项,那么你应该使用一个事件位(事件标志)。对于您的用例,事件位是比二进制信号量更好的机制,因为当Init任务向事件发出信号时,可以准备好运行多个等待任务。
答案 1 :(得分:2)
二进制信号量没问题。将其初始化为0个单位。
启动所有其他线程并让他们在适当的位置等待信号量,如果他们得到一个单位,立即再次将该单位发回,然后再继续。所有人都必须等待因为sema没有单位。
根据需要进行初始化,然后发信号通知信号量。然后,所有等待的线程将一个接一个地运行,因为它们获得单元并再次发回。
答案 2 :(得分:1)
如果您只有一个工作任务,二进制信号量将起作用。您可以将信号量创建为“不可用”/“已采用”,初始化完成后,init任务将xSemaphoreGive信号量,通知单个工作人员任务初始化已完成。但是,当您有多个任务时,只有其中一个任务能够获取/获取信号量。
计数信号量可行。信号量的容量应该等于工作任务的数量,它应该从空开始。作为系统设计人员,您知道init-task旨在在启动时拥有底层资源,因此init-task不必在第一次初始化时获取信号量。初始化后,您应该为每个工作人员调用xSemaphoreGive一次。当/如果要重新初始化时,请为每个工作任务调用xSemaphoreTake一次。为此,工作人员必须定期“释放”信号量,然后重新获取信号。
如果您只初始化一次,也可以使用Event Group。您的init-task可以使用xEventGroupSetBits来指示初始化已完成。您的工作人员任务可以使用xEventGroupWaitBits等待init任务完成。