xref: /Kernel-v10.6.2/include/queue.h (revision ef7b253b56c9788077f5ecd6c9deb4021923d646)
1 /*
2  * FreeRTOS Kernel V10.6.2
3  * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
4  *
5  * SPDX-License-Identifier: MIT
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy of
8  * this software and associated documentation files (the "Software"), to deal in
9  * the Software without restriction, including without limitation the rights to
10  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11  * the Software, and to permit persons to whom the Software is furnished to do so,
12  * subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in all
15  * copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * https://www.FreeRTOS.org
25  * https://github.com/FreeRTOS
26  *
27  */
28 
29 
30 #ifndef QUEUE_H
31 #define QUEUE_H
32 
33 #ifndef INC_FREERTOS_H
34     #error "include FreeRTOS.h" must appear in source files before "include queue.h"
35 #endif
36 
37 /* *INDENT-OFF* */
38 #ifdef __cplusplus
39     extern "C" {
40 #endif
41 /* *INDENT-ON* */
42 
43 #include "task.h"
44 
45 /**
46  * Type by which queues are referenced.  For example, a call to xQueueCreate()
47  * returns an QueueHandle_t variable that can then be used as a parameter to
48  * xQueueSend(), xQueueReceive(), etc.
49  */
50 struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */
51 typedef struct QueueDefinition   * QueueHandle_t;
52 
53 /**
54  * Type by which queue sets are referenced.  For example, a call to
55  * xQueueCreateSet() returns an xQueueSet variable that can then be used as a
56  * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc.
57  */
58 typedef struct QueueDefinition   * QueueSetHandle_t;
59 
60 /**
61  * Queue sets can contain both queues and semaphores, so the
62  * QueueSetMemberHandle_t is defined as a type to be used where a parameter or
63  * return value can be either an QueueHandle_t or an SemaphoreHandle_t.
64  */
65 typedef struct QueueDefinition   * QueueSetMemberHandle_t;
66 
67 /* For internal use only. */
68 #define queueSEND_TO_BACK                     ( ( BaseType_t ) 0 )
69 #define queueSEND_TO_FRONT                    ( ( BaseType_t ) 1 )
70 #define queueOVERWRITE                        ( ( BaseType_t ) 2 )
71 
72 /* For internal use only.  These definitions *must* match those in queue.c. */
73 #define queueQUEUE_TYPE_BASE                  ( ( uint8_t ) 0U )
74 #define queueQUEUE_TYPE_SET                   ( ( uint8_t ) 0U )
75 #define queueQUEUE_TYPE_MUTEX                 ( ( uint8_t ) 1U )
76 #define queueQUEUE_TYPE_COUNTING_SEMAPHORE    ( ( uint8_t ) 2U )
77 #define queueQUEUE_TYPE_BINARY_SEMAPHORE      ( ( uint8_t ) 3U )
78 #define queueQUEUE_TYPE_RECURSIVE_MUTEX       ( ( uint8_t ) 4U )
79 
80 /**
81  * queue. h
82  * @code{c}
83  * QueueHandle_t xQueueCreate(
84  *                            UBaseType_t uxQueueLength,
85  *                            UBaseType_t uxItemSize
86  *                        );
87  * @endcode
88  *
89  * Creates a new queue instance, and returns a handle by which the new queue
90  * can be referenced.
91  *
92  * Internally, within the FreeRTOS implementation, queues use two blocks of
93  * memory.  The first block is used to hold the queue's data structures.  The
94  * second block is used to hold items placed into the queue.  If a queue is
95  * created using xQueueCreate() then both blocks of memory are automatically
96  * dynamically allocated inside the xQueueCreate() function.  (see
97  * https://www.FreeRTOS.org/a00111.html).  If a queue is created using
98  * xQueueCreateStatic() then the application writer must provide the memory that
99  * will get used by the queue.  xQueueCreateStatic() therefore allows a queue to
100  * be created without using any dynamic memory allocation.
101  *
102  * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html
103  *
104  * @param uxQueueLength The maximum number of items that the queue can contain.
105  *
106  * @param uxItemSize The number of bytes each item in the queue will require.
107  * Items are queued by copy, not by reference, so this is the number of bytes
108  * that will be copied for each posted item.  Each item on the queue must be
109  * the same size.
110  *
111  * @return If the queue is successfully create then a handle to the newly
112  * created queue is returned.  If the queue cannot be created then 0 is
113  * returned.
114  *
115  * Example usage:
116  * @code{c}
117  * struct AMessage
118  * {
119  *  char ucMessageID;
120  *  char ucData[ 20 ];
121  * };
122  *
123  * void vATask( void *pvParameters )
124  * {
125  * QueueHandle_t xQueue1, xQueue2;
126  *
127  *  // Create a queue capable of containing 10 uint32_t values.
128  *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
129  *  if( xQueue1 == 0 )
130  *  {
131  *      // Queue was not created and must not be used.
132  *  }
133  *
134  *  // Create a queue capable of containing 10 pointers to AMessage structures.
135  *  // These should be passed by pointer as they contain a lot of data.
136  *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
137  *  if( xQueue2 == 0 )
138  *  {
139  *      // Queue was not created and must not be used.
140  *  }
141  *
142  *  // ... Rest of task code.
143  * }
144  * @endcode
145  * \defgroup xQueueCreate xQueueCreate
146  * \ingroup QueueManagement
147  */
148 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
149     #define xQueueCreate( uxQueueLength, uxItemSize )    xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) )
150 #endif
151 
152 /**
153  * queue. h
154  * @code{c}
155  * QueueHandle_t xQueueCreateStatic(
156  *                            UBaseType_t uxQueueLength,
157  *                            UBaseType_t uxItemSize,
158  *                            uint8_t *pucQueueStorage,
159  *                            StaticQueue_t *pxQueueBuffer
160  *                        );
161  * @endcode
162  *
163  * Creates a new queue instance, and returns a handle by which the new queue
164  * can be referenced.
165  *
166  * Internally, within the FreeRTOS implementation, queues use two blocks of
167  * memory.  The first block is used to hold the queue's data structures.  The
168  * second block is used to hold items placed into the queue.  If a queue is
169  * created using xQueueCreate() then both blocks of memory are automatically
170  * dynamically allocated inside the xQueueCreate() function.  (see
171  * https://www.FreeRTOS.org/a00111.html).  If a queue is created using
172  * xQueueCreateStatic() then the application writer must provide the memory that
173  * will get used by the queue.  xQueueCreateStatic() therefore allows a queue to
174  * be created without using any dynamic memory allocation.
175  *
176  * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html
177  *
178  * @param uxQueueLength The maximum number of items that the queue can contain.
179  *
180  * @param uxItemSize The number of bytes each item in the queue will require.
181  * Items are queued by copy, not by reference, so this is the number of bytes
182  * that will be copied for each posted item.  Each item on the queue must be
183  * the same size.
184  *
185  * @param pucQueueStorage If uxItemSize is not zero then
186  * pucQueueStorage must point to a uint8_t array that is at least large
187  * enough to hold the maximum number of items that can be in the queue at any
188  * one time - which is ( uxQueueLength * uxItemsSize ) bytes.  If uxItemSize is
189  * zero then pucQueueStorage can be NULL.
190  *
191  * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which
192  * will be used to hold the queue's data structure.
193  *
194  * @return If the queue is created then a handle to the created queue is
195  * returned.  If pxQueueBuffer is NULL then NULL is returned.
196  *
197  * Example usage:
198  * @code{c}
199  * struct AMessage
200  * {
201  *  char ucMessageID;
202  *  char ucData[ 20 ];
203  * };
204  *
205  #define QUEUE_LENGTH 10
206  #define ITEM_SIZE sizeof( uint32_t )
207  *
208  * // xQueueBuffer will hold the queue structure.
209  * StaticQueue_t xQueueBuffer;
210  *
211  * // ucQueueStorage will hold the items posted to the queue.  Must be at least
212  * // [(queue length) * ( queue item size)] bytes long.
213  * uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];
214  *
215  * void vATask( void *pvParameters )
216  * {
217  *  QueueHandle_t xQueue1;
218  *
219  *  // Create a queue capable of containing 10 uint32_t values.
220  *  xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold.
221  *                          ITEM_SIZE     // The size of each item in the queue
222  *                          &( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue.
223  *                          &xQueueBuffer ); // The buffer that will hold the queue structure.
224  *
225  *  // The queue is guaranteed to be created successfully as no dynamic memory
226  *  // allocation is used.  Therefore xQueue1 is now a handle to a valid queue.
227  *
228  *  // ... Rest of task code.
229  * }
230  * @endcode
231  * \defgroup xQueueCreateStatic xQueueCreateStatic
232  * \ingroup QueueManagement
233  */
234 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
235     #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer )    xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) )
236 #endif /* configSUPPORT_STATIC_ALLOCATION */
237 
238 /**
239  * queue. h
240  * @code{c}
241  * BaseType_t xQueueGetStaticBuffers( QueueHandle_t xQueue,
242  *                                    uint8_t ** ppucQueueStorage,
243  *                                    StaticQueue_t ** ppxStaticQueue );
244  * @endcode
245  *
246  * Retrieve pointers to a statically created queue's data structure buffer
247  * and storage area buffer. These are the same buffers that are supplied
248  * at the time of creation.
249  *
250  * @param xQueue The queue for which to retrieve the buffers.
251  *
252  * @param ppucQueueStorage Used to return a pointer to the queue's storage
253  * area buffer.
254  *
255  * @param ppxStaticQueue Used to return a pointer to the queue's data
256  * structure buffer.
257  *
258  * @return pdTRUE if buffers were retrieved, pdFALSE otherwise.
259  *
260  * \defgroup xQueueGetStaticBuffers xQueueGetStaticBuffers
261  * \ingroup QueueManagement
262  */
263 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
264     #define xQueueGetStaticBuffers( xQueue, ppucQueueStorage, ppxStaticQueue )    xQueueGenericGetStaticBuffers( ( xQueue ), ( ppucQueueStorage ), ( ppxStaticQueue ) )
265 #endif /* configSUPPORT_STATIC_ALLOCATION */
266 
267 /**
268  * queue. h
269  * @code{c}
270  * BaseType_t xQueueSendToToFront(
271  *                                 QueueHandle_t    xQueue,
272  *                                 const void       *pvItemToQueue,
273  *                                 TickType_t       xTicksToWait
274  *                             );
275  * @endcode
276  *
277  * Post an item to the front of a queue.  The item is queued by copy, not by
278  * reference.  This function must not be called from an interrupt service
279  * routine.  See xQueueSendFromISR () for an alternative which may be used
280  * in an ISR.
281  *
282  * @param xQueue The handle to the queue on which the item is to be posted.
283  *
284  * @param pvItemToQueue A pointer to the item that is to be placed on the
285  * queue.  The size of the items the queue will hold was defined when the
286  * queue was created, so this many bytes will be copied from pvItemToQueue
287  * into the queue storage area.
288  *
289  * @param xTicksToWait The maximum amount of time the task should block
290  * waiting for space to become available on the queue, should it already
291  * be full.  The call will return immediately if this is set to 0 and the
292  * queue is full.  The time is defined in tick periods so the constant
293  * portTICK_PERIOD_MS should be used to convert to real time if this is required.
294  *
295  * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.
296  *
297  * Example usage:
298  * @code{c}
299  * struct AMessage
300  * {
301  *  char ucMessageID;
302  *  char ucData[ 20 ];
303  * } xMessage;
304  *
305  * uint32_t ulVar = 10UL;
306  *
307  * void vATask( void *pvParameters )
308  * {
309  * QueueHandle_t xQueue1, xQueue2;
310  * struct AMessage *pxMessage;
311  *
312  *  // Create a queue capable of containing 10 uint32_t values.
313  *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
314  *
315  *  // Create a queue capable of containing 10 pointers to AMessage structures.
316  *  // These should be passed by pointer as they contain a lot of data.
317  *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
318  *
319  *  // ...
320  *
321  *  if( xQueue1 != 0 )
322  *  {
323  *      // Send an uint32_t.  Wait for 10 ticks for space to become
324  *      // available if necessary.
325  *      if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
326  *      {
327  *          // Failed to post the message, even after 10 ticks.
328  *      }
329  *  }
330  *
331  *  if( xQueue2 != 0 )
332  *  {
333  *      // Send a pointer to a struct AMessage object.  Don't block if the
334  *      // queue is already full.
335  *      pxMessage = & xMessage;
336  *      xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
337  *  }
338  *
339  *  // ... Rest of task code.
340  * }
341  * @endcode
342  * \defgroup xQueueSend xQueueSend
343  * \ingroup QueueManagement
344  */
345 #define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) \
346     xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT )
347 
348 /**
349  * queue. h
350  * @code{c}
351  * BaseType_t xQueueSendToBack(
352  *                                 QueueHandle_t    xQueue,
353  *                                 const void       *pvItemToQueue,
354  *                                 TickType_t       xTicksToWait
355  *                             );
356  * @endcode
357  *
358  * This is a macro that calls xQueueGenericSend().
359  *
360  * Post an item to the back of a queue.  The item is queued by copy, not by
361  * reference.  This function must not be called from an interrupt service
362  * routine.  See xQueueSendFromISR () for an alternative which may be used
363  * in an ISR.
364  *
365  * @param xQueue The handle to the queue on which the item is to be posted.
366  *
367  * @param pvItemToQueue A pointer to the item that is to be placed on the
368  * queue.  The size of the items the queue will hold was defined when the
369  * queue was created, so this many bytes will be copied from pvItemToQueue
370  * into the queue storage area.
371  *
372  * @param xTicksToWait The maximum amount of time the task should block
373  * waiting for space to become available on the queue, should it already
374  * be full.  The call will return immediately if this is set to 0 and the queue
375  * is full.  The  time is defined in tick periods so the constant
376  * portTICK_PERIOD_MS should be used to convert to real time if this is required.
377  *
378  * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.
379  *
380  * Example usage:
381  * @code{c}
382  * struct AMessage
383  * {
384  *  char ucMessageID;
385  *  char ucData[ 20 ];
386  * } xMessage;
387  *
388  * uint32_t ulVar = 10UL;
389  *
390  * void vATask( void *pvParameters )
391  * {
392  * QueueHandle_t xQueue1, xQueue2;
393  * struct AMessage *pxMessage;
394  *
395  *  // Create a queue capable of containing 10 uint32_t values.
396  *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
397  *
398  *  // Create a queue capable of containing 10 pointers to AMessage structures.
399  *  // These should be passed by pointer as they contain a lot of data.
400  *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
401  *
402  *  // ...
403  *
404  *  if( xQueue1 != 0 )
405  *  {
406  *      // Send an uint32_t.  Wait for 10 ticks for space to become
407  *      // available if necessary.
408  *      if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
409  *      {
410  *          // Failed to post the message, even after 10 ticks.
411  *      }
412  *  }
413  *
414  *  if( xQueue2 != 0 )
415  *  {
416  *      // Send a pointer to a struct AMessage object.  Don't block if the
417  *      // queue is already full.
418  *      pxMessage = & xMessage;
419  *      xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
420  *  }
421  *
422  *  // ... Rest of task code.
423  * }
424  * @endcode
425  * \defgroup xQueueSend xQueueSend
426  * \ingroup QueueManagement
427  */
428 #define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) \
429     xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )
430 
431 /**
432  * queue. h
433  * @code{c}
434  * BaseType_t xQueueSend(
435  *                            QueueHandle_t xQueue,
436  *                            const void * pvItemToQueue,
437  *                            TickType_t xTicksToWait
438  *                       );
439  * @endcode
440  *
441  * This is a macro that calls xQueueGenericSend().  It is included for
442  * backward compatibility with versions of FreeRTOS.org that did not
443  * include the xQueueSendToFront() and xQueueSendToBack() macros.  It is
444  * equivalent to xQueueSendToBack().
445  *
446  * Post an item on a queue.  The item is queued by copy, not by reference.
447  * This function must not be called from an interrupt service routine.
448  * See xQueueSendFromISR () for an alternative which may be used in an ISR.
449  *
450  * @param xQueue The handle to the queue on which the item is to be posted.
451  *
452  * @param pvItemToQueue A pointer to the item that is to be placed on the
453  * queue.  The size of the items the queue will hold was defined when the
454  * queue was created, so this many bytes will be copied from pvItemToQueue
455  * into the queue storage area.
456  *
457  * @param xTicksToWait The maximum amount of time the task should block
458  * waiting for space to become available on the queue, should it already
459  * be full.  The call will return immediately if this is set to 0 and the
460  * queue is full.  The time is defined in tick periods so the constant
461  * portTICK_PERIOD_MS should be used to convert to real time if this is required.
462  *
463  * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.
464  *
465  * Example usage:
466  * @code{c}
467  * struct AMessage
468  * {
469  *  char ucMessageID;
470  *  char ucData[ 20 ];
471  * } xMessage;
472  *
473  * uint32_t ulVar = 10UL;
474  *
475  * void vATask( void *pvParameters )
476  * {
477  * QueueHandle_t xQueue1, xQueue2;
478  * struct AMessage *pxMessage;
479  *
480  *  // Create a queue capable of containing 10 uint32_t values.
481  *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
482  *
483  *  // Create a queue capable of containing 10 pointers to AMessage structures.
484  *  // These should be passed by pointer as they contain a lot of data.
485  *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
486  *
487  *  // ...
488  *
489  *  if( xQueue1 != 0 )
490  *  {
491  *      // Send an uint32_t.  Wait for 10 ticks for space to become
492  *      // available if necessary.
493  *      if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
494  *      {
495  *          // Failed to post the message, even after 10 ticks.
496  *      }
497  *  }
498  *
499  *  if( xQueue2 != 0 )
500  *  {
501  *      // Send a pointer to a struct AMessage object.  Don't block if the
502  *      // queue is already full.
503  *      pxMessage = & xMessage;
504  *      xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
505  *  }
506  *
507  *  // ... Rest of task code.
508  * }
509  * @endcode
510  * \defgroup xQueueSend xQueueSend
511  * \ingroup QueueManagement
512  */
513 #define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) \
514     xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )
515 
516 /**
517  * queue. h
518  * @code{c}
519  * BaseType_t xQueueOverwrite(
520  *                            QueueHandle_t xQueue,
521  *                            const void * pvItemToQueue
522  *                       );
523  * @endcode
524  *
525  * Only for use with queues that have a length of one - so the queue is either
526  * empty or full.
527  *
528  * Post an item on a queue.  If the queue is already full then overwrite the
529  * value held in the queue.  The item is queued by copy, not by reference.
530  *
531  * This function must not be called from an interrupt service routine.
532  * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR.
533  *
534  * @param xQueue The handle of the queue to which the data is being sent.
535  *
536  * @param pvItemToQueue A pointer to the item that is to be placed on the
537  * queue.  The size of the items the queue will hold was defined when the
538  * queue was created, so this many bytes will be copied from pvItemToQueue
539  * into the queue storage area.
540  *
541  * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and
542  * therefore has the same return values as xQueueSendToFront().  However, pdPASS
543  * is the only value that can be returned because xQueueOverwrite() will write
544  * to the queue even when the queue is already full.
545  *
546  * Example usage:
547  * @code{c}
548  *
549  * void vFunction( void *pvParameters )
550  * {
551  * QueueHandle_t xQueue;
552  * uint32_t ulVarToSend, ulValReceived;
553  *
554  *  // Create a queue to hold one uint32_t value.  It is strongly
555  *  // recommended *not* to use xQueueOverwrite() on queues that can
556  *  // contain more than one value, and doing so will trigger an assertion
557  *  // if configASSERT() is defined.
558  *  xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
559  *
560  *  // Write the value 10 to the queue using xQueueOverwrite().
561  *  ulVarToSend = 10;
562  *  xQueueOverwrite( xQueue, &ulVarToSend );
563  *
564  *  // Peeking the queue should now return 10, but leave the value 10 in
565  *  // the queue.  A block time of zero is used as it is known that the
566  *  // queue holds a value.
567  *  ulValReceived = 0;
568  *  xQueuePeek( xQueue, &ulValReceived, 0 );
569  *
570  *  if( ulValReceived != 10 )
571  *  {
572  *      // Error unless the item was removed by a different task.
573  *  }
574  *
575  *  // The queue is still full.  Use xQueueOverwrite() to overwrite the
576  *  // value held in the queue with 100.
577  *  ulVarToSend = 100;
578  *  xQueueOverwrite( xQueue, &ulVarToSend );
579  *
580  *  // This time read from the queue, leaving the queue empty once more.
581  *  // A block time of 0 is used again.
582  *  xQueueReceive( xQueue, &ulValReceived, 0 );
583  *
584  *  // The value read should be the last value written, even though the
585  *  // queue was already full when the value was written.
586  *  if( ulValReceived != 100 )
587  *  {
588  *      // Error!
589  *  }
590  *
591  *  // ...
592  * }
593  * @endcode
594  * \defgroup xQueueOverwrite xQueueOverwrite
595  * \ingroup QueueManagement
596  */
597 #define xQueueOverwrite( xQueue, pvItemToQueue ) \
598     xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE )
599 
600 
601 /**
602  * queue. h
603  * @code{c}
604  * BaseType_t xQueueGenericSend(
605  *                                  QueueHandle_t xQueue,
606  *                                  const void * pvItemToQueue,
607  *                                  TickType_t xTicksToWait
608  *                                  BaseType_t xCopyPosition
609  *                              );
610  * @endcode
611  *
612  * It is preferred that the macros xQueueSend(), xQueueSendToFront() and
613  * xQueueSendToBack() are used in place of calling this function directly.
614  *
615  * Post an item on a queue.  The item is queued by copy, not by reference.
616  * This function must not be called from an interrupt service routine.
617  * See xQueueSendFromISR () for an alternative which may be used in an ISR.
618  *
619  * @param xQueue The handle to the queue on which the item is to be posted.
620  *
621  * @param pvItemToQueue A pointer to the item that is to be placed on the
622  * queue.  The size of the items the queue will hold was defined when the
623  * queue was created, so this many bytes will be copied from pvItemToQueue
624  * into the queue storage area.
625  *
626  * @param xTicksToWait The maximum amount of time the task should block
627  * waiting for space to become available on the queue, should it already
628  * be full.  The call will return immediately if this is set to 0 and the
629  * queue is full.  The time is defined in tick periods so the constant
630  * portTICK_PERIOD_MS should be used to convert to real time if this is required.
631  *
632  * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the
633  * item at the back of the queue, or queueSEND_TO_FRONT to place the item
634  * at the front of the queue (for high priority messages).
635  *
636  * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.
637  *
638  * Example usage:
639  * @code{c}
640  * struct AMessage
641  * {
642  *  char ucMessageID;
643  *  char ucData[ 20 ];
644  * } xMessage;
645  *
646  * uint32_t ulVar = 10UL;
647  *
648  * void vATask( void *pvParameters )
649  * {
650  * QueueHandle_t xQueue1, xQueue2;
651  * struct AMessage *pxMessage;
652  *
653  *  // Create a queue capable of containing 10 uint32_t values.
654  *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
655  *
656  *  // Create a queue capable of containing 10 pointers to AMessage structures.
657  *  // These should be passed by pointer as they contain a lot of data.
658  *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
659  *
660  *  // ...
661  *
662  *  if( xQueue1 != 0 )
663  *  {
664  *      // Send an uint32_t.  Wait for 10 ticks for space to become
665  *      // available if necessary.
666  *      if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS )
667  *      {
668  *          // Failed to post the message, even after 10 ticks.
669  *      }
670  *  }
671  *
672  *  if( xQueue2 != 0 )
673  *  {
674  *      // Send a pointer to a struct AMessage object.  Don't block if the
675  *      // queue is already full.
676  *      pxMessage = & xMessage;
677  *      xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK );
678  *  }
679  *
680  *  // ... Rest of task code.
681  * }
682  * @endcode
683  * \defgroup xQueueSend xQueueSend
684  * \ingroup QueueManagement
685  */
686 BaseType_t xQueueGenericSend( QueueHandle_t xQueue,
687                               const void * const pvItemToQueue,
688                               TickType_t xTicksToWait,
689                               const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION;
690 
691 /**
692  * queue. h
693  * @code{c}
694  * BaseType_t xQueuePeek(
695  *                           QueueHandle_t xQueue,
696  *                           void * const pvBuffer,
697  *                           TickType_t xTicksToWait
698  *                       );
699  * @endcode
700  *
701  * Receive an item from a queue without removing the item from the queue.
702  * The item is received by copy so a buffer of adequate size must be
703  * provided.  The number of bytes copied into the buffer was defined when
704  * the queue was created.
705  *
706  * Successfully received items remain on the queue so will be returned again
707  * by the next call, or a call to xQueueReceive().
708  *
709  * This macro must not be used in an interrupt service routine.  See
710  * xQueuePeekFromISR() for an alternative that can be called from an interrupt
711  * service routine.
712  *
713  * @param xQueue The handle to the queue from which the item is to be
714  * received.
715  *
716  * @param pvBuffer Pointer to the buffer into which the received item will
717  * be copied.
718  *
719  * @param xTicksToWait The maximum amount of time the task should block
720  * waiting for an item to receive should the queue be empty at the time
721  * of the call. The time is defined in tick periods so the constant
722  * portTICK_PERIOD_MS should be used to convert to real time if this is required.
723  * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue
724  * is empty.
725  *
726  * @return pdTRUE if an item was successfully received from the queue,
727  * otherwise pdFALSE.
728  *
729  * Example usage:
730  * @code{c}
731  * struct AMessage
732  * {
733  *  char ucMessageID;
734  *  char ucData[ 20 ];
735  * } xMessage;
736  *
737  * QueueHandle_t xQueue;
738  *
739  * // Task to create a queue and post a value.
740  * void vATask( void *pvParameters )
741  * {
742  * struct AMessage *pxMessage;
743  *
744  *  // Create a queue capable of containing 10 pointers to AMessage structures.
745  *  // These should be passed by pointer as they contain a lot of data.
746  *  xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
747  *  if( xQueue == 0 )
748  *  {
749  *      // Failed to create the queue.
750  *  }
751  *
752  *  // ...
753  *
754  *  // Send a pointer to a struct AMessage object.  Don't block if the
755  *  // queue is already full.
756  *  pxMessage = & xMessage;
757  *  xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
758  *
759  *  // ... Rest of task code.
760  * }
761  *
762  * // Task to peek the data from the queue.
763  * void vADifferentTask( void *pvParameters )
764  * {
765  * struct AMessage *pxRxedMessage;
766  *
767  *  if( xQueue != 0 )
768  *  {
769  *      // Peek a message on the created queue.  Block for 10 ticks if a
770  *      // message is not immediately available.
771  *      if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
772  *      {
773  *          // pcRxedMessage now points to the struct AMessage variable posted
774  *          // by vATask, but the item still remains on the queue.
775  *      }
776  *  }
777  *
778  *  // ... Rest of task code.
779  * }
780  * @endcode
781  * \defgroup xQueuePeek xQueuePeek
782  * \ingroup QueueManagement
783  */
784 BaseType_t xQueuePeek( QueueHandle_t xQueue,
785                        void * const pvBuffer,
786                        TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
787 
788 /**
789  * queue. h
790  * @code{c}
791  * BaseType_t xQueuePeekFromISR(
792  *                                  QueueHandle_t xQueue,
793  *                                  void *pvBuffer,
794  *                              );
795  * @endcode
796  *
797  * A version of xQueuePeek() that can be called from an interrupt service
798  * routine (ISR).
799  *
800  * Receive an item from a queue without removing the item from the queue.
801  * The item is received by copy so a buffer of adequate size must be
802  * provided.  The number of bytes copied into the buffer was defined when
803  * the queue was created.
804  *
805  * Successfully received items remain on the queue so will be returned again
806  * by the next call, or a call to xQueueReceive().
807  *
808  * @param xQueue The handle to the queue from which the item is to be
809  * received.
810  *
811  * @param pvBuffer Pointer to the buffer into which the received item will
812  * be copied.
813  *
814  * @return pdTRUE if an item was successfully received from the queue,
815  * otherwise pdFALSE.
816  *
817  * \defgroup xQueuePeekFromISR xQueuePeekFromISR
818  * \ingroup QueueManagement
819  */
820 BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue,
821                               void * const pvBuffer ) PRIVILEGED_FUNCTION;
822 
823 /**
824  * queue. h
825  * @code{c}
826  * BaseType_t xQueueReceive(
827  *                               QueueHandle_t xQueue,
828  *                               void *pvBuffer,
829  *                               TickType_t xTicksToWait
830  *                          );
831  * @endcode
832  *
833  * Receive an item from a queue.  The item is received by copy so a buffer of
834  * adequate size must be provided.  The number of bytes copied into the buffer
835  * was defined when the queue was created.
836  *
837  * Successfully received items are removed from the queue.
838  *
839  * This function must not be used in an interrupt service routine.  See
840  * xQueueReceiveFromISR for an alternative that can.
841  *
842  * @param xQueue The handle to the queue from which the item is to be
843  * received.
844  *
845  * @param pvBuffer Pointer to the buffer into which the received item will
846  * be copied.
847  *
848  * @param xTicksToWait The maximum amount of time the task should block
849  * waiting for an item to receive should the queue be empty at the time
850  * of the call. xQueueReceive() will return immediately if xTicksToWait
851  * is zero and the queue is empty.  The time is defined in tick periods so the
852  * constant portTICK_PERIOD_MS should be used to convert to real time if this is
853  * required.
854  *
855  * @return pdTRUE if an item was successfully received from the queue,
856  * otherwise pdFALSE.
857  *
858  * Example usage:
859  * @code{c}
860  * struct AMessage
861  * {
862  *  char ucMessageID;
863  *  char ucData[ 20 ];
864  * } xMessage;
865  *
866  * QueueHandle_t xQueue;
867  *
868  * // Task to create a queue and post a value.
869  * void vATask( void *pvParameters )
870  * {
871  * struct AMessage *pxMessage;
872  *
873  *  // Create a queue capable of containing 10 pointers to AMessage structures.
874  *  // These should be passed by pointer as they contain a lot of data.
875  *  xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
876  *  if( xQueue == 0 )
877  *  {
878  *      // Failed to create the queue.
879  *  }
880  *
881  *  // ...
882  *
883  *  // Send a pointer to a struct AMessage object.  Don't block if the
884  *  // queue is already full.
885  *  pxMessage = & xMessage;
886  *  xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
887  *
888  *  // ... Rest of task code.
889  * }
890  *
891  * // Task to receive from the queue.
892  * void vADifferentTask( void *pvParameters )
893  * {
894  * struct AMessage *pxRxedMessage;
895  *
896  *  if( xQueue != 0 )
897  *  {
898  *      // Receive a message on the created queue.  Block for 10 ticks if a
899  *      // message is not immediately available.
900  *      if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
901  *      {
902  *          // pcRxedMessage now points to the struct AMessage variable posted
903  *          // by vATask.
904  *      }
905  *  }
906  *
907  *  // ... Rest of task code.
908  * }
909  * @endcode
910  * \defgroup xQueueReceive xQueueReceive
911  * \ingroup QueueManagement
912  */
913 BaseType_t xQueueReceive( QueueHandle_t xQueue,
914                           void * const pvBuffer,
915                           TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
916 
917 /**
918  * queue. h
919  * @code{c}
920  * UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
921  * @endcode
922  *
923  * Return the number of messages stored in a queue.
924  *
925  * @param xQueue A handle to the queue being queried.
926  *
927  * @return The number of messages available in the queue.
928  *
929  * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting
930  * \ingroup QueueManagement
931  */
932 UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
933 
934 /**
935  * queue. h
936  * @code{c}
937  * UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
938  * @endcode
939  *
940  * Return the number of free spaces available in a queue.  This is equal to the
941  * number of items that can be sent to the queue before the queue becomes full
942  * if no items are removed.
943  *
944  * @param xQueue A handle to the queue being queried.
945  *
946  * @return The number of spaces available in the queue.
947  *
948  * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting
949  * \ingroup QueueManagement
950  */
951 UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
952 
953 /**
954  * queue. h
955  * @code{c}
956  * void vQueueDelete( QueueHandle_t xQueue );
957  * @endcode
958  *
959  * Delete a queue - freeing all the memory allocated for storing of items
960  * placed on the queue.
961  *
962  * @param xQueue A handle to the queue to be deleted.
963  *
964  * \defgroup vQueueDelete vQueueDelete
965  * \ingroup QueueManagement
966  */
967 void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
968 
969 /**
970  * queue. h
971  * @code{c}
972  * BaseType_t xQueueSendToFrontFromISR(
973  *                                       QueueHandle_t xQueue,
974  *                                       const void *pvItemToQueue,
975  *                                       BaseType_t *pxHigherPriorityTaskWoken
976  *                                    );
977  * @endcode
978  *
979  * This is a macro that calls xQueueGenericSendFromISR().
980  *
981  * Post an item to the front of a queue.  It is safe to use this macro from
982  * within an interrupt service routine.
983  *
984  * Items are queued by copy not reference so it is preferable to only
985  * queue small items, especially when called from an ISR.  In most cases
986  * it would be preferable to store a pointer to the item being queued.
987  *
988  * @param xQueue The handle to the queue on which the item is to be posted.
989  *
990  * @param pvItemToQueue A pointer to the item that is to be placed on the
991  * queue.  The size of the items the queue will hold was defined when the
992  * queue was created, so this many bytes will be copied from pvItemToQueue
993  * into the queue storage area.
994  *
995  * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set
996  * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task
997  * to unblock, and the unblocked task has a priority higher than the currently
998  * running task.  If xQueueSendToFromFromISR() sets this value to pdTRUE then
999  * a context switch should be requested before the interrupt is exited.
1000  *
1001  * @return pdTRUE if the data was successfully sent to the queue, otherwise
1002  * errQUEUE_FULL.
1003  *
1004  * Example usage for buffered IO (where the ISR can obtain more than one value
1005  * per call):
1006  * @code{c}
1007  * void vBufferISR( void )
1008  * {
1009  * char cIn;
1010  * BaseType_t xHigherPriorityTaskWoken;
1011  *
1012  *  // We have not woken a task at the start of the ISR.
1013  *  xHigherPriorityTaskWoken = pdFALSE;
1014  *
1015  *  // Loop until the buffer is empty.
1016  *  do
1017  *  {
1018  *      // Obtain a byte from the buffer.
1019  *      cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
1020  *
1021  *      // Post the byte.
1022  *      xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
1023  *
1024  *  } while( portINPUT_BYTE( BUFFER_COUNT ) );
1025  *
1026  *  // Now the buffer is empty we can switch context if necessary.
1027  *  if( xHigherPriorityTaskWoken )
1028  *  {
1029  *      taskYIELD ();
1030  *  }
1031  * }
1032  * @endcode
1033  *
1034  * \defgroup xQueueSendFromISR xQueueSendFromISR
1035  * \ingroup QueueManagement
1036  */
1037 #define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \
1038     xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT )
1039 
1040 
1041 /**
1042  * queue. h
1043  * @code{c}
1044  * BaseType_t xQueueSendToBackFromISR(
1045  *                                       QueueHandle_t xQueue,
1046  *                                       const void *pvItemToQueue,
1047  *                                       BaseType_t *pxHigherPriorityTaskWoken
1048  *                                    );
1049  * @endcode
1050  *
1051  * This is a macro that calls xQueueGenericSendFromISR().
1052  *
1053  * Post an item to the back of a queue.  It is safe to use this macro from
1054  * within an interrupt service routine.
1055  *
1056  * Items are queued by copy not reference so it is preferable to only
1057  * queue small items, especially when called from an ISR.  In most cases
1058  * it would be preferable to store a pointer to the item being queued.
1059  *
1060  * @param xQueue The handle to the queue on which the item is to be posted.
1061  *
1062  * @param pvItemToQueue A pointer to the item that is to be placed on the
1063  * queue.  The size of the items the queue will hold was defined when the
1064  * queue was created, so this many bytes will be copied from pvItemToQueue
1065  * into the queue storage area.
1066  *
1067  * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set
1068  * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task
1069  * to unblock, and the unblocked task has a priority higher than the currently
1070  * running task.  If xQueueSendToBackFromISR() sets this value to pdTRUE then
1071  * a context switch should be requested before the interrupt is exited.
1072  *
1073  * @return pdTRUE if the data was successfully sent to the queue, otherwise
1074  * errQUEUE_FULL.
1075  *
1076  * Example usage for buffered IO (where the ISR can obtain more than one value
1077  * per call):
1078  * @code{c}
1079  * void vBufferISR( void )
1080  * {
1081  * char cIn;
1082  * BaseType_t xHigherPriorityTaskWoken;
1083  *
1084  *  // We have not woken a task at the start of the ISR.
1085  *  xHigherPriorityTaskWoken = pdFALSE;
1086  *
1087  *  // Loop until the buffer is empty.
1088  *  do
1089  *  {
1090  *      // Obtain a byte from the buffer.
1091  *      cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
1092  *
1093  *      // Post the byte.
1094  *      xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
1095  *
1096  *  } while( portINPUT_BYTE( BUFFER_COUNT ) );
1097  *
1098  *  // Now the buffer is empty we can switch context if necessary.
1099  *  if( xHigherPriorityTaskWoken )
1100  *  {
1101  *      taskYIELD ();
1102  *  }
1103  * }
1104  * @endcode
1105  *
1106  * \defgroup xQueueSendFromISR xQueueSendFromISR
1107  * \ingroup QueueManagement
1108  */
1109 #define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \
1110     xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )
1111 
1112 /**
1113  * queue. h
1114  * @code{c}
1115  * BaseType_t xQueueOverwriteFromISR(
1116  *                            QueueHandle_t xQueue,
1117  *                            const void * pvItemToQueue,
1118  *                            BaseType_t *pxHigherPriorityTaskWoken
1119  *                       );
1120  * @endcode
1121  *
1122  * A version of xQueueOverwrite() that can be used in an interrupt service
1123  * routine (ISR).
1124  *
1125  * Only for use with queues that can hold a single item - so the queue is either
1126  * empty or full.
1127  *
1128  * Post an item on a queue.  If the queue is already full then overwrite the
1129  * value held in the queue.  The item is queued by copy, not by reference.
1130  *
1131  * @param xQueue The handle to the queue on which the item is to be posted.
1132  *
1133  * @param pvItemToQueue A pointer to the item that is to be placed on the
1134  * queue.  The size of the items the queue will hold was defined when the
1135  * queue was created, so this many bytes will be copied from pvItemToQueue
1136  * into the queue storage area.
1137  *
1138  * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set
1139  * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task
1140  * to unblock, and the unblocked task has a priority higher than the currently
1141  * running task.  If xQueueOverwriteFromISR() sets this value to pdTRUE then
1142  * a context switch should be requested before the interrupt is exited.
1143  *
1144  * @return xQueueOverwriteFromISR() is a macro that calls
1145  * xQueueGenericSendFromISR(), and therefore has the same return values as
1146  * xQueueSendToFrontFromISR().  However, pdPASS is the only value that can be
1147  * returned because xQueueOverwriteFromISR() will write to the queue even when
1148  * the queue is already full.
1149  *
1150  * Example usage:
1151  * @code{c}
1152  *
1153  * QueueHandle_t xQueue;
1154  *
1155  * void vFunction( void *pvParameters )
1156  * {
1157  *  // Create a queue to hold one uint32_t value.  It is strongly
1158  *  // recommended *not* to use xQueueOverwriteFromISR() on queues that can
1159  *  // contain more than one value, and doing so will trigger an assertion
1160  *  // if configASSERT() is defined.
1161  *  xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
1162  * }
1163  *
1164  * void vAnInterruptHandler( void )
1165  * {
1166  * // xHigherPriorityTaskWoken must be set to pdFALSE before it is used.
1167  * BaseType_t xHigherPriorityTaskWoken = pdFALSE;
1168  * uint32_t ulVarToSend, ulValReceived;
1169  *
1170  *  // Write the value 10 to the queue using xQueueOverwriteFromISR().
1171  *  ulVarToSend = 10;
1172  *  xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
1173  *
1174  *  // The queue is full, but calling xQueueOverwriteFromISR() again will still
1175  *  // pass because the value held in the queue will be overwritten with the
1176  *  // new value.
1177  *  ulVarToSend = 100;
1178  *  xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
1179  *
1180  *  // Reading from the queue will now return 100.
1181  *
1182  *  // ...
1183  *
1184  *  if( xHigherPrioritytaskWoken == pdTRUE )
1185  *  {
1186  *      // Writing to the queue caused a task to unblock and the unblocked task
1187  *      // has a priority higher than or equal to the priority of the currently
1188  *      // executing task (the task this interrupt interrupted).  Perform a context
1189  *      // switch so this interrupt returns directly to the unblocked task.
1190  *      portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port.
1191  *  }
1192  * }
1193  * @endcode
1194  * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR
1195  * \ingroup QueueManagement
1196  */
1197 #define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \
1198     xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE )
1199 
1200 /**
1201  * queue. h
1202  * @code{c}
1203  * BaseType_t xQueueSendFromISR(
1204  *                                   QueueHandle_t xQueue,
1205  *                                   const void *pvItemToQueue,
1206  *                                   BaseType_t *pxHigherPriorityTaskWoken
1207  *                              );
1208  * @endcode
1209  *
1210  * This is a macro that calls xQueueGenericSendFromISR().  It is included
1211  * for backward compatibility with versions of FreeRTOS.org that did not
1212  * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR()
1213  * macros.
1214  *
1215  * Post an item to the back of a queue.  It is safe to use this function from
1216  * within an interrupt service routine.
1217  *
1218  * Items are queued by copy not reference so it is preferable to only
1219  * queue small items, especially when called from an ISR.  In most cases
1220  * it would be preferable to store a pointer to the item being queued.
1221  *
1222  * @param xQueue The handle to the queue on which the item is to be posted.
1223  *
1224  * @param pvItemToQueue A pointer to the item that is to be placed on the
1225  * queue.  The size of the items the queue will hold was defined when the
1226  * queue was created, so this many bytes will be copied from pvItemToQueue
1227  * into the queue storage area.
1228  *
1229  * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set
1230  * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task
1231  * to unblock, and the unblocked task has a priority higher than the currently
1232  * running task.  If xQueueSendFromISR() sets this value to pdTRUE then
1233  * a context switch should be requested before the interrupt is exited.
1234  *
1235  * @return pdTRUE if the data was successfully sent to the queue, otherwise
1236  * errQUEUE_FULL.
1237  *
1238  * Example usage for buffered IO (where the ISR can obtain more than one value
1239  * per call):
1240  * @code{c}
1241  * void vBufferISR( void )
1242  * {
1243  * char cIn;
1244  * BaseType_t xHigherPriorityTaskWoken;
1245  *
1246  *  // We have not woken a task at the start of the ISR.
1247  *  xHigherPriorityTaskWoken = pdFALSE;
1248  *
1249  *  // Loop until the buffer is empty.
1250  *  do
1251  *  {
1252  *      // Obtain a byte from the buffer.
1253  *      cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
1254  *
1255  *      // Post the byte.
1256  *      xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
1257  *
1258  *  } while( portINPUT_BYTE( BUFFER_COUNT ) );
1259  *
1260  *  // Now the buffer is empty we can switch context if necessary.
1261  *  if( xHigherPriorityTaskWoken )
1262  *  {
1263  *      // Actual macro used here is port specific.
1264  *      portYIELD_FROM_ISR ();
1265  *  }
1266  * }
1267  * @endcode
1268  *
1269  * \defgroup xQueueSendFromISR xQueueSendFromISR
1270  * \ingroup QueueManagement
1271  */
1272 #define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \
1273     xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )
1274 
1275 /**
1276  * queue. h
1277  * @code{c}
1278  * BaseType_t xQueueGenericSendFromISR(
1279  *                                         QueueHandle_t    xQueue,
1280  *                                         const    void    *pvItemToQueue,
1281  *                                         BaseType_t  *pxHigherPriorityTaskWoken,
1282  *                                         BaseType_t  xCopyPosition
1283  *                                     );
1284  * @endcode
1285  *
1286  * It is preferred that the macros xQueueSendFromISR(),
1287  * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place
1288  * of calling this function directly.  xQueueGiveFromISR() is an
1289  * equivalent for use by semaphores that don't actually copy any data.
1290  *
1291  * Post an item on a queue.  It is safe to use this function from within an
1292  * interrupt service routine.
1293  *
1294  * Items are queued by copy not reference so it is preferable to only
1295  * queue small items, especially when called from an ISR.  In most cases
1296  * it would be preferable to store a pointer to the item being queued.
1297  *
1298  * @param xQueue The handle to the queue on which the item is to be posted.
1299  *
1300  * @param pvItemToQueue A pointer to the item that is to be placed on the
1301  * queue.  The size of the items the queue will hold was defined when the
1302  * queue was created, so this many bytes will be copied from pvItemToQueue
1303  * into the queue storage area.
1304  *
1305  * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set
1306  * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task
1307  * to unblock, and the unblocked task has a priority higher than the currently
1308  * running task.  If xQueueGenericSendFromISR() sets this value to pdTRUE then
1309  * a context switch should be requested before the interrupt is exited.
1310  *
1311  * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the
1312  * item at the back of the queue, or queueSEND_TO_FRONT to place the item
1313  * at the front of the queue (for high priority messages).
1314  *
1315  * @return pdTRUE if the data was successfully sent to the queue, otherwise
1316  * errQUEUE_FULL.
1317  *
1318  * Example usage for buffered IO (where the ISR can obtain more than one value
1319  * per call):
1320  * @code{c}
1321  * void vBufferISR( void )
1322  * {
1323  * char cIn;
1324  * BaseType_t xHigherPriorityTaskWokenByPost;
1325  *
1326  *  // We have not woken a task at the start of the ISR.
1327  *  xHigherPriorityTaskWokenByPost = pdFALSE;
1328  *
1329  *  // Loop until the buffer is empty.
1330  *  do
1331  *  {
1332  *      // Obtain a byte from the buffer.
1333  *      cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
1334  *
1335  *      // Post each byte.
1336  *      xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );
1337  *
1338  *  } while( portINPUT_BYTE( BUFFER_COUNT ) );
1339  *
1340  *  // Now the buffer is empty we can switch context if necessary.  Note that the
1341  *  // name of the yield function required is port specific.
1342  *  if( xHigherPriorityTaskWokenByPost )
1343  *  {
1344  *      portYIELD_FROM_ISR();
1345  *  }
1346  * }
1347  * @endcode
1348  *
1349  * \defgroup xQueueSendFromISR xQueueSendFromISR
1350  * \ingroup QueueManagement
1351  */
1352 BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue,
1353                                      const void * const pvItemToQueue,
1354                                      BaseType_t * const pxHigherPriorityTaskWoken,
1355                                      const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION;
1356 BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue,
1357                               BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
1358 
1359 /**
1360  * queue. h
1361  * @code{c}
1362  * BaseType_t xQueueReceiveFromISR(
1363  *                                     QueueHandle_t    xQueue,
1364  *                                     void             *pvBuffer,
1365  *                                     BaseType_t       *pxTaskWoken
1366  *                                 );
1367  * @endcode
1368  *
1369  * Receive an item from a queue.  It is safe to use this function from within an
1370  * interrupt service routine.
1371  *
1372  * @param xQueue The handle to the queue from which the item is to be
1373  * received.
1374  *
1375  * @param pvBuffer Pointer to the buffer into which the received item will
1376  * be copied.
1377  *
1378  * @param pxHigherPriorityTaskWoken A task may be blocked waiting for space to
1379  * become available on the queue.  If xQueueReceiveFromISR causes such a task
1380  * to unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will
1381  * remain unchanged.
1382  *
1383  * @return pdTRUE if an item was successfully received from the queue,
1384  * otherwise pdFALSE.
1385  *
1386  * Example usage:
1387  * @code{c}
1388  *
1389  * QueueHandle_t xQueue;
1390  *
1391  * // Function to create a queue and post some values.
1392  * void vAFunction( void *pvParameters )
1393  * {
1394  * char cValueToPost;
1395  * const TickType_t xTicksToWait = ( TickType_t )0xff;
1396  *
1397  *  // Create a queue capable of containing 10 characters.
1398  *  xQueue = xQueueCreate( 10, sizeof( char ) );
1399  *  if( xQueue == 0 )
1400  *  {
1401  *      // Failed to create the queue.
1402  *  }
1403  *
1404  *  // ...
1405  *
1406  *  // Post some characters that will be used within an ISR.  If the queue
1407  *  // is full then this task will block for xTicksToWait ticks.
1408  *  cValueToPost = 'a';
1409  *  xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
1410  *  cValueToPost = 'b';
1411  *  xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
1412  *
1413  *  // ... keep posting characters ... this task may block when the queue
1414  *  // becomes full.
1415  *
1416  *  cValueToPost = 'c';
1417  *  xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
1418  * }
1419  *
1420  * // ISR that outputs all the characters received on the queue.
1421  * void vISR_Routine( void )
1422  * {
1423  * BaseType_t xTaskWokenByReceive = pdFALSE;
1424  * char cRxedChar;
1425  *
1426  *  while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
1427  *  {
1428  *      // A character was received.  Output the character now.
1429  *      vOutputCharacter( cRxedChar );
1430  *
1431  *      // If removing the character from the queue woke the task that was
1432  *      // posting onto the queue xTaskWokenByReceive will have been set to
1433  *      // pdTRUE.  No matter how many times this loop iterates only one
1434  *      // task will be woken.
1435  *  }
1436  *
1437  *  if( xTaskWokenByReceive != ( char ) pdFALSE;
1438  *  {
1439  *      taskYIELD ();
1440  *  }
1441  * }
1442  * @endcode
1443  * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR
1444  * \ingroup QueueManagement
1445  */
1446 BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue,
1447                                  void * const pvBuffer,
1448                                  BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
1449 
1450 /*
1451  * Utilities to query queues that are safe to use from an ISR.  These utilities
1452  * should be used only from within an ISR, or within a critical section.
1453  */
1454 BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
1455 BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
1456 UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
1457 
1458 /*
1459  * The functions defined above are for passing data to and from tasks.  The
1460  * functions below are the equivalents for passing data to and from
1461  * co-routines.
1462  *
1463  * These functions are called from the co-routine macro implementation and
1464  * should not be called directly from application code.  Instead use the macro
1465  * wrappers defined within croutine.h.
1466  */
1467 BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue,
1468                                 const void * pvItemToQueue,
1469                                 BaseType_t xCoRoutinePreviouslyWoken );
1470 BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue,
1471                                    void * pvBuffer,
1472                                    BaseType_t * pxTaskWoken );
1473 BaseType_t xQueueCRSend( QueueHandle_t xQueue,
1474                          const void * pvItemToQueue,
1475                          TickType_t xTicksToWait );
1476 BaseType_t xQueueCRReceive( QueueHandle_t xQueue,
1477                             void * pvBuffer,
1478                             TickType_t xTicksToWait );
1479 
1480 /*
1481  * For internal use only.  Use xSemaphoreCreateMutex(),
1482  * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling
1483  * these functions directly.
1484  */
1485 QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;
1486 QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType,
1487                                        StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION;
1488 QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount,
1489                                              const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION;
1490 QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount,
1491                                                    const UBaseType_t uxInitialCount,
1492                                                    StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION;
1493 BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue,
1494                                 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
1495 TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;
1496 TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;
1497 
1498 /*
1499  * For internal use only.  Use xSemaphoreTakeMutexRecursive() or
1500  * xSemaphoreGiveMutexRecursive() instead of calling these functions directly.
1501  */
1502 BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex,
1503                                      TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
1504 BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION;
1505 
1506 /*
1507  * Reset a queue back to its original empty state.  The return value is now
1508  * obsolete and is always set to pdPASS.
1509  */
1510 #define xQueueReset( xQueue )    xQueueGenericReset( ( xQueue ), pdFALSE )
1511 
1512 /*
1513  * The registry is provided as a means for kernel aware debuggers to
1514  * locate queues, semaphores and mutexes.  Call vQueueAddToRegistry() add
1515  * a queue, semaphore or mutex handle to the registry if you want the handle
1516  * to be available to a kernel aware debugger.  If you are not using a kernel
1517  * aware debugger then this function can be ignored.
1518  *
1519  * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the
1520  * registry can hold.  configQUEUE_REGISTRY_SIZE must be greater than 0
1521  * within FreeRTOSConfig.h for the registry to be available.  Its value
1522  * does not affect the number of queues, semaphores and mutexes that can be
1523  * created - just the number that the registry can hold.
1524  *
1525  * If vQueueAddToRegistry is called more than once with the same xQueue
1526  * parameter, the registry will store the pcQueueName parameter from the
1527  * most recent call to vQueueAddToRegistry.
1528  *
1529  * @param xQueue The handle of the queue being added to the registry.  This
1530  * is the handle returned by a call to xQueueCreate().  Semaphore and mutex
1531  * handles can also be passed in here.
1532  *
1533  * @param pcQueueName The name to be associated with the handle.  This is the
1534  * name that the kernel aware debugger will display.  The queue registry only
1535  * stores a pointer to the string - so the string must be persistent (global or
1536  * preferably in ROM/Flash), not on the stack.
1537  */
1538 #if ( configQUEUE_REGISTRY_SIZE > 0 )
1539     void vQueueAddToRegistry( QueueHandle_t xQueue,
1540                               const char * pcQueueName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
1541 #endif
1542 
1543 /*
1544  * The registry is provided as a means for kernel aware debuggers to
1545  * locate queues, semaphores and mutexes.  Call vQueueAddToRegistry() add
1546  * a queue, semaphore or mutex handle to the registry if you want the handle
1547  * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to
1548  * remove the queue, semaphore or mutex from the register.  If you are not using
1549  * a kernel aware debugger then this function can be ignored.
1550  *
1551  * @param xQueue The handle of the queue being removed from the registry.
1552  */
1553 #if ( configQUEUE_REGISTRY_SIZE > 0 )
1554     void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
1555 #endif
1556 
1557 /*
1558  * The queue registry is provided as a means for kernel aware debuggers to
1559  * locate queues, semaphores and mutexes.  Call pcQueueGetName() to look
1560  * up and return the name of a queue in the queue registry from the queue's
1561  * handle.
1562  *
1563  * @param xQueue The handle of the queue the name of which will be returned.
1564  * @return If the queue is in the registry then a pointer to the name of the
1565  * queue is returned.  If the queue is not in the registry then NULL is
1566  * returned.
1567  */
1568 #if ( configQUEUE_REGISTRY_SIZE > 0 )
1569     const char * pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
1570 #endif
1571 
1572 /*
1573  * Generic version of the function used to create a queue using dynamic memory
1574  * allocation.  This is called by other functions and macros that create other
1575  * RTOS objects that use the queue structure as their base.
1576  */
1577 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
1578     QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength,
1579                                        const UBaseType_t uxItemSize,
1580                                        const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;
1581 #endif
1582 
1583 /*
1584  * Generic version of the function used to create a queue using dynamic memory
1585  * allocation.  This is called by other functions and macros that create other
1586  * RTOS objects that use the queue structure as their base.
1587  */
1588 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
1589     QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,
1590                                              const UBaseType_t uxItemSize,
1591                                              uint8_t * pucQueueStorage,
1592                                              StaticQueue_t * pxStaticQueue,
1593                                              const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;
1594 #endif
1595 
1596 /*
1597  * Generic version of the function used to retrieve the buffers of statically
1598  * created queues. This is called by other functions and macros that retrieve
1599  * the buffers of other statically created RTOS objects that use the queue
1600  * structure as their base.
1601  */
1602 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
1603     BaseType_t xQueueGenericGetStaticBuffers( QueueHandle_t xQueue,
1604                                               uint8_t ** ppucQueueStorage,
1605                                               StaticQueue_t ** ppxStaticQueue ) PRIVILEGED_FUNCTION;
1606 #endif
1607 
1608 /*
1609  * Queue sets provide a mechanism to allow a task to block (pend) on a read
1610  * operation from multiple queues or semaphores simultaneously.
1611  *
1612  * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this
1613  * function.
1614  *
1615  * A queue set must be explicitly created using a call to xQueueCreateSet()
1616  * before it can be used.  Once created, standard FreeRTOS queues and semaphores
1617  * can be added to the set using calls to xQueueAddToSet().
1618  * xQueueSelectFromSet() is then used to determine which, if any, of the queues
1619  * or semaphores contained in the set is in a state where a queue read or
1620  * semaphore take operation would be successful.
1621  *
1622  * Note 1:  See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html
1623  * for reasons why queue sets are very rarely needed in practice as there are
1624  * simpler methods of blocking on multiple objects.
1625  *
1626  * Note 2:  Blocking on a queue set that contains a mutex will not cause the
1627  * mutex holder to inherit the priority of the blocked task.
1628  *
1629  * Note 3:  An additional 4 bytes of RAM is required for each space in a every
1630  * queue added to a queue set.  Therefore counting semaphores that have a high
1631  * maximum count value should not be added to a queue set.
1632  *
1633  * Note 4:  A receive (in the case of a queue) or take (in the case of a
1634  * semaphore) operation must not be performed on a member of a queue set unless
1635  * a call to xQueueSelectFromSet() has first returned a handle to that set member.
1636  *
1637  * @param uxEventQueueLength Queue sets store events that occur on
1638  * the queues and semaphores contained in the set.  uxEventQueueLength specifies
1639  * the maximum number of events that can be queued at once.  To be absolutely
1640  * certain that events are not lost uxEventQueueLength should be set to the
1641  * total sum of the length of the queues added to the set, where binary
1642  * semaphores and mutexes have a length of 1, and counting semaphores have a
1643  * length set by their maximum count value.  Examples:
1644  *  + If a queue set is to hold a queue of length 5, another queue of length 12,
1645  *    and a binary semaphore, then uxEventQueueLength should be set to
1646  *    (5 + 12 + 1), or 18.
1647  *  + If a queue set is to hold three binary semaphores then uxEventQueueLength
1648  *    should be set to (1 + 1 + 1 ), or 3.
1649  *  + If a queue set is to hold a counting semaphore that has a maximum count of
1650  *    5, and a counting semaphore that has a maximum count of 3, then
1651  *    uxEventQueueLength should be set to (5 + 3), or 8.
1652  *
1653  * @return If the queue set is created successfully then a handle to the created
1654  * queue set is returned.  Otherwise NULL is returned.
1655  */
1656 QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION;
1657 
1658 /*
1659  * Adds a queue or semaphore to a queue set that was previously created by a
1660  * call to xQueueCreateSet().
1661  *
1662  * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this
1663  * function.
1664  *
1665  * Note 1:  A receive (in the case of a queue) or take (in the case of a
1666  * semaphore) operation must not be performed on a member of a queue set unless
1667  * a call to xQueueSelectFromSet() has first returned a handle to that set member.
1668  *
1669  * @param xQueueOrSemaphore The handle of the queue or semaphore being added to
1670  * the queue set (cast to an QueueSetMemberHandle_t type).
1671  *
1672  * @param xQueueSet The handle of the queue set to which the queue or semaphore
1673  * is being added.
1674  *
1675  * @return If the queue or semaphore was successfully added to the queue set
1676  * then pdPASS is returned.  If the queue could not be successfully added to the
1677  * queue set because it is already a member of a different queue set then pdFAIL
1678  * is returned.
1679  */
1680 BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,
1681                            QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;
1682 
1683 /*
1684  * Removes a queue or semaphore from a queue set.  A queue or semaphore can only
1685  * be removed from a set if the queue or semaphore is empty.
1686  *
1687  * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this
1688  * function.
1689  *
1690  * @param xQueueOrSemaphore The handle of the queue or semaphore being removed
1691  * from the queue set (cast to an QueueSetMemberHandle_t type).
1692  *
1693  * @param xQueueSet The handle of the queue set in which the queue or semaphore
1694  * is included.
1695  *
1696  * @return If the queue or semaphore was successfully removed from the queue set
1697  * then pdPASS is returned.  If the queue was not in the queue set, or the
1698  * queue (or semaphore) was not empty, then pdFAIL is returned.
1699  */
1700 BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,
1701                                 QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;
1702 
1703 /*
1704  * xQueueSelectFromSet() selects from the members of a queue set a queue or
1705  * semaphore that either contains data (in the case of a queue) or is available
1706  * to take (in the case of a semaphore).  xQueueSelectFromSet() effectively
1707  * allows a task to block (pend) on a read operation on all the queues and
1708  * semaphores in a queue set simultaneously.
1709  *
1710  * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this
1711  * function.
1712  *
1713  * Note 1:  See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html
1714  * for reasons why queue sets are very rarely needed in practice as there are
1715  * simpler methods of blocking on multiple objects.
1716  *
1717  * Note 2:  Blocking on a queue set that contains a mutex will not cause the
1718  * mutex holder to inherit the priority of the blocked task.
1719  *
1720  * Note 3:  A receive (in the case of a queue) or take (in the case of a
1721  * semaphore) operation must not be performed on a member of a queue set unless
1722  * a call to xQueueSelectFromSet() has first returned a handle to that set member.
1723  *
1724  * @param xQueueSet The queue set on which the task will (potentially) block.
1725  *
1726  * @param xTicksToWait The maximum time, in ticks, that the calling task will
1727  * remain in the Blocked state (with other tasks executing) to wait for a member
1728  * of the queue set to be ready for a successful queue read or semaphore take
1729  * operation.
1730  *
1731  * @return xQueueSelectFromSet() will return the handle of a queue (cast to
1732  * a QueueSetMemberHandle_t type) contained in the queue set that contains data,
1733  * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained
1734  * in the queue set that is available, or NULL if no such queue or semaphore
1735  * exists before before the specified block time expires.
1736  */
1737 QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet,
1738                                             const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
1739 
1740 /*
1741  * A version of xQueueSelectFromSet() that can be used from an ISR.
1742  */
1743 QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;
1744 
1745 /* Not public API functions. */
1746 void vQueueWaitForMessageRestricted( QueueHandle_t xQueue,
1747                                      TickType_t xTicksToWait,
1748                                      const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION;
1749 BaseType_t xQueueGenericReset( QueueHandle_t xQueue,
1750                                BaseType_t xNewQueue ) PRIVILEGED_FUNCTION;
1751 void vQueueSetQueueNumber( QueueHandle_t xQueue,
1752                            UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION;
1753 UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
1754 uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
1755 UBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
1756 UBaseType_t uxQueueGetQueueLength( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
1757 
1758 /* *INDENT-OFF* */
1759 #ifdef __cplusplus
1760     }
1761 #endif
1762 /* *INDENT-ON* */
1763 
1764 #endif /* QUEUE_H */
1765