/*\r
- FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd.\r
- All rights reserved\r
-\r
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
-\r
- ***************************************************************************\r
- * *\r
- * FreeRTOS provides completely free yet professionally developed, *\r
- * robust, strictly quality controlled, supported, and cross *\r
- * platform software that has become a de facto standard. *\r
- * *\r
- * Help yourself get started quickly and support the FreeRTOS *\r
- * project by purchasing a FreeRTOS tutorial book, reference *\r
- * manual, or both from: http://www.FreeRTOS.org/Documentation *\r
- * *\r
- * Thank you! *\r
- * *\r
- ***************************************************************************\r
-\r
- This file is part of the FreeRTOS distribution.\r
-\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
-\r
- >>! NOTE: The modification to the GPL is included to allow you to distribute\r
- >>! a combined work that includes FreeRTOS without being obliged to provide\r
- >>! the source code for proprietary components outside of the FreeRTOS\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. Full license text is available from the following\r
- link: http://www.freertos.org/a00114.html\r
-\r
- 1 tab == 4 spaces!\r
-\r
- ***************************************************************************\r
- * *\r
- * Having a problem? Start by reading the FAQ "My application does *\r
- * not run, what could be wrong?" *\r
- * *\r
- * http://www.FreeRTOS.org/FAQHelp.html *\r
- * *\r
- ***************************************************************************\r
-\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, a DOS\r
- compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
-\r
- http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
- Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS\r
- licenses offer ticketed support, indemnification and middleware.\r
-\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
- 1 tab == 4 spaces!\r
-*/\r
+ * FreeRTOS Kernel V10.1.1\r
+ * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+ * this software and associated documentation files (the "Software"), to deal in\r
+ * the Software without restriction, including without limitation the rights to\r
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+ * the Software, and to permit persons to whom the Software is furnished to do so,\r
+ * subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in all\r
+ * copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * http://www.FreeRTOS.org\r
+ * http://aws.amazon.com/freertos\r
+ *\r
+ * 1 tab == 4 spaces!\r
+ */\r
\r
\r
#ifndef QUEUE_H\r
extern "C" {\r
#endif\r
\r
+#include "task.h"\r
\r
/**\r
* Type by which queues are referenced. For example, a call to xQueueCreate()\r
* returns an QueueHandle_t variable that can then be used as a parameter to\r
* xQueueSend(), xQueueReceive(), etc.\r
*/\r
-typedef void * QueueHandle_t;\r
+struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */\r
+typedef struct QueueDefinition * QueueHandle_t;\r
\r
/**\r
* Type by which queue sets are referenced. For example, a call to\r
* xQueueCreateSet() returns an xQueueSet variable that can then be used as a\r
* parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc.\r
*/\r
-typedef void * QueueSetHandle_t;\r
+typedef struct QueueDefinition * QueueSetHandle_t;\r
\r
/**\r
* Queue sets can contain both queues and semaphores, so the\r
* QueueSetMemberHandle_t is defined as a type to be used where a parameter or\r
* return value can be either an QueueHandle_t or an SemaphoreHandle_t.\r
*/\r
-typedef void * QueueSetMemberHandle_t;\r
+typedef struct QueueDefinition * QueueSetMemberHandle_t;\r
\r
/* For internal use only. */\r
#define queueSEND_TO_BACK ( ( BaseType_t ) 0 )\r
);\r
* </pre>\r
*\r
- * Creates a new queue instance. This allocates the storage required by the\r
- * new queue and returns a handle for the queue.\r
+ * Creates a new queue instance, and returns a handle by which the new queue\r
+ * can be referenced.\r
+ *\r
+ * Internally, within the FreeRTOS implementation, queues use two blocks of\r
+ * memory. The first block is used to hold the queue's data structures. The\r
+ * second block is used to hold items placed into the queue. If a queue is\r
+ * created using xQueueCreate() then both blocks of memory are automatically\r
+ * dynamically allocated inside the xQueueCreate() function. (see\r
+ * http://www.freertos.org/a00111.html). If a queue is created using\r
+ * xQueueCreateStatic() then the application writer must provide the memory that\r
+ * will get used by the queue. xQueueCreateStatic() therefore allows a queue to\r
+ * be created without using any dynamic memory allocation.\r
+ *\r
+ * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html\r
*\r
* @param uxQueueLength The maximum number of items that the queue can contain.\r
*\r
* \defgroup xQueueCreate xQueueCreate\r
* \ingroup QueueManagement\r
*/\r
-#define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( uxQueueLength, uxItemSize, queueQUEUE_TYPE_BASE )\r
+#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r
+ #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) )\r
+#endif\r
+\r
+/**\r
+ * queue. h\r
+ * <pre>\r
+ QueueHandle_t xQueueCreateStatic(\r
+ UBaseType_t uxQueueLength,\r
+ UBaseType_t uxItemSize,\r
+ uint8_t *pucQueueStorageBuffer,\r
+ StaticQueue_t *pxQueueBuffer\r
+ );\r
+ * </pre>\r
+ *\r
+ * Creates a new queue instance, and returns a handle by which the new queue\r
+ * can be referenced.\r
+ *\r
+ * Internally, within the FreeRTOS implementation, queues use two blocks of\r
+ * memory. The first block is used to hold the queue's data structures. The\r
+ * second block is used to hold items placed into the queue. If a queue is\r
+ * created using xQueueCreate() then both blocks of memory are automatically\r
+ * dynamically allocated inside the xQueueCreate() function. (see\r
+ * http://www.freertos.org/a00111.html). If a queue is created using\r
+ * xQueueCreateStatic() then the application writer must provide the memory that\r
+ * will get used by the queue. xQueueCreateStatic() therefore allows a queue to\r
+ * be created without using any dynamic memory allocation.\r
+ *\r
+ * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html\r
+ *\r
+ * @param uxQueueLength The maximum number of items that the queue can contain.\r
+ *\r
+ * @param uxItemSize The number of bytes each item in the queue will require.\r
+ * Items are queued by copy, not by reference, so this is the number of bytes\r
+ * that will be copied for each posted item. Each item on the queue must be\r
+ * the same size.\r
+ *\r
+ * @param pucQueueStorageBuffer If uxItemSize is not zero then\r
+ * pucQueueStorageBuffer must point to a uint8_t array that is at least large\r
+ * enough to hold the maximum number of items that can be in the queue at any\r
+ * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is\r
+ * zero then pucQueueStorageBuffer can be NULL.\r
+ *\r
+ * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which\r
+ * will be used to hold the queue's data structure.\r
+ *\r
+ * @return If the queue is created then a handle to the created queue is\r
+ * returned. If pxQueueBuffer is NULL then NULL is returned.\r
+ *\r
+ * Example usage:\r
+ <pre>\r
+ struct AMessage\r
+ {\r
+ char ucMessageID;\r
+ char ucData[ 20 ];\r
+ };\r
+\r
+ #define QUEUE_LENGTH 10\r
+ #define ITEM_SIZE sizeof( uint32_t )\r
+\r
+ // xQueueBuffer will hold the queue structure.\r
+ StaticQueue_t xQueueBuffer;\r
+\r
+ // ucQueueStorage will hold the items posted to the queue. Must be at least\r
+ // [(queue length) * ( queue item size)] bytes long.\r
+ uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];\r
+\r
+ void vATask( void *pvParameters )\r
+ {\r
+ QueueHandle_t xQueue1;\r
+\r
+ // Create a queue capable of containing 10 uint32_t values.\r
+ xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold.\r
+ ITEM_SIZE // The size of each item in the queue\r
+ &( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue.\r
+ &xQueueBuffer ); // The buffer that will hold the queue structure.\r
+\r
+ // The queue is guaranteed to be created successfully as no dynamic memory\r
+ // allocation is used. Therefore xQueue1 is now a handle to a valid queue.\r
+\r
+ // ... Rest of task code.\r
+ }\r
+ </pre>\r
+ * \defgroup xQueueCreateStatic xQueueCreateStatic\r
+ * \ingroup QueueManagement\r
+ */\r
+#if( configSUPPORT_STATIC_ALLOCATION == 1 )\r
+ #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) )\r
+#endif /* configSUPPORT_STATIC_ALLOCATION */\r
\r
/**\r
* queue. h\r
* <pre>\r
BaseType_t xQueueSendToToFront(\r
QueueHandle_t xQueue,\r
- const void * pvItemToQueue,\r
- TickType_t xTicksToWait\r
+ const void *pvItemToQueue,\r
+ TickType_t xTicksToWait\r
);\r
* </pre>\r
*\r
- * This is a macro that calls xQueueGenericSend().\r
- *\r
* Post an item to the front of a queue. The item is queued by copy, not by\r
* reference. This function must not be called from an interrupt service\r
* routine. See xQueueSendFromISR () for an alternative which may be used\r
* waiting for space to become available on the queue, should it already\r
* be full. The call will return immediately if this is set to 0 and the\r
* queue is full. The time is defined in tick periods so the constant\r
- * portTICK_RATE_MS should be used to convert to real time if this is required.\r
+ * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r
*\r
* @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.\r
*\r
* waiting for space to become available on the queue, should it already\r
* be full. The call will return immediately if this is set to 0 and the queue\r
* is full. The time is defined in tick periods so the constant\r
- * portTICK_RATE_MS should be used to convert to real time if this is required.\r
+ * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r
*\r
* @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.\r
*\r
* waiting for space to become available on the queue, should it already\r
* be full. The call will return immediately if this is set to 0 and the\r
* queue is full. The time is defined in tick periods so the constant\r
- * portTICK_RATE_MS should be used to convert to real time if this is required.\r
+ * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r
*\r
* @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.\r
*\r
* waiting for space to become available on the queue, should it already\r
* be full. The call will return immediately if this is set to 0 and the\r
* queue is full. The time is defined in tick periods so the constant\r
- * portTICK_RATE_MS should be used to convert to real time if this is required.\r
+ * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r
*\r
* @param xCopyPosition Can take the value queueSEND_TO_BACK to place the\r
* item at the back of the queue, or queueSEND_TO_FRONT to place the item\r
* <pre>\r
BaseType_t xQueuePeek(\r
QueueHandle_t xQueue,\r
- void *pvBuffer,\r
+ void * const pvBuffer,\r
TickType_t xTicksToWait\r
);</pre>\r
*\r
- * This is a macro that calls the xQueueGenericReceive() function.\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
* @param xTicksToWait The maximum amount of time the task should block\r
* waiting for an item to receive should the queue be empty at the time\r
* of the call. The time is defined in tick periods so the constant\r
- * portTICK_RATE_MS should be used to convert to real time if this is required.\r
+ * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r
* xQueuePeek() will return immediately if xTicksToWait is 0 and the queue\r
* is empty.\r
*\r
// ... Rest of task code.\r
}\r
</pre>\r
- * \defgroup xQueueReceive xQueueReceive\r
+ * \defgroup xQueuePeek xQueuePeek\r
* \ingroup QueueManagement\r
*/\r
-#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE )\r
+BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r
\r
/**\r
* queue. h\r
TickType_t xTicksToWait\r
);</pre>\r
*\r
- * This is a macro that calls the xQueueGenericReceive() function.\r
- *\r
* Receive an item from a queue. The item is received by copy so a buffer of\r
* adequate size must be provided. The number of bytes copied into the buffer\r
* was defined when the queue was created.\r
* waiting for an item to receive should the queue be empty at the time\r
* of the call. xQueueReceive() will return immediately if xTicksToWait\r
* is zero and the queue is empty. The time is defined in tick periods so the\r
- * constant portTICK_RATE_MS should be used to convert to real time if this is\r
+ * constant portTICK_PERIOD_MS should be used to convert to real time if this is\r
* required.\r
*\r
* @return pdTRUE if an item was successfully received from the queue,\r
* \defgroup xQueueReceive xQueueReceive\r
* \ingroup QueueManagement\r
*/\r
-#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE )\r
-\r
-\r
-/**\r
- * queue. h\r
- * <pre>\r
- BaseType_t xQueueGenericReceive(\r
- QueueHandle_t xQueue,\r
- void *pvBuffer,\r
- TickType_t xTicksToWait\r
- BaseType_t xJustPeek\r
- );</pre>\r
- *\r
- * It is preferred that the macro xQueueReceive() be used rather than calling\r
- * this function directly.\r
- *\r
- * Receive an item from a queue. The item is received by copy so a buffer of\r
- * adequate size must be provided. The number of bytes copied into the buffer\r
- * was defined when the queue was created.\r
- *\r
- * This function must not be used in an interrupt service routine. See\r
- * xQueueReceiveFromISR for an alternative that can.\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
- * @param xTicksToWait The maximum amount of time the task should block\r
- * waiting for an item to receive should the queue be empty at the time\r
- * of the call. The time is defined in tick periods so the constant\r
- * portTICK_RATE_MS should be used to convert to real time if this is required.\r
- * xQueueGenericReceive() will return immediately if the queue is empty and\r
- * xTicksToWait is 0.\r
- *\r
- * @param xJustPeek When set to true, the item received from the queue is not\r
- * actually removed from the queue - meaning a subsequent call to\r
- * xQueueReceive() will return the same item. When set to false, the item\r
- * being received from the queue is also removed from the queue.\r
- *\r
- * @return pdTRUE if an item was successfully received from the queue,\r
- * otherwise pdFALSE.\r
- *\r
- * Example usage:\r
- <pre>\r
- struct AMessage\r
- {\r
- char ucMessageID;\r
- char ucData[ 20 ];\r
- } xMessage;\r
-\r
- QueueHandle_t xQueue;\r
-\r
- // Task to create a queue and post a value.\r
- void vATask( void *pvParameters )\r
- {\r
- struct AMessage *pxMessage;\r
-\r
- // Create a queue capable of containing 10 pointers to AMessage structures.\r
- // These should be passed by pointer as they contain a lot of data.\r
- xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );\r
- if( xQueue == 0 )\r
- {\r
- // Failed to create the queue.\r
- }\r
-\r
- // ...\r
-\r
- // Send a pointer to a struct AMessage object. Don't block if the\r
- // queue is already full.\r
- pxMessage = & xMessage;\r
- xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );\r
-\r
- // ... Rest of task code.\r
- }\r
-\r
- // Task to receive from the queue.\r
- void vADifferentTask( void *pvParameters )\r
- {\r
- struct AMessage *pxRxedMessage;\r
-\r
- if( xQueue != 0 )\r
- {\r
- // Receive a message on the created queue. Block for 10 ticks if a\r
- // message is not immediately available.\r
- if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )\r
- {\r
- // pcRxedMessage now points to the struct AMessage variable posted\r
- // by vATask.\r
- }\r
- }\r
-\r
- // ... Rest of task code.\r
- }\r
- </pre>\r
- * \defgroup xQueueReceive xQueueReceive\r
- * \ingroup QueueManagement\r
- */\r
-BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, const BaseType_t xJustPeek ) PRIVILEGED_FUNCTION;\r
+BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r
\r
/**\r
* queue. h\r
*\r
* It is preferred that the macros xQueueSendFromISR(),\r
* xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place\r
- * of calling this function directly.\r
+ * of calling this function directly. xQueueGiveFromISR() is an\r
+ * equivalent for use by semaphores that don't actually copy any data.\r
*\r
* Post an item on a queue. It is safe to use this function from within an\r
* interrupt service routine.\r
* \ingroup QueueManagement\r
*/\r
BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION;\r
+BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r
\r
/**\r
* queue. h\r
void vAFunction( void *pvParameters )\r
{\r
char cValueToPost;\r
- const TickType_t xBlockTime = ( TickType_t )0xff;\r
+ const TickType_t xTicksToWait = ( TickType_t )0xff;\r
\r
// Create a queue capable of containing 10 characters.\r
xQueue = xQueueCreate( 10, sizeof( char ) );\r
// ...\r
\r
// Post some characters that will be used within an ISR. If the queue\r
- // is full then this task will block for xBlockTime ticks.\r
+ // is full then this task will block for xTicksToWait ticks.\r
cValueToPost = 'a';\r
- xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );\r
+ xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );\r
cValueToPost = 'b';\r
- xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );\r
+ xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );\r
\r
// ... keep posting characters ... this task may block when the queue\r
// becomes full.\r
\r
cValueToPost = 'c';\r
- xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );\r
+ xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );\r
}\r
\r
// ISR that outputs all the characters received on the queue.\r
BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r
UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r
\r
-\r
-/*\r
- * xQueueAltGenericSend() is an alternative version of xQueueGenericSend().\r
- * Likewise xQueueAltGenericReceive() is an alternative version of\r
- * xQueueGenericReceive().\r
- *\r
- * The source code that implements the alternative (Alt) API is much\r
- * simpler because it executes everything from within a critical section.\r
- * This is the approach taken by many other RTOSes, but FreeRTOS.org has the\r
- * preferred fully featured API too. The fully featured API has more\r
- * complex code that takes longer to execute, but makes much less use of\r
- * critical sections. Therefore the alternative API sacrifices interrupt\r
- * responsiveness to gain execution speed, whereas the fully featured API\r
- * sacrifices execution speed to ensure better interrupt responsiveness.\r
- */\r
-BaseType_t xQueueAltGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, BaseType_t xCopyPosition );\r
-BaseType_t xQueueAltGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait, BaseType_t 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
-#define xQueueAltPeek( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE )\r
-\r
/*\r
* The functions defined above are for passing data to and from tasks. The\r
* functions below are the equivalents for passing data to and from\r
* these functions directly.\r
*/\r
QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r
+QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION;\r
QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION;\r
-void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;\r
+QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION;\r
+BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r
+TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;\r
+TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;\r
\r
/*\r
* For internal use only. Use xSemaphoreTakeMutexRecursive() or\r
* xSemaphoreGiveMutexRecursive() instead of calling these functions directly.\r
*/\r
-BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xBlockTime ) PRIVILEGED_FUNCTION;\r
-BaseType_t xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION;\r
+BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r
+BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION;\r
\r
/*\r
- * Reset a queue back to its original empty state. pdPASS is returned if the\r
- * queue is successfully reset. pdFAIL is returned if the queue could not be\r
- * reset because there are tasks blocked on the queue waiting to either\r
- * receive from the queue or send to the queue.\r
+ * Reset a queue back to its original empty state. The return value is now\r
+ * obsolete and is always set to pdPASS.\r
*/\r
#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE )\r
\r
* stores a pointer to the string - so the string must be persistent (global or\r
* preferably in ROM/Flash), not on the stack.\r
*/\r
-#if configQUEUE_REGISTRY_SIZE > 0\r
- void vQueueAddToRegistry( QueueHandle_t xQueue, char *pcName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */\r
+#if( configQUEUE_REGISTRY_SIZE > 0 )\r
+ void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */\r
#endif\r
\r
/*\r
*\r
* @param xQueue The handle of the queue being removed from the registry.\r
*/\r
-#if configQUEUE_REGISTRY_SIZE > 0\r
+#if( configQUEUE_REGISTRY_SIZE > 0 )\r
void vQueueUnregisterQueue( QueueHandle_t 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
+ * The queue registry is provided as a means for kernel aware debuggers to\r
+ * locate queues, semaphores and mutexes. Call pcQueueGetName() to look\r
+ * up and return the name of a queue in the queue registry from the queue's\r
+ * handle.\r
+ *\r
+ * @param xQueue The handle of the queue the name of which will be returned.\r
+ * @return If the queue is in the registry then a pointer to the name of the\r
+ * queue is returned. If the queue is not in the registry then NULL is\r
+ * returned.\r
*/\r
-QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r
+#if( configQUEUE_REGISTRY_SIZE > 0 )\r
+ const char *pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */\r
+#endif\r
+\r
+/*\r
+ * Generic version of the function used to creaet a queue using dynamic memory\r
+ * allocation. This is called by other functions and macros that create other\r
+ * RTOS objects that use the queue structure as their base.\r
+ */\r
+#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r
+ QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r
+#endif\r
+\r
+/*\r
+ * Generic version of the function used to creaet a queue using dynamic memory\r
+ * allocation. This is called by other functions and macros that create other\r
+ * RTOS objects that use the queue structure as their base.\r
+ */\r
+#if( configSUPPORT_STATIC_ALLOCATION == 1 )\r
+ QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r
+#endif\r
\r
/*\r
* Queue sets provide a mechanism to allow a task to block (pend) on a read\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
+ * @param xTicksToWait The maximum time, in ticks, that the calling task will\r
* remain in the Blocked state (with other tasks executing) to wait for a member\r
* of the queue set to be ready for a successful queue read or semaphore take\r
* operation.\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
-QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xBlockTimeTicks ) PRIVILEGED_FUNCTION;\r
+QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r
\r
/*\r
* A version of xQueueSelectFromSet() that can be used from an ISR.\r
QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;\r
\r
/* Not public API functions. */\r
-void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r
+void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION;\r
BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) PRIVILEGED_FUNCTION;\r
void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION;\r
UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r