Making a Task wait on 2 queues/semaphores

oahmad2 wrote on Friday, May 14, 2010:

I am designing my software and I have a situation where my task has to wait on 2 queues, so that if either queue has data, the task can unblock.  If I put the blocking statements one after the other, then the first queue has to unblock before the second bone.  Is it possible to wait on >1 queue or semaphore simultaneously in FreeRTOS, if so, how does one do this? 

Is this situation a common occurrence?   Is this bad design on my part?


edwards3 wrote on Friday, May 14, 2010:

Is it possible to have the queue writers write to the same queue? The message source can be part of the message to the queue reader knows where the message came from. That way the reader only has to block on one queue.

richard_damon wrote on Saturday, May 15, 2010:

As Edwards says, FreeRTOS is based on a task waiting for one thing at a time. If the two queue are providing similar types of data you can do as Edwards says. If the queue hold very different types (and size) of data, then this might not make as much sense, but normally these would go to different tasks. If there is a good reason just one task will be processing this sort of mixed data, O can see two good options to handle this.

Method 1 adds a third queue, where each producer, after putting the data on its respective queue, puts a flag on the third queue with a value to tell the consumer which queue to take the data from. If you want to save a bit of memory, and the order the queue are serviced isn’t critical, it could be replaced with a single semaphore. the producers raise the semaphore after adding their data to the queue, (this raise may fail, but that is ok. that just means there is some other data waiting to be processed), and the consumer waits on the semaphore, and when it gets it, it checks each of the queues with a 0 timeout retrieval, until all the queue are empty. At that point, it wait on the semaphore again.

oahmad2 wrote on Saturday, May 15, 2010:

Thanks Richard,
What is the 2nd method?

richard_damon wrote on Saturday, May 15, 2010:

The second method was making it just one task.

oahmad2 wrote on Saturday, May 15, 2010:

Thanks for your help!