unified: doxygen comments for semaphores. Change-Id: If1a9fa887b07736a70cb26227e147120e5a86f6f Signed-off-by: Benjamin Walsh <walsh.benj@gmail.com>
diff --git a/include/kernel.h b/include/kernel.h index b720548..1a9adb6 100644 --- a/include/kernel.h +++ b/include/kernel.h
@@ -810,16 +810,88 @@ _DEBUG_TRACING_KERNEL_OBJECTS_NEXT_PTR(k_sem); }; +/** + * @brief Initialize a semaphore object. + * + * An initial count and a count limit can be specified. The count will never go + * over the count limit if the semaphore is given multiple times without being + * taken. + * + * Cannot be called from ISR. + * + * @param sem Pointer to a semaphore object. + * @param initial_count Initial count. + * @param limit Highest value the count can take during operation. + * + * @return N/A + */ extern void k_sem_init(struct k_sem *sem, unsigned int initial_count, unsigned int limit); + +/** + * @brief Take a semaphore, possibly pending if not available. + * + * The current execution context tries to obtain the semaphore. If the + * semaphore is unavailable and a timeout other than K_NO_WAIT is specified, + * the context will pend. + * + * @param sem Pointer to a semaphore object. + * @param timeout Number of milliseconds to wait if semaphore is unavailable, + * or one of the special values K_NO_WAIT and K_FOREVER. + * + * @warning If it is called from the context of an ISR, then the only legal + * value for @a timeout is K_NO_WAIT. + * + * @retval 0 When semaphore is obtained successfully. + * @retval -EAGAIN When timeout expires. + * @retval -EBUSY When unavailable and the timeout is K_NO_WAIT. + * + * @sa K_NO_WAIT, K_FOREVER + */ extern int k_sem_take(struct k_sem *sem, int32_t timeout); + +/** + * @brief Give a semaphore. + * + * Increase the semaphore's internal count by 1, up to its limit, if no thread + * is waiting on the semaphore; otherwise, wake up the first thread in the + * semaphore's waiting queue. + * + * If the latter case, and if the current context is preemptible, the thread + * that is taken off the wait queue will be scheduled in and will preempt the + * current thread. + * + * @param sem Pointer to a semaphore object. + * + * @return N/A + */ extern void k_sem_give(struct k_sem *sem); +/** + * @brief Reset a semaphore's count to zero. + * + * The only effect is that the count is set to zero. There is no other + * side-effect to calling this function. + * + * @param sem Pointer to a semaphore object. + * + * @return N/A + */ static inline void k_sem_reset(struct k_sem *sem) { sem->count = 0; } +/** + * @brief Get a semaphore's count. + * + * Note there is no guarantee the count has not changed by the time this + * function returns. + * + * @param sem Pointer to a semaphore object. + * + * @return The current semaphore count. + */ static inline unsigned int k_sem_count_get(struct k_sem *sem) { return sem->count; @@ -838,11 +910,14 @@ * * @param sem_array Array of semaphore pointers terminated by a K_END entry * @param sem Identifies the semaphore that was taken - * @param timeout Maximum number of milliseconds to wait + * @param timeout Number of milliseconds to wait if semaphores are unavailable, + * or one of the special values K_NO_WAIT and K_FOREVER. * * @retval 0 A semaphore was successfully taken * @retval -EBUSY No semaphore was available (@a timeout = K_NO_WAIT) * @retval -EAGAIN Time out occurred while waiting for semaphore + * + * @sa K_NO_WAIT, K_FOREVER */ extern int k_sem_group_take(struct k_sem *sem_array[], struct k_sem **sem, @@ -881,6 +956,21 @@ _DEBUG_TRACING_KERNEL_OBJECTS_INIT \ } +/** + * @def K_SEM_DEFINE + * + * @brief Statically define and initialize a global semaphore. + * + * Create a global semaphore named @name. It is initialized as if k_sem_init() + * was called on it. If the semaphore is to be accessed outside the module + * where it is defined, it can be declared via + * + * extern struct k_sem @name; + * + * @param name Name of the semaphore variable. + * @param initial_count Initial count. + * @param count_limit Highest value the count can take during operation. + */ #define K_SEM_DEFINE(name, initial_count, count_limit) \ struct k_sem name = \ K_SEM_INITIALIZER(name, initial_count, count_limit)