#ifndef INCLUDED_OS_SEM_H #define INCLUDED_OS_SEM_H #ifndef INCLUDED_OS_TYPES_H #include #endif /*INCLUDED_OS_TYPES_H*/ #ifndef INCLUDED_OS_CRITICAL_H #include #endif /*INCLUDED_OS_CRITICAL_H*/ #ifndef INCLUDED_OS_WAITOBJECT_H #include #endif /*INCLUDED_OS_WAITOBJECT_H*/ /* ------------------------------------------------------------------------------------------------------------------ */ /* */ typedef struct { os_size_t value; os_waitobject_t wait_obj; }os_sem_t; /* ------------------------------------------------------------------------------------------------------------------ */ /* */ OS_STATIC_FORCE_INLINE void os_sem_init(os_sem_t* self, os_size_t value){ self->value = value; os_waitobject_init(&self->wait_obj); } OS_STATIC_FORCE_INLINE os_err_t os_sem_timed_wait(os_sem_t* self, os_tick_t ticks){ os_critical_enter(); if(self->value>0){ self->value--; os_critical_leave(); return OS_ERR_OK; } os_critical_leave(); return os_waitobject_timed_wait(&self->wait_obj, os_task_self(), ticks); } OS_STATIC_FORCE_INLINE void os_sem_wait(os_sem_t* self){ os_critical_enter(); if(self->value>0){ self->value--; os_critical_leave(); } os_critical_leave(); os_waitobject_wait(&self->wait_obj, os_task_self()); } OS_STATIC_FORCE_INLINE void os_sem_notify_all(os_sem_t* self){ os_critical_enter(); self->value++; os_critical_leave(); os_waitobject_notify_all(&self->wait_obj); } OS_STATIC_FORCE_INLINE void os_sem_notify_one(os_sem_t* self){ os_critical_enter(); self->value++; os_critical_leave(); os_waitobject_notify_one(&self->wait_obj); } OS_STATIC_FORCE_INLINE void os_sem_notify_all_in_isr(os_sem_t* self){ os_critical_enter_in_isr(); self->value++; os_critical_leave_in_isr(); os_waitobject_notify_all_in_isr(&self->wait_obj); } OS_STATIC_FORCE_INLINE void os_sem_notify_one_in_isr(os_sem_t* self){ os_critical_enter_in_isr(); self->value++; os_critical_leave_in_isr(); os_waitobject_notify_one_in_isr(&self->wait_obj); } #endif /*INCLUDED_OS_SEM_H*/