forked from richard-damon/FreeRTOScpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSemaphoreCPP.h
136 lines (128 loc) · 3.7 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
/**
* @file SemaphoreCPP.h
* @copyright (c) 2007-2015 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
*
* @brief FreeRTOS Semaphore Wrapper
*
* This file contains a set of lightweight wrappers for semaphores using FreeRTOS
*
* @todo Add Counting Semaphores (Perhaps rename Semaphore to BinarySemaphore)
* @ingroup FreeRTOSCpp
*/
#ifndef SEMAPHORE_CPP_H
#define SEMAPHORE_CPP_H
#include "Lock.h"
#include "FreeRTOS.h"
#include "semphr.h"
/**
* @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 Semaphore : public Lockable {
public:
/**
* @brief Constructor.
* @param name Name to give semaphore, used for Debug Registry if setup
*/
Semaphore(char const* name) {
#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.
*/
~Semaphore() {
vQueueDelete(sema);
}
/**
* @brief Give the Semaphore.
*/
bool give() {
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){
return xSemaphoreTake(sema, delay);
}
/**
* @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
Semaphore(Semaphore const&) = delete; ///< We are not copyable.
void operator =(Semaphore const&) = delete; ///< We are not assignable.
#endif // __cplusplus
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
StaticSemaphore_t semaBuffer;
#endif
};
#endif