#include #include "rtos/context.h" #include "rtos/semaphore.h" #include "rtos/spinlock.h" uint8_t sem_wait(struct semaphore *sem) { uint32_t retval = CONTEXT_READY; spinlock_lock(&sem->lock); sem->count--; if (sem->count < 0) retval = context_wait_pri_queue(&sem->lock, &sem->sleep_queue); spinlock_unlock(&sem->lock); return retval; } void sem_post(struct semaphore *sem) { spinlock_lock(&sem->lock); sem->count++; if (sem->count <= 0) context_signal_queue(&sem->sleep_queue); spinlock_unlock(&sem->lock); } void sem_interrupt(struct semaphore *sem, struct context *c) { spinlock_lock(&sem->lock); context_interrupt_queue(c, &sem->sleep_queue); spinlock_unlock(&sem->lock); } int32_t sem_get_count(struct semaphore *sem) { int32_t retval; spinlock_lock(&sem->lock); retval = sem->count; spinlock_unlock(&sem->lock); return retval; } void sem_init(struct semaphore *sem, int32_t count) { sem->sleep_queue = 0; spinlock_init(&sem->lock); sem->count = 0; }