/*\r
- FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd.\r
+ FreeRTOS V9.0.0rc2 - Copyright (C) 2016 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
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
+ Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.\r
\r
***************************************************************************\r
>>! NOTE: The modification to the GPL is included to allow you to !<<\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
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
+QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION;\r
void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;\r
\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
+#if( configQUEUE_REGISTRY_SIZE > 0 )\r
void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */\r
#endif\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