/*\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
#endif\r
\r
\r
-#include "mpu_wrappers.h"\r
-\r
/**\r
* Type by which queues are referenced. For example, a call to xQueueCreate()\r
* returns an xQueueHandle variable that can then be used as a parameter to\r
\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 xQueueBlockMultiple(), 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
+ * 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
+\r
/* For internal use only. */\r
-#define queueSEND_TO_BACK ( 0 )\r
-#define queueSEND_TO_FRONT ( 1 )\r
+#define queueSEND_TO_BACK ( ( portBASE_TYPE ) 0 )\r
+#define queueSEND_TO_FRONT ( ( portBASE_TYPE ) 1 )\r
+#define queueOVERWRITE ( ( portBASE_TYPE ) 2 )\r
\r
/* For internal use only. These definitions *must* match those in queue.c. */\r
-#define queueQUEUE_TYPE_BASE ( 0U )\r
-#define queueQUEUE_TYPE_MUTEX ( 1U )\r
-#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( 2U )\r
-#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( 3U )\r
-#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( 4U )\r
+#define queueQUEUE_TYPE_BASE ( ( unsigned char ) 0U )\r
+#define queueQUEUE_TYPE_SET ( ( unsigned char ) 0U )\r
+#define queueQUEUE_TYPE_MUTEX ( ( unsigned char ) 1U )\r
+#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( unsigned char ) 2U )\r
+#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( unsigned char ) 3U )\r
+#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( unsigned char ) 4U )\r
\r
/**\r
* queue. h\r
*/\r
#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )\r
\r
+/**\r
+ * queue. h\r
+ * <pre>\r
+ portBASE_TYPE xQueueOverwrite(\r
+ xQueueHandle xQueue,\r
+ const void * pvItemToQueue,\r
+ );\r
+ * </pre>\r
+ *\r
+ * Only for use with queues that can hold a single item - so the queue is either\r
+ * empty or full.\r
+ *\r
+ * Post an item on a queue. If the queue is already full then overwrite the\r
+ * value held in the queue. The item is queued by copy, not by reference.\r
+ * This function must not be called from an interrupt service routine.\r
+ * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR.\r
+ *\r
+ * @param xQueue The handle to the queue on which the item is to be posted.\r
+ *\r
+ * @param pvItemToQueue A pointer to the item that is to be placed on the\r
+ * queue. The size of the items the queue will hold was defined when the\r
+ * queue was created, so this many bytes will be copied from pvItemToQueue\r
+ * into the queue storage area.\r
+ *\r
+ * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and\r
+ * therefore has the same return values as xQueueSendToFront(). However, as\r
+ * xQueueOverwrite() will write to the queue even when the queue is full pdPASS\r
+ * will be returned in all cases (errQUEUE_FULL will never be returned).\r
+ *\r
+ * Example usage:\r
+ <pre>\r
+\r
+ void vFunction( void *pvParameters )\r
+ {\r
+ xQueueHandle xQueue;\r
+ unsigned long ulVarToSend, ulValReceived;\r
+\r
+ // Create a queue to hold one unsigned long value. It is strongly\r
+ // recommended *not* to use xQueueOverwrite() on queues that can\r
+ // contain more than one value, and doing so will trigger an assertion\r
+ // if configASSERT() is defined.\r
+ xQueue = xQueueCreate( 1, sizeof( unsigned long ) );\r
+\r
+ // Write the value 10 to the queue using xQueueOverwrite().\r
+ ulVarToSend = 10;\r
+ xQueueOverwrite( xQueue, &ulVarToSend );\r
+\r
+ // Peeking the queue should now return 10, but leave the value 10 in\r
+ // the queue. A block time of zero is used as it is known that the\r
+ // queue holds a value.\r
+ ulValReceived = 0;\r
+ xQueuePeek( xQueue, &ulValReceived, 0 );\r
+\r
+ if( ulValReceived != 10 )\r
+ {\r
+ // Error!\r
+ }\r
+\r
+ // The queue is still full. Use xQueueOverwrite() to overwrite the\r
+ // value held in the queue with 100.\r
+ ulVarToSend = 100;\r
+ xQueueOverwrite( xQueue, &ulVarToSend );\r
+\r
+ // This time read from the queue, leaving the queue empty once more.\r
+ // A block time of 0 is used again.\r
+ xQueueReceive( xQueue, &ulValReceived, 0 );\r
+\r
+ // The value read should be the last value written, even though the\r
+ // queue was already full when the value was written.\r
+ if( ulValReceived != 100 )\r
+ {\r
+ // Error!\r
+ }\r
+\r
+ // ...\r
+}\r
+ </pre>\r
+ * \defgroup xQueueOverwrite xQueueOverwrite\r
+ * \ingroup QueueManagement\r
+ */\r
+#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE )\r
+\r
\r
/**\r
* queue. h\r
* \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
* Successfully received items remain on the queue so will be returned again\r
* by the next call, or a call to xQueueReceive().\r
*\r
- * This macro must not be used in an interrupt service routine.\r
+ * This macro must not be used in an interrupt service routine. See\r
+ * xQueuePeekFromISR() for an alternative that can be called from an interrupt\r
+ * 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
*/\r
#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE )\r
\r
+/**\r
+ * queue. h\r
+ * <pre>\r
+ portBASE_TYPE xQueuePeekFromISR(\r
+ xQueueHandle xQueue,\r
+ void *pvBuffer,\r
+ );</pre>\r
+ *\r
+ * A version of xQueuePeek() that can be called from an interrupt service\r
+ * routine (ISR).\r
+ *\r
+ * Receive an item from a queue without removing the item from the queue.\r
+ * The item is received by copy so a buffer of adequate size must be\r
+ * provided. The number of bytes copied into the buffer was defined when\r
+ * the queue was created.\r
+ *\r
+ * Successfully received items remain on the queue so will be returned again\r
+ * by the next call, or a call to xQueueReceive().\r
+ *\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
+ * be copied.\r
+ *\r
+ * @return pdTRUE if an item was successfully received from the queue,\r
+ * otherwise pdFALSE.\r
+ *\r
+ * \defgroup xQueuePeekFromISR xQueuePeekFromISR\r
+ * \ingroup QueueManagement\r
+ */\r
+signed portBASE_TYPE xQueuePeekFromISR( xQueueHandle xQueue, const void * const pvBuffer ) PRIVILEGED_FUNCTION;\r
+\r
/**\r
* queue. h\r
* <pre>\r
* 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
* 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
* \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, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek ) PRIVILEGED_FUNCTION;\r
\r
/**\r
* queue. h\r
*\r
* @return The number of messages available in the queue.\r
*\r
- * \page uxQueueMessagesWaiting uxQueueMessagesWaiting\r
+ * \defgroup 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
*\r
* @param xQueue A handle to the queue to be deleted.\r
*\r
- * \page vQueueDelete vQueueDelete\r
+ * \defgroup 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
* \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
* \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 xQueueOverwriteFromISR(\r
+ xQueueHandle xQueue,\r
+ const void * pvItemToQueue,\r
+ portBASE_TYPE *pxHigherPriorityTaskWoken\r
+ );\r
+ * </pre>\r
+ *\r
+ * A version of xQueueOverwrite() that can be used from an interrupt service\r
+ * routine (ISR).\r
+ *\r
+ * Only for use with queues that can hold a single item - so the queue is either\r
+ * empty or full.\r
+ *\r
+ * Post an item on a queue. If the queue is already full then overwrite the\r
+ * value held in the queue. The item is queued by copy, not by reference.\r
+ *\r
+ * @param xQueue The handle to the queue on which the item is to be posted.\r
+ *\r
+ * @param pvItemToQueue A pointer to the item that is to be placed on the\r
+ * queue. The size of the items the queue will hold was defined when the\r
+ * queue was created, so this many bytes will be copied from pvItemToQueue\r
+ * into the queue storage area.\r
+ *\r
+ * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set\r
+ * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task\r
+ * to unblock, and the unblocked task has a priority higher than the currently\r
+ * running task. If xQueueSendFromISR() sets this value to pdTRUE then\r
+ * a context switch should be requested before the interrupt is exited.\r
+ *\r
+ * @return xQueueOverwriteFromISR() is a macro that calls \r
+ * xQueueGenericSendFromISR(), and therefore has the same return values as \r
+ * xQueueSendToFrontFromISR(). However, as xQueueOverwriteFromISR() will write \r
+ * to the queue even when the queue is full pdPASS will be returned in all cases \r
+ * (errQUEUE_FULL will never be returned).\r
+ *\r
+ * Example usage:\r
+ <pre>\r
+\r
+ xQueueHandle xQueue;\r
+ \r
+ void vFunction( void *pvParameters )\r
+ {\r
+ // Create a queue to hold one unsigned long value. It is strongly\r
+ // recommended *not* to use xQueueOverwrite() on queues that can\r
+ // contain more than one value, and doing so will trigger an assertion\r
+ // if configASSERT() is defined.\r
+ xQueue = xQueueCreate( 1, sizeof( unsigned long ) );\r
+}\r
+\r
+void vAnInterruptHandler( void )\r
+{\r
+// xHigherPriorityTaskWoken must be set to pdFALSE before it is used.\r
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
+unsigned long ulVarToSend, ulValReceived;\r
+\r
+ // Write the value 10 to the queue using xQueueOverwriteFromISR().\r
+ ulVarToSend = 10;\r
+ xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );\r
+\r
+ // The queue is full, but calling xQueueOverwriteFromISR() again will still\r
+ // pass because the value held in the queue will be overwritten with the\r
+ // new value.\r
+ ulVarToSend = 100;\r
+ xQueueOverwrite( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );\r
+\r
+ // Reading from the queue will now return 100.\r
+\r
+ // ...\r
+}\r
+ </pre>\r
+ * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR\r
+ * \ingroup QueueManagement\r
+ */\r
+#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE )\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
* \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
* \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
* \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, const 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
* 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
* 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
* 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
* @param pcName The name to be associated with the handle. This is the\r
* name that the kernel aware debugger will display.\r
*/\r
-#if configQUEUE_REGISTRY_SIZE > 0U\r
- void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName );\r
+#if configQUEUE_REGISTRY_SIZE > 0\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 > 0\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
* 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
- * xQueueBlockMultiple() 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
* @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 xQueueOrSemaphore The handle of the queue or semaphore being added to \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( xQueueSetMemberHandle xQueueOrSemaphore, 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 xQueueOrSemaphore The handle of the queue or semaphore being removed \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( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet );\r
+portBASE_TYPE xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) PRIVILEGED_FUNCTION;\r
\r
/*\r
- * xQueueBlockMultiple() 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
* of the queue set to be ready for a successful queue read or semaphore take\r
* operation.\r
*\r
- * @return xQueueBlockMultiple() will return the handle of a queue (cast to\r
- * a xQueueSetMemberHandle type) contained in the queue set that contains data, \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
+ * 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
-xQueueSetMemberHandle xQueueBlockMultiple( 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 ucQueueGetQueueNumber( xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
+unsigned char ucQueueGetQueueType( xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
\r
\r
#ifdef __cplusplus\r