]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/include/queue.h
Ensure queue functions go into the privileged code section when the MPU version is...
[freertos] / FreeRTOS / Source / include / queue.h
index b9452662cf5883a2bdab926513436653ec4414f2..f2787f0bad29e213498aaf3e7a9a00e3d1c63b51 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V7.3.0 - Copyright (C) 2012 Real Time Engineers Ltd.\r
+    FreeRTOS V7.4.2 - Copyright (C) 2013 Real Time Engineers Ltd.\r
 \r
     FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME.  PLEASE VISIT\r
     http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
     FreeRTOS is free software; you can redistribute it and/or modify it under\r
     the terms of the GNU General Public License (version 2) as published by the\r
     Free Software Foundation AND MODIFIED BY the FreeRTOS exception.\r
-    >>>NOTE<<< The modification to the GPL is included to allow you to\r
+\r
+    >>>>>>NOTE<<<<<< The modification to the GPL is included to allow you to\r
     distribute a combined work that includes FreeRTOS without being obliged to\r
     provide the source code for proprietary components outside of the FreeRTOS\r
-    kernel.  FreeRTOS is distributed in the hope that it will be useful, but\r
-    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
-    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
-    more details. You should have received a copy of the GNU General Public\r
-    License and the FreeRTOS license exception along with FreeRTOS; if not it\r
-    can be viewed here: http://www.freertos.org/a00114.html and also obtained\r
-    by writing to Richard Barry, contact details for whom are available on the\r
-    FreeRTOS WEB site.\r
+    kernel.\r
+\r
+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\r
+    details. You should have received a copy of the GNU General Public License\r
+    and the FreeRTOS license exception along with FreeRTOS; if not it can be\r
+    viewed here: http://www.freertos.org/a00114.html and also obtained by\r
+    writing to Real Time Engineers Ltd., contact details for whom are available\r
+    on the FreeRTOS WEB site.\r
 \r
     1 tab == 4 spaces!\r
 \r
     ***************************************************************************\r
 \r
 \r
-    http://www.FreeRTOS.org - Documentation, training, latest versions, license\r
-    and contact details.\r
+    http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
+    license and Real Time Engineers Ltd. contact details.\r
 \r
     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
-    including FreeRTOS+Trace - an indispensable productivity tool.\r
+    including FreeRTOS+Trace - an indispensable productivity tool, and our new\r
+    fully thread aware and reentrant UDP/IP stack.\r
+\r
+    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
+    Integrity Systems, who sell the code with commercial support,\r
+    indemnification and middleware, under the OpenRTOS brand.\r
 \r
-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell\r
-    the code with commercial support, indemnification, and middleware, under\r
-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also\r
-    provide a safety engineered and independently SIL3 certified version under\r
-    the SafeRTOS brand: http://www.SafeRTOS.com.\r
+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
+    engineered and independently SIL3 certified version for use in safety and\r
+    mission critical applications that require provable dependability.\r
 */\r
 \r
 \r
@@ -90,17 +96,25 @@ typedef void * xQueueHandle;
 \r
 /**\r
  * Type by which queue sets are referenced.  For example, a call to\r
- * xQueueSetCreate() returns an xQueueSet variable that can then be used as a\r
- * parameter to xQueueReadMultiple(), xQueueAddToQueueSet(), etc.\r
+ * xQueueCreateSet() returns an xQueueSet variable that can then be used as a\r
+ * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc.\r
  */\r
 typedef void * xQueueSetHandle;\r
 \r
+/**\r
+ * Queue sets can contain both queues and semaphores, so the\r
+ * xQueueSetMemberHandle is defined as a type to be used where a parameter or\r
+ * return value can be either an xQueueHandle or an xSemaphoreHandle.\r
+ */\r
+typedef void * xQueueSetMemberHandle;\r
+\r
 /* For internal use only. */\r
 #define        queueSEND_TO_BACK       ( 0 )\r
 #define        queueSEND_TO_FRONT      ( 1 )\r
 \r
 /* For internal use only.  These definitions *must* match those in queue.c. */\r
 #define queueQUEUE_TYPE_BASE                           ( 0U )\r
+#define queueQUEUE_TYPE_SET                                    ( 0U )\r
 #define queueQUEUE_TYPE_MUTEX                          ( 1U )\r
 #define queueQUEUE_TYPE_COUNTING_SEMAPHORE     ( 2U )\r
 #define queueQUEUE_TYPE_BINARY_SEMAPHORE       ( 3U )\r
@@ -498,7 +512,7 @@ typedef void * xQueueSetHandle;
  * \defgroup xQueueSend xQueueSend\r
  * \ingroup QueueManagement\r
  */\r
-signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition );\r
+signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION;\r
 \r
 /**\r
  * queue. h\r
@@ -521,7 +535,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const
  *\r
  * This macro must not be used in an interrupt service routine.\r
  *\r
- * @param pxQueue The handle to the queue from which the item is to be\r
+ * @param xQueue The handle to the queue from which the item is to be\r
  * received.\r
  *\r
  * @param pvBuffer Pointer to the buffer into which the received item will\r
@@ -614,7 +628,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const
  * This function must not be used in an interrupt service routine.  See\r
  * xQueueReceiveFromISR for an alternative that can.\r
  *\r
- * @param pxQueue The handle to the queue from which the item is to be\r
+ * @param xQueue The handle to the queue from which the item is to be\r
  * received.\r
  *\r
  * @param pvBuffer Pointer to the buffer into which the received item will\r
@@ -708,7 +722,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const
  * This function must not be used in an interrupt service routine.  See\r
  * xQueueReceiveFromISR for an alternative that can.\r
  *\r
- * @param pxQueue The handle to the queue from which the item is to be\r
+ * @param xQueue The handle to the queue from which the item is to be\r
  * received.\r
  *\r
  * @param pvBuffer Pointer to the buffer into which the received item will\r
@@ -784,7 +798,7 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const
  * \defgroup xQueueReceive xQueueReceive\r
  * \ingroup QueueManagement\r
  */\r
-signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek );\r
+signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek ) PRIVILEGED_FUNCTION;\r
 \r
 /**\r
  * queue. h\r
@@ -799,7 +813,7 @@ signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvB
  * \page uxQueueMessagesWaiting uxQueueMessagesWaiting\r
  * \ingroup QueueManagement\r
  */\r
-unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );\r
+unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
 \r
 /**\r
  * queue. h\r
@@ -813,13 +827,13 @@ unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );
  * \page vQueueDelete vQueueDelete\r
  * \ingroup QueueManagement\r
  */\r
-void vQueueDelete( xQueueHandle pxQueue );\r
+void vQueueDelete( xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
 \r
 /**\r
  * queue. h\r
  * <pre>\r
  portBASE_TYPE xQueueSendToFrontFromISR(\r
-                                                                                xQueueHandle pxQueue,\r
+                                                                                xQueueHandle xQueue,\r
                                                                                 const void *pvItemToQueue,\r
                                                                                 portBASE_TYPE *pxHigherPriorityTaskWoken\r
                                                                          );\r
@@ -883,14 +897,14 @@ void vQueueDelete( xQueueHandle pxQueue );
  * \defgroup xQueueSendFromISR xQueueSendFromISR\r
  * \ingroup QueueManagement\r
  */\r
-#define xQueueSendToFrontFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT )\r
+#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT )\r
 \r
 \r
 /**\r
  * queue. h\r
  * <pre>\r
  portBASE_TYPE xQueueSendToBackFromISR(\r
-                                                                                xQueueHandle pxQueue,\r
+                                                                                xQueueHandle xQueue,\r
                                                                                 const void *pvItemToQueue,\r
                                                                                 portBASE_TYPE *pxHigherPriorityTaskWoken\r
                                                                          );\r
@@ -954,13 +968,13 @@ void vQueueDelete( xQueueHandle pxQueue );
  * \defgroup xQueueSendFromISR xQueueSendFromISR\r
  * \ingroup QueueManagement\r
  */\r
-#define xQueueSendToBackFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )\r
+#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )\r
 \r
 /**\r
  * queue. h\r
  * <pre>\r
  portBASE_TYPE xQueueSendFromISR(\r
-                                                                        xQueueHandle pxQueue,\r
+                                                                        xQueueHandle xQueue,\r
                                                                         const void *pvItemToQueue,\r
                                                                         portBASE_TYPE *pxHigherPriorityTaskWoken\r
                                                                );\r
@@ -1028,13 +1042,13 @@ void vQueueDelete( xQueueHandle pxQueue );
  * \defgroup xQueueSendFromISR xQueueSendFromISR\r
  * \ingroup QueueManagement\r
  */\r
-#define xQueueSendFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )\r
+#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )\r
 \r
 /**\r
  * queue. h\r
  * <pre>\r
  portBASE_TYPE xQueueGenericSendFromISR(\r
-                                                                                  xQueueHandle pxQueue,\r
+                                                                                  xQueueHandle         xQueue,\r
                                                                                   const        void    *pvItemToQueue,\r
                                                                                   portBASE_TYPE        *pxHigherPriorityTaskWoken,\r
                                                                                   portBASE_TYPE        xCopyPosition\r
@@ -1106,22 +1120,22 @@ void vQueueDelete( xQueueHandle pxQueue );
  * \defgroup xQueueSendFromISR xQueueSendFromISR\r
  * \ingroup QueueManagement\r
  */\r
-signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition );\r
+signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle xQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION;\r
 \r
 /**\r
  * queue. h\r
  * <pre>\r
  portBASE_TYPE xQueueReceiveFromISR(\r
-                                                                          xQueueHandle pxQueue,\r
+                                                                          xQueueHandle xQueue,\r
                                                                           void *pvBuffer,\r
-                                                                          portBASE_TYPE        *pxTaskWoken\r
+                                                                          portBASE_TYPE *pxTaskWoken\r
                                                                   );\r
  * </pre>\r
  *\r
  * Receive an item from a queue.  It is safe to use this function from within an\r
  * interrupt service routine.\r
  *\r
- * @param pxQueue The handle to the queue from which the item is to be\r
+ * @param xQueue The handle to the queue from which the item is to be\r
  * received.\r
  *\r
  * @param pvBuffer Pointer to the buffer into which the received item will\r
@@ -1195,15 +1209,15 @@ signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void
  * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR\r
  * \ingroup QueueManagement\r
  */\r
-signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken );\r
+signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle xQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
  * Utilities to query queues that are safe to use from an ISR.  These utilities\r
  * should be used only from witin an ISR, or within a critical section.\r
  */\r
-signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue );\r
-signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue );\r
-unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue );\r
+signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
+signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
+unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
 \r
 \r
 /*\r
@@ -1220,8 +1234,8 @@ unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue
  * responsiveness to gain execution speed, whereas the fully featured API\r
  * sacrifices execution speed to ensure better interrupt responsiveness.\r
  */\r
-signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition );\r
-signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking );\r
+signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition );\r
+signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking );\r
 #define xQueueAltSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT )\r
 #define xQueueAltSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )\r
 #define xQueueAltReceive( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE )\r
@@ -1236,26 +1250,26 @@ signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const
  * should not be called directly from application code.  Instead use the macro\r
  * wrappers defined within croutine.h.\r
  */\r
-signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken );\r
-signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken );\r
-signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait );\r
-signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait );\r
+signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle xQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken );\r
+signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle xQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken );\r
+signed portBASE_TYPE xQueueCRSend( xQueueHandle xQueue, const void *pvItemToQueue, portTickType xTicksToWait );\r
+signed portBASE_TYPE xQueueCRReceive( xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait );\r
 \r
 /*\r
  * For internal use only.  Use xSemaphoreCreateMutex(),\r
  * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling\r
  * these functions directly.\r
  */\r
-xQueueHandle xQueueCreateMutex( unsigned char ucQueueType );\r
-xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount );\r
-void* xQueueGetMutexHolder( xQueueHandle xSemaphore );\r
+xQueueHandle xQueueCreateMutex( unsigned char ucQueueType ) PRIVILEGED_FUNCTION;\r
+xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) PRIVILEGED_FUNCTION;\r
+void* xQueueGetMutexHolder( xQueueHandle xSemaphore ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
  * For internal use only.  Use xSemaphoreTakeMutexRecursive() or\r
  * xSemaphoreGiveMutexRecursive() instead of calling these functions directly.\r
  */\r
-portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime );\r
-portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex );\r
+portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ) PRIVILEGED_FUNCTION;\r
+portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
  * Reset a queue back to its original empty state.  pdPASS is returned if the\r
@@ -1263,7 +1277,7 @@ portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex );
  * reset because there are tasks blocked on the queue waiting to either\r
  * receive from the queue or send to the queue.\r
  */\r
-#define xQueueReset( pxQueue ) xQueueGenericReset( pxQueue, pdFALSE )\r
+#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE )\r
 \r
 /*\r
  * The registry is provided as a means for kernel aware debuggers to\r
@@ -1286,14 +1300,28 @@ portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex );
  * name that the kernel aware debugger will display.\r
  */\r
 #if configQUEUE_REGISTRY_SIZE > 0U\r
-       void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName );\r
+       void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName ) PRIVILEGED_FUNCTION;\r
+#endif\r
+\r
+/*\r
+ * The registry is provided as a means for kernel aware debuggers to\r
+ * locate queues, semaphores and mutexes.  Call vQueueAddToRegistry() add\r
+ * a queue, semaphore or mutex handle to the registry if you want the handle\r
+ * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to\r
+ * remove the queue, semaphore or mutex from the register.  If you are not using\r
+ * a kernel aware debugger then this function can be ignored.\r
+ *\r
+ * @param xQueue The handle of the queue being removed from the registry.\r
+ */\r
+#if configQUEUE_REGISTRY_SIZE > 0U\r
+       void vQueueUnregisterQueue( xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
 #endif\r
 \r
 /*\r
  * Generic version of the queue creation function, which is in turn called by\r
  * any queue, semaphore or mutex creation function or macro.\r
  */\r
-xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType );\r
+xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
  * Queue sets provide a mechanism to allow a task to block (pend) on a read\r
@@ -1302,26 +1330,29 @@ xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned
  * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this\r
  * function.\r
  *\r
- * A queue set must be explicitly created using a call to xQueueSetCreate()\r
+ * A queue set must be explicitly created using a call to xQueueCreateSet()\r
  * before it can be used.  Once created, standard FreeRTOS queues and semaphores\r
- * can be added to the set using calls to xQueueAddToQueueSet().\r
- * xQueueReadMultiple() is then used to determine which, if any, of the queues\r
+ * can be added to the set using calls to xQueueAddToSet().\r
+ * xQueueSelectFromSet() is then used to determine which, if any, of the queues\r
  * or semaphores contained in the set is in a state where a queue read or\r
  * semaphore take operation would be successful.\r
  *\r
- * Note 1:  See the documentation on http://wwwFreeRTOS.org for reasons why\r
- * queue sets are very rarely needed in practice as there are simpler\r
- * alternatives.  Queue sets are provided to allow FreeRTOS to be integrated\r
- * with legacy third party driver code.\r
+ * Note 1:  See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html\r
+ * for reasons why queue sets are very rarely needed in practice as there are\r
+ * simpler methods of blocking on multiple objects.\r
  *\r
  * Note 2:  Blocking on a queue set that contains a mutex will not cause the\r
  * mutex holder to inherit the priority of the blocked task.\r
  *\r
  * Note 3:  An additional 4 bytes of RAM is required for each space in a every\r
- * queue added to a queue set.  Therefore counting semaphores with large maximum\r
- * counts should not be added to queue sets.\r
+ * queue added to a queue set.  Therefore counting semaphores that have a high\r
+ * maximum count value should not be added to a queue set.\r
+ *\r
+ * Note 4:  A receive (in the case of a queue) or take (in the case of a\r
+ * semaphore) operation must not be performed on a member of a queue set unless\r
+ * a call to xQueueSelectFromSet() has first returned a handle to that set member.\r
  *\r
- * @param uxEventQueueLength Queue sets themselves queue events that occur on\r
+ * @param uxEventQueueLength Queue sets store events that occur on\r
  * the queues and semaphores contained in the set.  uxEventQueueLength specifies\r
  * the maximum number of events that can be queued at once.  To be absolutely\r
  * certain that events are not lost uxEventQueueLength should be set to the\r
@@ -1340,64 +1371,72 @@ xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned
  * @return If the queue set is created successfully then a handle to the created\r
  * queue set is returned.  Otherwise NULL is returned.\r
  */\r
-xQueueSetHandle xQueueSetCreate( unsigned portBASE_TYPE uxEventQueueLength );\r
+xQueueSetHandle xQueueCreateSet( unsigned portBASE_TYPE uxEventQueueLength ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
  * Adds a queue or semaphore to a queue set that was previously created by a\r
- * call to xQueueSetCreate().\r
+ * call to xQueueCreateSet().\r
  *\r
  * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this\r
  * function.\r
  *\r
- * @param xQueue The handle of the queue or semaphore being added to the\r
- * queue set.  Variables of type xSemaphoreHandle can be safely added to a\r
- * queue set but may require casting to an xQueueHandle type to avoid compiler\r
- * warnings.\r
+ * Note 1:  A receive (in the case of a queue) or take (in the case of a\r
+ * semaphore) operation must not be performed on a member of a queue set unless\r
+ * a call to xQueueSelectFromSet() has first returned a handle to that set member.\r
+ *\r
+ * @param xQueueOrSemaphore The handle of the queue or semaphore being added to\r
+ * the queue set (cast to an xQueueSetMemberHandle type).\r
  *\r
  * @param xQueueSet The handle of the queue set to which the queue or semaphore\r
  * is being added.\r
  *\r
- * @return If the queue or semaphore was successfully added to the queue set \r
- * then pdPASS is returned.  If the queue could not be successfully added to the \r
- * queue set because it is already a member of a different queue set then pdFAIL \r
+ * @return If the queue or semaphore was successfully added to the queue set\r
+ * then pdPASS is returned.  If the queue could not be successfully added to the\r
+ * queue set because it is already a member of a different queue set then pdFAIL\r
  * is returned.\r
  */\r
-portBASE_TYPE xQueueAddToQueueSet( xQueueHandle xQueue, xQueueSetHandle xQueueSet );\r
+portBASE_TYPE xQueueAddToSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
- * Removes a queue or semaphore from a queue set.\r
+ * Removes a queue or semaphore from a queue set.  A queue or semaphore can only\r
+ * be removed from a set if the queue or semaphore is empty.\r
  *\r
  * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this\r
  * function.\r
  *\r
- * @param xQueue The handle of the queue or semaphore being removed from the\r
- * queue set.  Variables of type xSemaphoreHandle can be safely used but may \r
- * require casting to an xQueueHandle type to avoid compiler warnings.\r
+ * @param xQueueOrSemaphore The handle of the queue or semaphore being removed\r
+ * from the queue set (cast to an xQueueSetMemberHandle type).\r
  *\r
  * @param xQueueSet The handle of the queue set in which the queue or semaphore\r
  * is included.\r
  *\r
- * @return If the queue or semaphore was successfully removed from the queue set \r
- * then pdPASS is returned.  If the queue was not in the queue set then pdFAIL\r
- * is returned.\r
+ * @return If the queue or semaphore was successfully removed from the queue set\r
+ * then pdPASS is returned.  If the queue was not in the queue set, or the\r
+ * queue (or semaphore) was not empty, then pdFAIL is returned.\r
  */\r
-portBASE_TYPE xQueueRemoveFromQueueSet( xQueueSetHandle xQueueSet, xQueueHandle xQueue );\r
+portBASE_TYPE xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
- * xQueueReadMultiple() allows a task to block (pend) on a read operation on\r
- * all the queues and semaphores in a queue set simultaneously.\r
+ * xQueueSelectFromSet() selects from the members of a queue set a queue or\r
+ * semaphore that either contains data (in the case of a queue) or is available\r
+ * to take (in the case of a semaphore).  xQueueSelectFromSet() effectively\r
+ * allows a task to block (pend) on a read operation on all the queues and\r
+ * semaphores in a queue set simultaneously.\r
  *\r
  * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this\r
  * function.\r
  *\r
- * Note 1:  See the documentation on http://wwwFreeRTOS.org for reasons why\r
- * queue sets are very rarely needed in practice as there are simpler\r
- * alternatives.  Queue sets are provided to allow FreeRTOS to be integrated\r
- * with legacy third party driver code.\r
+ * Note 1:  See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html\r
+ * for reasons why queue sets are very rarely needed in practice as there are\r
+ * simpler methods of blocking on multiple objects.\r
  *\r
  * Note 2:  Blocking on a queue set that contains a mutex will not cause the\r
  * mutex holder to inherit the priority of the blocked task.\r
  *\r
+ * Note 3:  A receive (in the case of a queue) or take (in the case of a\r
+ * semaphore) operation must not be performed on a member of a queue set unless\r
+ * a call to xQueueSelectFromSet() has first returned a handle to that set member.\r
+ *\r
  * @param xQueueSet The queue set on which the task will (potentially) block.\r
  *\r
  * @param xBlockTimeTicks The maximum time, in ticks, that the calling task will\r
@@ -1405,16 +1444,24 @@ portBASE_TYPE xQueueRemoveFromQueueSet( xQueueSetHandle xQueueSet, xQueueHandle
  * of the queue set to be ready for a successful queue read or semaphore take\r
  * operation.\r
  *\r
- * @return xQueueReadMultiple() will return the handle of a queue contained \r
- * in the queue set that contains data, or the handle of a semaphore contained\r
- * in the queue set that is available, or NULL if no such queue or semaphore \r
+ * @return xQueueSelectFromSet() will return the handle of a queue (cast to\r
+ * a xQueueSetMemberHandle type) contained in the queue set that contains data,\r
+ * or the handle of a semaphore (cast to a xQueueSetMemberHandle type) contained\r
+ * in the queue set that is available, or NULL if no such queue or semaphore\r
  * exists before before the specified block time expires.\r
  */\r
-xQueueHandle xQueueReadMultiple( xQueueSetHandle xQueueSet, portTickType xBlockTimeTicks );\r
+xQueueSetMemberHandle xQueueSelectFromSet( xQueueSetHandle xQueueSet, portTickType xBlockTimeTicks ) PRIVILEGED_FUNCTION;\r
+\r
+/*\r
+ * A version of xQueueSelectFromSet() that can be used from an ISR.\r
+ */\r
+xQueueSetMemberHandle xQueueSelectFromSetFromISR( xQueueSetHandle xQueueSet ) PRIVILEGED_FUNCTION;\r
 \r
 /* Not public API functions. */\r
-void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait );\r
-portBASE_TYPE xQueueGenericReset( xQueueHandle pxQueue, portBASE_TYPE xNewQueue );\r
+void vQueueWaitForMessageRestricted( xQueueHandle xQueue, portTickType xTicksToWait ) PRIVILEGED_FUNCTION;\r
+portBASE_TYPE xQueueGenericReset( xQueueHandle xQueue, portBASE_TYPE xNewQueue ) PRIVILEGED_FUNCTION;\r
+void vQueueSetQueueNumber( xQueueHandle xQueue, unsigned char ucQueueNumber ) PRIVILEGED_FUNCTION;\r
+unsigned char ucQueueGetQueueType( xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
 \r
 \r
 #ifdef __cplusplus\r