-
Notifications
You must be signed in to change notification settings - Fork 36
/
Copy pathSemaphoreCPP.h
executable file
·163 lines (149 loc) · 4.31 KB
/
SemaphoreCPP.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/**
* @file SemaphoreCPP.h
* @brief FreeRTOS Semaphore Wrapper
*
* This file contains a set of lightweight wrappers for semaphores using FreeRTOS
*
* @copyright (c) 2007-2024 Richard Damon
* @author Richard Damon <[email protected]>
* @parblock
* MIT License:
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* It is requested (but not required by license) that any bugs found or
* improvements made be shared, preferably to the author.
* @endparblock
*
* @todo Add Counting Semaphores
* @ingroup FreeRTOSCpp
*/
#ifndef SEMAPHORE_CPP_H
#define SEMAPHORE_CPP_H
#include "FreeRTOScpp.h"
#include "Lock.h"
#include "FreeRTOS.h"
#include "semphr.h"
#if FREERTOSCPP_USE_NAMESPACE
namespace FreeRTOScpp {
#endif
/**
* @brief Binary Semaphore Wrapper.
*
* Example Usage:
* @code
* Semaphore sema("MySema");
*
* // In some task
* sema.give();
*
* // In some other task
* sema.take();
*
* // In some ISR
*
* portBASE_TYPE woken = 0;
* ...
* sema.give_ISR(woken);
* ...
* portYIELD_FROM_ISR(woken);
* return;
*
* @endcode
* @ingroup FreeRTOSCpp
*/
class BinarySemaphore : public Lockable {
public:
/**
* @brief Constructor.
* @param name Name to give semaphore, used for Debug Registry if setup
*/
BinarySemaphore(char const* name = nullptr) {
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
sema = xSemaphoreCreateBinaryStatic(&semaBuffer);
#else
sema = xSemaphoreCreateBinary();
#endif
#if configQUEUE_REGISTRY_SIZE > 0
if(name)
vQueueAddToRegistry(sema, name);
#endif
}
/**
* @brief Destructor.
*
* Delete the semaphore.
*/
~BinarySemaphore() {
vQueueDelete(sema);
}
/**
* @brief Give the Semaphore.
*/
bool give() override {
return xSemaphoreGive(sema);
}
/**
* @brief Take the semaphore.
*
* @param delay The number of ticks to wait for the semaphore
*/
bool take(TickType_t delay = portMAX_DELAY) override {
return xSemaphoreTake(sema, delay);
}
bool take_ISR(portBASE_TYPE& waswoken) {
return xSemaphoreTakeFromISR(sema, &waswoken);
}
#if FREERTOSCPP_USE_CHRONO
/**
* @brief Take the semaphore.
*
* @param delay The number of ticks to wait for the semaphore
*/
bool take(Time_ms delay){
return xSemaphoreTake(sema, ms2ticks(delay));
}
#endif
/**
* @brief Give the Semaphore inside an ISR
*
* @param waswoken The flag variable used to indicate if we need to run the
* scheduler when we exit the ISR.
*/
bool give_ISR(portBASE_TYPE& waswoken) {
return xSemaphoreGiveFromISR(sema, &waswoken);
}
private:
SemaphoreHandle_t sema;
#if __cplusplus < 201101L
Semaphore(Semaphore const&); ///< We are not copyable.
void operator =(Semaphore const&); ///< We are not assignable.
#else
BinarySemaphore(BinarySemaphore const&) = delete; ///< We are not copyable.
void operator =(BinarySemaphore const&) = delete; ///< We are not assignable.
#endif // __cplusplus
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
StaticSemaphore_t semaBuffer;
#endif
};
typedef BinarySemaphore Semaphore [[deprecated("Rename to BinarySemaphore")]];
#if FREERTOSCPP_USE_NAMESPACE
} // namespace FreeRTOScpp
#endif
#endif