semphr. h
sem_t sem_create( uint32_t uxMaxCount, uint32_t uxInitialCount )
Creates a new counting semaphore instance, and returns a handle by which the new counting semaphore can be referenced.
In many usage scenarios it is faster and more memory efficient to use a direct to task notification in place of a counting semaphore! http://www.freertos.org/RTOS-task-notifications.html
Internally, within the FreeRTOS implementation, counting semaphores use a block of memory, in which the counting semaphore structure is stored. If a counting semaphore is created using sem_create() then the required memory is automatically dynamically allocated inside the sem_create() function. (see http://www.freertos.org/a00111.html). If a counting semaphore is created using sem_create_static() then the application writer can instead optionally provide the memory that will get used by the counting semaphore. sem_create_static() therefore allows a counting semaphore to be created without using any dynamic memory allocation.
Counting semaphores are typically used for two things:
1) Counting events.
In this usage scenario an event handler will 'give' a semaphore each time an event occurs (incrementing the semaphore count value), and a handler task will 'take' a semaphore each time it processes an event (decrementing the semaphore count value). The count value is therefore the difference between the number of events that have occurred and the number that have been processed. In this case it is desirable for the initial count value to be zero.
2) Resource management.
In this usage scenario the count value indicates the number of resources available. To obtain control of a resource a task must first obtain a semaphore - decrementing the semaphore count value. When the count value reaches zero there are no free resources. When a task finishes with the resource it 'gives' the semaphore back - incrementing the semaphore count value. In this case it is desirable for the initial count value to be equal to the maximum count value, indicating that all resources are free.
| uxMaxCount | The maximum count value that can be reached. When the semaphore reaches this value it can no longer be 'given'. |
| uxInitialCount | The count value assigned to the semaphore when it is created. |
Example usage:
sem_t xSemaphore;
void vATask( void * pvParameters )
{
sem_t xSemaphore = NULL;
// Semaphore cannot be used before a call to sem_create().
// The max value to which the semaphore can count should be 10, and the
// initial value assigned to the count should be 0.
xSemaphore = sem_create( 10, 0 );
if( xSemaphore != NULL )
{
// The semaphore was created successfully.
// The semaphore can now be used.
}
}