import
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#ifndef INCLUDED_OS_SEM_H
|
||||
#define INCLUDED_OS_SEM_H
|
||||
|
||||
#ifndef INCLUDED_OS_TYPES_H
|
||||
#include <os_types.h>
|
||||
#endif /*INCLUDED_OS_TYPES_H*/
|
||||
|
||||
#ifndef INCLUDED_OS_CRITICAL_H
|
||||
#include <os_critical.h>
|
||||
#endif /*INCLUDED_OS_CRITICAL_H*/
|
||||
|
||||
#ifndef INCLUDED_OS_WAITOBJECT_H
|
||||
#include <os_waitobject.h>
|
||||
#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*/
|
||||
Reference in New Issue
Block a user