ChibiOS  21.6.0
chmboxes.h
Go to the documentation of this file.
1 /*
2  ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014,
3  2015,2016,2017,2018,2019,2020,2021 Giovanni Di Sirio.
4 
5  This file is part of ChibiOS.
6 
7  ChibiOS is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation version 3 of the License.
10 
11  ChibiOS is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 /**
21  * @file oslib/include/chmboxes.h
22  * @brief Mailboxes macros and structures.
23  *
24  * @addtogroup oslib_mailboxes
25  * @{
26  */
27 
28 #ifndef CHMBOXES_H
29 #define CHMBOXES_H
30 
31 #if (CH_CFG_USE_MAILBOXES == TRUE) || defined(__DOXYGEN__)
32 
33 /*===========================================================================*/
34 /* Module constants. */
35 /*===========================================================================*/
36 
37 /*===========================================================================*/
38 /* Module pre-compile time settings. */
39 /*===========================================================================*/
40 
41 /*===========================================================================*/
42 /* Derived constants and error checks. */
43 /*===========================================================================*/
44 
45 /*===========================================================================*/
46 /* Module data structures and types. */
47 /*===========================================================================*/
48 
49 /**
50  * @brief Structure representing a mailbox object.
51  */
52 typedef struct {
53  msg_t *buffer; /**< @brief Pointer to the mailbox
54  buffer. */
55  msg_t *top; /**< @brief Pointer to the location
56  after the buffer. */
57  msg_t *wrptr; /**< @brief Write pointer. */
58  msg_t *rdptr; /**< @brief Read pointer. */
59  size_t cnt; /**< @brief Messages in queue. */
60  bool reset; /**< @brief True in reset state. */
61  threads_queue_t qw; /**< @brief Queued writers. */
62  threads_queue_t qr; /**< @brief Queued readers. */
63 } mailbox_t;
64 
65 /*===========================================================================*/
66 /* Module macros. */
67 /*===========================================================================*/
68 
69 /**
70  * @brief Data part of a static mailbox initializer.
71  * @details This macro should be used when statically initializing a
72  * mailbox that is part of a bigger structure.
73  *
74  * @param[in] name the name of the mailbox variable
75  * @param[in] buffer pointer to the mailbox buffer array of @p msg_t
76  * @param[in] size number of @p msg_t elements in the buffer array
77  */
78 #define __MAILBOX_DATA(name, buffer, size) { \
79  (msg_t *)(buffer), \
80  (msg_t *)(buffer) + size, \
81  (msg_t *)(buffer), \
82  (msg_t *)(buffer), \
83  (size_t)0, \
84  false, \
85  __THREADS_QUEUE_DATA(name.qw), \
86  __THREADS_QUEUE_DATA(name.qr), \
87 }
88 
89 /**
90  * @brief Static mailbox initializer.
91  * @details Statically initialized mailboxes require no explicit
92  * initialization using @p chMBObjectInit().
93  *
94  * @param[in] name the name of the mailbox variable
95  * @param[in] buffer pointer to the mailbox buffer array of @p msg_t
96  * @param[in] size number of @p msg_t elements in the buffer array
97  */
98 #define MAILBOX_DECL(name, buffer, size) \
99  mailbox_t name = __MAILBOX_DATA(name, buffer, size)
100 
101 /*===========================================================================*/
102 /* External declarations. */
103 /*===========================================================================*/
104 
105 #ifdef __cplusplus
106 extern "C" {
107 #endif
108  void chMBObjectInit(mailbox_t *mbp, msg_t *buf, size_t n);
109  void chMBReset(mailbox_t *mbp);
110  void chMBResetI(mailbox_t *mbp);
111  msg_t chMBPostTimeout(mailbox_t *mbp, msg_t msg, sysinterval_t timeout);
112  msg_t chMBPostTimeoutS(mailbox_t *mbp, msg_t msg, sysinterval_t timeout);
113  msg_t chMBPostI(mailbox_t *mbp, msg_t msg);
116  msg_t chMBPostAheadI(mailbox_t *mbp, msg_t msg);
117  msg_t chMBFetchTimeout(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout);
118  msg_t chMBFetchTimeoutS(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout);
119  msg_t chMBFetchI(mailbox_t *mbp, msg_t *msgp);
120 #ifdef __cplusplus
121 }
122 #endif
123 
124 /*===========================================================================*/
125 /* Module inline functions. */
126 /*===========================================================================*/
127 
128 /**
129  * @brief Returns the mailbox buffer size as number of messages.
130  *
131  * @param[in] mbp the pointer to an initialized @p mailbox_t object
132  * @return The size of the mailbox.
133  *
134  * @iclass
135  */
136 static inline size_t chMBGetSizeI(const mailbox_t *mbp) {
137 
138  /*lint -save -e9033 [10.8] Perfectly safe pointers
139  arithmetic.*/
140  return (size_t)(mbp->top - mbp->buffer);
141  /*lint -restore*/
142 }
143 
144 /**
145  * @brief Returns the number of used message slots into a mailbox.
146  *
147  * @param[in] mbp the pointer to an initialized @p mailbox_t object
148  * @return The number of queued messages.
149  *
150  * @iclass
151  */
152 static inline size_t chMBGetUsedCountI(const mailbox_t *mbp) {
153 
154  chDbgCheckClassI();
155 
156  return mbp->cnt;
157 }
158 
159 /**
160  * @brief Returns the number of free message slots into a mailbox.
161  *
162  * @param[in] mbp the pointer to an initialized @p mailbox_t object
163  * @return The number of empty message slots.
164  *
165  * @iclass
166  */
167 static inline size_t chMBGetFreeCountI(const mailbox_t *mbp) {
168 
169  chDbgCheckClassI();
170 
171  return chMBGetSizeI(mbp) - chMBGetUsedCountI(mbp);
172 }
173 
174 /**
175  * @brief Returns the next message in the queue without removing it.
176  * @pre A message must be waiting in the queue for this function to work
177  * or it would return garbage. The correct way to use this macro is
178  * to use @p chMBGetUsedCountI() and then use this macro, all within
179  * a lock state.
180  *
181  * @param[in] mbp the pointer to an initialized @p mailbox_t object
182  * @return The next message in queue.
183  *
184  * @iclass
185  */
186 static inline msg_t chMBPeekI(const mailbox_t *mbp) {
187 
188  chDbgCheckClassI();
189 
190  return *mbp->rdptr;
191 }
192 
193 /**
194  * @brief Terminates the reset state.
195  *
196  * @param[in] mbp the pointer to an initialized @p mailbox_t object
197  *
198  * @xclass
199  */
200 static inline void chMBResumeX(mailbox_t *mbp) {
201 
202  mbp->reset = false;
203 }
204 
205 #endif /* CH_CFG_USE_MAILBOXES == TRUE */
206 
207 #endif /* CHMBOXES_H */
208 
209 /** @} */
chMBPostI
msg_t chMBPostI(mailbox_t *mbp, msg_t msg)
Posts a message into a mailbox.
Definition: chmboxes.c:243
chMBPostTimeoutS
msg_t chMBPostTimeoutS(mailbox_t *mbp, msg_t msg, sysinterval_t timeout)
Posts a message into a mailbox.
Definition: chmboxes.c:194
mailbox_t::cnt
size_t cnt
Messages in queue.
Definition: chmboxes.h:59
msg_t
int32_t msg_t
Definition: chearly.h:88
chMBPostTimeout
msg_t chMBPostTimeout(mailbox_t *mbp, msg_t msg, sysinterval_t timeout)
Posts a message into a mailbox.
Definition: chmboxes.c:165
chMBResetI
void chMBResetI(mailbox_t *mbp)
Resets a mailbox_t object.
Definition: chmboxes.c:133
mailbox_t::top
msg_t * top
Pointer to the location after the buffer.
Definition: chmboxes.h:55
mailbox_t::buffer
msg_t * buffer
Pointer to the mailbox buffer.
Definition: chmboxes.h:53
chMBGetFreeCountI
static size_t chMBGetFreeCountI(const mailbox_t *mbp)
Returns the number of free message slots into a mailbox.
Definition: chmboxes.h:167
chMBObjectInit
void chMBObjectInit(mailbox_t *mbp, msg_t *buf, size_t n)
Initializes a mailbox_t object.
Definition: chmboxes.c:87
chMBResumeX
static void chMBResumeX(mailbox_t *mbp)
Terminates the reset state.
Definition: chmboxes.h:200
threads_queue_t
Type of a thread queue.
Definition: osal.h:238
chMBGetSizeI
static size_t chMBGetSizeI(const mailbox_t *mbp)
Returns the mailbox buffer size as number of messages.
Definition: chmboxes.h:136
chMBGetUsedCountI
static size_t chMBGetUsedCountI(const mailbox_t *mbp)
Returns the number of used message slots into a mailbox.
Definition: chmboxes.h:152
mailbox_t::wrptr
msg_t * wrptr
Write pointer.
Definition: chmboxes.h:57
sysinterval_t
uint64_t sysinterval_t
Type of time interval.
Definition: chtime.h:119
mailbox_t::qw
threads_queue_t qw
Queued writers.
Definition: chmboxes.h:61
chMBReset
void chMBReset(mailbox_t *mbp)
Resets a mailbox_t object.
Definition: chmboxes.c:113
mailbox_t::reset
bool reset
True in reset state.
Definition: chmboxes.h:60
chMBFetchTimeoutS
msg_t chMBFetchTimeoutS(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout)
Retrieves a message from a mailbox.
Definition: chmboxes.c:444
chMBFetchI
msg_t chMBFetchI(mailbox_t *mbp, msg_t *msgp)
Retrieves a message from a mailbox.
Definition: chmboxes.c:493
chMBFetchTimeout
msg_t chMBFetchTimeout(mailbox_t *mbp, msg_t *msgp, sysinterval_t timeout)
Retrieves a message from a mailbox.
Definition: chmboxes.c:415
mailbox_t
Structure representing a mailbox object.
Definition: chmboxes.h:52
mailbox_t::qr
threads_queue_t qr
Queued readers.
Definition: chmboxes.h:62
chMBPostAheadTimeout
msg_t chMBPostAheadTimeout(mailbox_t *mbp, msg_t msg, sysinterval_t timeout)
Posts an high priority message into a mailbox.
Definition: chmboxes.c:290
chMBPostAheadTimeoutS
msg_t chMBPostAheadTimeoutS(mailbox_t *mbp, msg_t msg, sysinterval_t timeout)
Posts an high priority message into a mailbox.
Definition: chmboxes.c:319
chMBPeekI
static msg_t chMBPeekI(const mailbox_t *mbp)
Returns the next message in the queue without removing it.
Definition: chmboxes.h:186
chMBPostAheadI
msg_t chMBPostAheadI(mailbox_t *mbp, msg_t msg)
Posts an high priority message into a mailbox.
Definition: chmboxes.c:368
mailbox_t::rdptr
msg_t * rdptr
Read pointer.
Definition: chmboxes.h:58