#ifndef SRC_APP_SEMAPHORE_SEMAPHORE_HPP_ #define SRC_APP_SEMAPHORE_SEMAPHORE_HPP_ #include #include namespace free_rtos { /** * @brief С++ обертка семафора в free rtos * */ class Semaphore { public: enum Type { e_semTypeBinary, e_semTypeCounting }; Semaphore() { int32_t status = SystemP_FAILURE; status = SemaphoreP_constructBinary(&sem_, 0); DebugP_assert(SystemP_SUCCESS == status); } Semaphore(Semaphore::Type type, uint32_t init_val, uint32_t max_val) { int32_t status = SystemP_FAILURE; if (type == Semaphore::e_semTypeBinary) { status = SemaphoreP_constructBinary(&sem_, init_val); } else if (type == Semaphore::e_semTypeCounting) { status = SemaphoreP_constructCounting(&sem_, init_val, max_val); } DebugP_assert(SystemP_SUCCESS == status); } void post() { SemaphoreP_post(&sem_); } int32_t pend(uint32_t ticks = SystemP_WAIT_FOREVER) { return SemaphoreP_pend(&sem_, ticks); } ~Semaphore() { SemaphoreP_destruct(&sem_); } private: SemaphoreP_Object sem_; }; } #endif