]> begriffs open source - cmsis/blob - CMSIS/DoxyGen/RTOS2/src/cmsis_os2_Message.txt
RTX5: CVE-2021-27431 vulnerability mitigation
[cmsis] / CMSIS / DoxyGen / RTOS2 / src / cmsis_os2_Message.txt
1 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2 //  ==== Message Queue Management ====
3 /** 
4 @addtogroup CMSIS_RTOS_Message Message Queue
5 @ingroup CMSIS_RTOS
6 @brief Exchange messages between threads in a FIFO-like operation.
7 @details 
8 \b Message \b passing is another basic communication model between threads. In the message passing model, one thread sends
9 data explicitly, while another thread receives it. The operation is more like some kind of I/O rather than a direct access to
10 information to be shared. In CMSIS-RTOS, this mechanism is called s \b message \b queue. The data is passed from one thread
11 to another in a FIFO-like operation. Using message queue functions, you can control, send, receive, or wait for messages. The
12 data to be passed can be of integer or pointer type:
13
14 \image html "MessageQueue.png" "CMSIS-RTOS Message Queue"
15
16 Compared to a \ref CMSIS_RTOS_PoolMgmt, message queues are less efficient in general, but solve a broader range of problems.
17 Sometimes, threads do not have a common address space or the use of shared memory raises problems, such as mutual exclusion.
18
19 \note The functions \ref osMessageQueuePut, \ref osMessageQueueGet, \ref osMessageQueueGetCapacity,
20 \ref osMessageQueueGetMsgSize, \ref osMessageQueueGetCount, \ref osMessageQueueGetSpace can be called from
21 \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines".
22 \note Refer to \ref msgQueueConfig for RTX5 configuration options.
23 @{
24 */
25 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
26 /**
27 \def osMessageQueueId_t
28 \details
29 Returned by:
30 - \ref osMessageQueueNew
31 */
32
33 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
34 /** 
35 \struct osMessageQueueAttr_t
36 \details
37 Specifies the following attributes for the \ref osMessageQueueNew function.
38 */
39
40 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
41 /** 
42 \fn osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr)
43 \details
44 The function \ref osMessageQueueNew creates and initializes a  message queue object.
45 The function returns a message queue object identifier or \token{NULL} in case of an error. 
46
47 The function can be called after kernel initialization with \ref osKernelInitialize. It is possible to 
48 create message queue objects before the RTOS kernel is started with \ref osKernelStart.
49
50 The total amount of memory required for the message queue data is at least <code>msg_count * msg_size</code>.
51 The \em msg_size is rounded up to a double even number to ensure 32-bit alignment of the memory blocks.
52
53 The memory blocks allocated from the message queue have a fixed size defined with the parameter \c msg_size.
54
55 \note This function \b cannot be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines".
56
57 <b>Code Example</b>
58
59 Refer to \ref osMessageQueuePut
60 */
61
62 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
63 /**
64 \fn const char *osMessageQueueGetName (osMessageQueueId_t mq_id)
65 \details
66 The function \b osMessageQueueGetName returns the pointer to the name string of the message queue identified by parameter \a
67 mq_id or \token{NULL} in case of an error.
68
69 \note This function \b cannot be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines".
70 */
71
72 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
73 /** 
74 \fn osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout)
75 \details
76 The blocking function \b osMessageQueuePut puts the message pointed to by \a msg_ptr into the the message queue specified
77 by parameter \a mq_id. The parameter \a msg_prio is used to sort message according their priority (higher numbers indicate
78 a higher priority) on insertion.
79
80 The parameter \a timeout specifies how long the system waits to put the message into the queue. While the system waits, the
81 thread that is calling this function is put into the \ref ThreadStates "BLOCKED" state. The parameter \ref CMSIS_RTOS_TimeOutValue "timeout"
82 can have the following values:
83  - when \a timeout is \token{0}, the function returns instantly (i.e. try semantics).
84  - when \a timeout is set to \b osWaitForever the function will wait for an infinite time until the message is delivered (i.e. wait semantics).
85  - all other values specify a time in kernel ticks for a timeout (i.e. timed-wait semantics).
86
87 Possible \ref osStatus_t return values:
88  - \em osOK: the message has been put into the queue.
89  - \em osErrorTimeout: the message could not be put into the queue in the given time (wait-timed semantics).
90  - \em osErrorResource: not enough space in the queue (try semantics).
91  - \em osErrorParameter: parameter \em mq_id is \token{NULL} or invalid, non-zero timeout specified in an ISR.
92
93 \note May be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines" if the parameter \a timeout is set to
94 \token{0}.
95
96 <b>Code Example:</b>
97 \code
98 #include "cmsis_os2.h"                          // CMSIS RTOS header file
99  
100 /*----------------------------------------------------------------------------
101  *      Message Queue creation & usage
102  *---------------------------------------------------------------------------*/
103  
104 #define MSGQUEUE_OBJECTS 16                     // number of Message Queue Objects
105  
106 typedef struct {                                // object data type
107   uint8_t Buf[32];
108   uint8_t Idx;
109 } MSGQUEUE_OBJ_t;
110  
111 osMessageQueueId_t mid_MsgQueue;                // message queue id
112  
113 osThreadId_t tid_Thread_MsgQueue1;              // thread id 1
114 osThreadId_t tid_Thread_MsgQueue2;              // thread id 2
115  
116 void Thread_MsgQueue1 (void *argument);         // thread function 1
117 void Thread_MsgQueue2 (void *argument);         // thread function 2
118  
119 int Init_MsgQueue (void) {
120  
121   mid_MsgQueue = osMessageQueueNew(MSGQUEUE_OBJECTS, sizeof(MSGQUEUE_OBJ_t), NULL);
122   if (mid_MsgQueue == NULL) {
123     ; // Message Queue object not created, handle failure
124   }
125  
126   tid_Thread_MsgQueue1 = osThreadNew(Thread_MsgQueue1, NULL, NULL);
127   if (tid_Thread_MsgQueue1 == NULL) {
128     return(-1);
129   }
130   tid_Thread_MsgQueue2 = osThreadNew(Thread_MsgQueue2, NULL, NULL);
131   if (tid_Thread_MsgQueue2 == NULL) {
132     return(-1);
133   }
134  
135   return(0);
136 }
137  
138 void Thread_MsgQueue1 (void *argument) {
139   MSGQUEUE_OBJ_t msg;
140  
141   while (1) {
142     ; // Insert thread code here...
143     msg.Buf[0] = 0x55U;                                         // do some work...
144     msg.Idx    = 0U;
145     osMessageQueuePut(mid_MsgQueue, &msg, 0U, 0U);
146     osThreadYield();                                            // suspend thread
147   }
148 }
149  
150 void Thread_MsgQueue2 (void *argument) {
151   MSGQUEUE_OBJ_t msg;
152   osStatus_t status;
153  
154   while (1) {
155     ; // Insert thread code here...
156     status = osMessageQueueGet(mid_MsgQueue, &msg, NULL, 0U);   // wait for message
157     if (status == osOK) {
158       ; // process data
159     }
160   }
161 }
162 \endcode
163 */
164
165 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
166 /** 
167 \fn osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout)
168 \details
169 The function \b osMessageQueueGet retrieves a message from the message queue specified by the parameter \a mq_id and saves it
170 to the buffer pointed to by the parameter \a msg_ptr. The message priority is stored to parameter \a msg_prio if not token{NULL}.
171
172 The parameter \a timeout specifies how long the system waits to retrieve the message from the queue. While the system waits,
173 the thread that is calling this function is put into the \ref ThreadStates "BLOCKED" state. The parameter
174 \ref CMSIS_RTOS_TimeOutValue "timeout" can have the following values:
175  - when \a timeout is \token{0}, the function returns instantly (i.e. try semantics).
176  - when \a timeout is set to \b osWaitForever the function will wait for an infinite time until the message is retrieved (i.e. wait semantics).
177  - all other values specify a time in kernel ticks for a timeout (i.e. timed-wait semantics).
178
179 Possible \ref osStatus_t return values:
180  - \em osOK: the message has been retrieved from the queue.
181  - \em osErrorTimeout: the message could not be retrieved from the queue in the given time (timed-wait semantics).
182  - \em osErrorResource: nothing to get from the queue (try semantics).
183  - \em osErrorParameter: parameter \em mq_id is \token{NULL} or invalid, non-zero timeout specified in an ISR.
184
185 \note May be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines" if the parameter \a timeout is set to
186 \token{0}.
187
188 <b>Code Example</b>
189
190 Refer to \ref osMessageQueuePut
191 */
192
193 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
194 /** 
195 \fn uint32_t osMessageQueueGetCapacity (osMessageQueueId_t mq_id)
196 \details
197 The function \b osMessageQueueGetCapacity returns the maximum number of messages in the message queue object specified by
198 parameter \a mq_id or \token{0} in case of an error.
199
200 \note This function may be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines".
201 */
202
203 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
204 /** 
205 \fn uint32_t osMessageQueueGetMsgSize (osMessageQueueId_t mq_id)
206 \details
207 The function \b osMessageQueueGetMsgSize returns the maximum message size in bytes for the message queue object specified by
208 parameter \a mq_id or \token{0} in case of an error.
209
210 \note This function may be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines".
211 */
212
213 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
214 /** 
215 \fn uint32_t osMessageQueueGetCount (osMessageQueueId_t mq_id)
216 \details
217 The function \b osMessageQueueGetCount returns the number of queued messages in the message queue object specified by
218 parameter \a mq_id or \token{0} in case of an error.
219
220 \note This function may be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines".
221 */
222
223 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
224 /** 
225 \fn uint32_t osMessageQueueGetSpace (osMessageQueueId_t mq_id)
226 \details
227 The function \b osMessageQueueGetSpace returns the number available slots for messages in the message queue object specified
228 by parameter \a mq_id or \token{0} in case of an error.
229
230 \note This function may be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines".
231 */
232
233 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
234 /** 
235 \fn osStatus_t osMessageQueueReset (osMessageQueueId_t mq_id)
236 \details
237 The function \b osMessageQueueReset resets the message queue specified by the parameter \a mq_id.
238
239 Possible \ref osStatus_t return values:
240  - \em osOK: the message queue has been rest.
241  - \em osErrorParameter: parameter \em mq_id is \token{NULL} or invalid.
242  - \em osErrorResource: the message queue is in an invalid state.
243  - \em osErrorISR: \b osMessageQueueReset cannot be called from interrupt service routines.
244
245 \note This function \b cannot be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines".
246 */
247
248 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
249 /** 
250 \fn osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id)
251 \details
252 The function \b osMessageQueueDelete deletes a message queue object specified by parameter \a mq_id. It releases internal
253 memory obtained for message queue handling. After this call, the \a mq_id is no longer valid and cannot be used. The
254 message queue may be created again using the function \ref osMessageQueueNew.
255
256 Possible \ref osStatus_t return values:
257  - \em osOK: the message queue object has been deleted.
258  - \em osErrorParameter: parameter \em mq_id is \token{NULL} or invalid.
259  - \em osErrorResource: the message queue is in an invalid state.
260  - \em osErrorISR: \b osMessageQueueDelete cannot be called from interrupt service routines.
261
262 \note This function \b cannot be called from \ref CMSIS_RTOS_ISR_Calls "Interrupt Service Routines".
263 */
264 /// @}
265
266 // these struct members must stay outside the group to avoid double entries in documentation
267 /**
268 \var osMessageQueueAttr_t::attr_bits
269 \details
270 Reserved for future use (must be set to '0' for future compatibility).
271
272 \var osMessageQueueAttr_t::cb_mem
273 \details
274 Pointer to a memory for the message queue control block object. Refer to \ref StaticObjectMemory for more information.
275
276 Default: \token{NULL} to use \ref CMSIS_RTOS_MemoryMgmt_Automatic for the message queue control block.
277
278 \var osMessageQueueAttr_t::cb_size
279 \details
280 The size (in bytes) of memory block passed with \ref cb_mem. For RTX, the minimum value is defined with \ref osRtxMessageQueueCbSize (higher values are permitted).
281
282 Default: \token{0} as the default is no memory provided with \ref cb_mem.
283
284 \var osMessageQueueAttr_t::name
285 \details
286 Pointer to a constant string with a human readable name (displayed during debugging) of the message queue object.
287
288 Default: \token{NULL} no name specified.
289
290 \var osMessageQueueAttr_t::mq_mem
291 \details
292 Pointer to a memory for the message queue data. Refer to \ref StaticObjectMemory for more information.
293
294 Default: \token{NULL} to use \ref CMSIS_RTOS_MemoryMgmt_Automatic for the memory pool data.
295
296 \var osMessageQueueAttr_t::mq_size
297 \details
298 The size (in bytes) of memory block passed with \ref mq_mem. The minimum memory block size is <code>msg_count * msg_size</code> (parameters of the \ref osMessageQueueNew function). The \em msg_size is rounded up to a double even number to ensure 32-bit alignment of the memory blocks.
299
300 Default: 0 as the default is no memory provided with \ref mq_mem.
301 */