mirror of https://github.com/ArduPilot/ardupilot
64 lines
1.3 KiB
C++
64 lines
1.3 KiB
C++
|
|
#pragma once
|
|
|
|
#include <AP_HAL/AP_HAL.h>
|
|
#include "AP_HAL_F4Light_Namespace.h"
|
|
#include <exti.h>
|
|
#include "Config.h"
|
|
|
|
#ifdef SEM_DEBUG
|
|
#define SEM_LOG_SIZE 500
|
|
enum Sem_OP {
|
|
Sem_Give,
|
|
Sem_Take,
|
|
Sem_Take_Nonblocking
|
|
};
|
|
|
|
class F4Light::Semaphore;
|
|
|
|
typedef struct SEM_LOG {
|
|
uint32_t time;
|
|
F4Light::Semaphore *sem;
|
|
void * task;
|
|
enum Sem_OP op;
|
|
bool result;
|
|
} Sem_Log;
|
|
|
|
Sem_Log sem_log[SEM_LOG_SIZE];
|
|
|
|
#endif
|
|
|
|
|
|
class F4Light::Semaphore : public AP_HAL::Semaphore {
|
|
public: // interface
|
|
Semaphore();
|
|
bool give();
|
|
bool take(uint32_t timeout_ms);
|
|
bool take_nonblocking();
|
|
|
|
//[ functions that called by scheduler only in SVC level so need not to disable interrupts
|
|
bool svc_give();
|
|
bool svc_take(uint32_t timeout_ms);
|
|
bool svc_take_nonblocking();
|
|
inline void *get_owner() { return _task; } // task that owns this semaphore
|
|
inline bool is_taken() { return _taken; }
|
|
inline bool is_waiting() { return _is_waiting; } // does anyone want this semaphore when it was busy?
|
|
//]
|
|
|
|
#ifdef SEM_DEBUG
|
|
static Sem_Log sem_log[SEM_LOG_SIZE];
|
|
static uint16_t sem_log_ptr;
|
|
#endif
|
|
|
|
protected:
|
|
bool _take_from_mainloop(uint32_t timeout_ms);
|
|
bool _take_nonblocking();
|
|
bool _give();
|
|
|
|
volatile bool _taken;
|
|
void * _task; // owner
|
|
bool _is_waiting;
|
|
};
|
|
|
|
|