#ifndef DI_SEMAPHORE_H__ #define DI_SEMAPHORE_H__ #include #ifdef __cplusplus extern "C" { #endif #define DI_BSEM_TIMEOUT_INFINITE 0U #if defined(CHIBIOS_KERNEL_RT) #include typedef binary_semaphore_t di_bsem_t; #define di_bsem_init_unlocked(sem) chBSemObjectInit(sem, false) #define di_bsem_init_locked(sem) chBSemObjectInit(sem, true) #define di_bsem_wait(sem) chBSemWait(sem) di_errno_t di_bsem_wait_timeout(di_bsem_t *sem, uint32_t timeout_ms); #define di_bsem_wait_from_isr(sem) chBSemWaitI(sem) #define di_bsem_post(sem) chBSemSignal(sem) #define di_bsem_post_from_isr(sem) chBSemSignalI(sem) #define di_bsem_get_state(sem) chBSemGetStateI(sem) #elif defined(CHIBIOS_KERNEL_OSLESS) #include typedef atomic_bool di_bsem_t; #define di_bsem_init_unlocked(sem) atomic_init(sem, 0) #define di_bsem_init_locked(sem) atomic_init(sem, 1) void di_bsem_wait(di_bsem_t *sem); di_errno_t di_bsem_wait_timeout(di_bsem_t *sem, uint32_t timeout_ms); #define di_bsem_wait_from_isr(sem) di_bsem_wait(sem) #define di_bsem_post(sem) atomic_store(sem, 0) #define di_bsem_post_from_isr(sem) di_bsem_post(sem) #elif defined(__linux__) #include #include typedef struct { pthread_mutex_t mtx; pthread_cond_t cvar; pthread_condattr_t cattr; bool v; } di_bsem_t; void di_bsem_init_unlocked(di_bsem_t *sem); void di_bsem_init_locked(di_bsem_t *sem); di_errno_t di_bsem_wait_timeout(di_bsem_t *sem, uint32_t timeout_ms); void di_bsem_wait(di_bsem_t *sem); #define di_bsem_wait_from_isr(sem) di_bsem_wait(sem) void di_bsem_post(di_bsem_t *sem); #define di_bsem_post_from_isr(sem) di_bsem_post(sem) #else #error No sempahore implementation for this platform #endif #ifdef __cplusplus } #endif #endif /** DI_SEMAPHORE_H__ */