66 lines
1.8 KiB
C
66 lines
1.8 KiB
C
#ifndef DI_SEMAPHORE_H__
|
|
#define DI_SEMAPHORE_H__
|
|
|
|
#include <di/types.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define DI_BSEM_TIMEOUT_INFINITE 0U
|
|
|
|
#if defined(CHIBIOS_KERNEL_RT)
|
|
|
|
#include <di_fw/os.h>
|
|
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)
|
|
|
|
#elif defined(CHIBIOS_KERNEL_OSLESS)
|
|
#include <stdatomic.h>
|
|
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 <stdbool.h>
|
|
#include <pthread.h>
|
|
|
|
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__ */
|