A synchronization barrier

wella wrote on Monday, August 24, 2009:


how is the simplest implementation of barrier in FreeRTOS? I mean situation when a task is waiting for two or more events to continue. Having two or more semaphores/mutexes is not memory effective(some post notes that for one semaphore a 100 byte is requested).
I think that vSemaphoreCreateCounting() cannot be used for this purpose because a task is waken if the value is != 0.

Thank you for your advice.

If it is not possible I would suggest this feature.
xSemaphoreCreateBarrier( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount). If a this type of semaphore is taken, the task will wait until uxInitialCount == uxMaxCount.

sotd wrote on Monday, August 24, 2009:

How about define integer to hold bit flags, one event for a bit, then use semaphore to block. When task unblock check integer to see if events happened and if no block again.  ?

wella wrote on Tuesday, August 25, 2009:

Thank you vm. It seems to be working but I would rather use "n" integers, every for one event to avoid protecting bit flag itself or entering critical section. E.g. for n = 2, while(a == 0 || b==0) {semTake()}.