Semaphore API for restricting access to a resource. More...

Functions

void sem_init (semaphore_t *sem, int16_t initial_permits, int16_t max_permits)
 Initialise a semaphore structure. More...
 
int sem_available (semaphore_t *sem)
 Return number of available permits on the semaphore. More...
 
bool sem_release (semaphore_t *sem)
 Release a permit on a semaphoreIncreases the number of permits by one (unless the number of permits is already at the maximum). A blocked sem_acquire will be released if the number of permits is increased. More...
 
void sem_reset (semaphore_t *sem, int16_t permits)
 Reset semaphore to a specific number of available permitsReset value should be from 0 to the max_permits specified in the init function. More...
 
void sem_acquire_blocking (semaphore_t *sem)
 Acquire a permit from the semaphoreThis function will block and wait if no permits are available. More...
 
bool sem_acquire_timeout_ms (semaphore_t *sem, uint32_t timeout_ms)
 Acquire a permit from a semaphore, with timeoutThis function will block and wait if no permits are available, until the defined timeout has been reached. If the timeout is reached the function will return false, otherwise it will return true. More...
 
bool sem_acquire_timeout_us (semaphore_t *sem, uint32_t timeout_us)
 Acquire a permit from a semaphore, with timeoutThis function will block and wait if no permits are available, until the defined timeout has been reached. If the timeout is reached the function will return false, otherwise it will return true. More...
 
bool sem_acquire_block_until (semaphore_t *sem, absolute_time_t until)
 Wait to acquire a permit from a semaphore until a specific timeThis function will block and wait if no permits are available, until the specified timeout time. If the timeout is reached the function will return false, otherwise it will return true. More...
 
bool sem_try_acquire (semaphore_t *sem)
 Attempt to acquire a permit from a semaphore without blockingThis function will return false without blocking if no permits are available, otherwise it will acquire a permit and return true. More...
 

Detailed Description

Semaphore API for restricting access to a resource.

A semaphore holds a number of available permits. sem_acquire methods will acquire a permit if available (reducing the available count by 1) or block if the number of available permits is 0. sem_release() increases the number of available permits by one potentially unblocking a sem_acquire method.

Note that sem_release() may be called an arbitrary number of times, however the number of available permits is capped to the max_permit value specified during semaphore initialization.

Although these semaphore related functions can be used from IRQ handlers, it is obviously preferable to only release semaphores from within an IRQ handler (i.e. avoid blocking)

Function Documentation

◆ sem_acquire_block_until()

bool sem_acquire_block_until ( semaphore_t *  sem,
absolute_time_t  until 
)

Wait to acquire a permit from a semaphore until a specific timeThis function will block and wait if no permits are available, until the specified timeout time. If the timeout is reached the function will return false, otherwise it will return true.

Parameters
semPointer to semaphore structure
untilThe time after which to return if the sem is not available.
Returns
true if permit was acquired, false if the until time was reached before acquiring.

◆ sem_acquire_blocking()

void sem_acquire_blocking ( semaphore_t *  sem)

Acquire a permit from the semaphoreThis function will block and wait if no permits are available.

Parameters
semPointer to semaphore structure

◆ sem_acquire_timeout_ms()

bool sem_acquire_timeout_ms ( semaphore_t *  sem,
uint32_t  timeout_ms 
)

Acquire a permit from a semaphore, with timeoutThis function will block and wait if no permits are available, until the defined timeout has been reached. If the timeout is reached the function will return false, otherwise it will return true.

Parameters
semPointer to semaphore structure
timeout_msTime to wait to acquire the semaphore, in milliseconds.
Returns
false if timeout reached, true if permit was acquired.

◆ sem_acquire_timeout_us()

bool sem_acquire_timeout_us ( semaphore_t *  sem,
uint32_t  timeout_us 
)

Acquire a permit from a semaphore, with timeoutThis function will block and wait if no permits are available, until the defined timeout has been reached. If the timeout is reached the function will return false, otherwise it will return true.

Parameters
semPointer to semaphore structure
timeout_usTime to wait to acquire the semaphore, in microseconds.
Returns
false if timeout reached, true if permit was acquired.

◆ sem_available()

int sem_available ( semaphore_t *  sem)

Return number of available permits on the semaphore.

Parameters
semPointer to semaphore structure
Returns
The number of permits available on the semaphore.

◆ sem_init()

void sem_init ( semaphore_t *  sem,
int16_t  initial_permits,
int16_t  max_permits 
)

Initialise a semaphore structure.

Parameters
semPointer to semaphore structure
initial_permitsHow many permits are initially acquired
max_permitsTotal number of permits allowed for this semaphore

◆ sem_release()

bool sem_release ( semaphore_t *  sem)

Release a permit on a semaphoreIncreases the number of permits by one (unless the number of permits is already at the maximum). A blocked sem_acquire will be released if the number of permits is increased.

Parameters
semPointer to semaphore structure
Returns
true if the number of permits available was increased.

◆ sem_reset()

void sem_reset ( semaphore_t *  sem,
int16_t  permits 
)

Reset semaphore to a specific number of available permitsReset value should be from 0 to the max_permits specified in the init function.

Parameters
semPointer to semaphore structure
permitsthe new number of available permits

◆ sem_try_acquire()

bool sem_try_acquire ( semaphore_t *  sem)

Attempt to acquire a permit from a semaphore without blockingThis function will return false without blocking if no permits are available, otherwise it will acquire a permit and return true.

Parameters
semPointer to semaphore structure
Returns
true if permit was acquired.