]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/include/queue.h
Ensure the code builds when configSUPPORT_STATIC_ALLOCATION is 0.
[freertos] / FreeRTOS / Source / include / queue.h
index 2d7b5e90a70c06b879216f0381a0b1ed5f708cee..dfdc7e60eb93afab4dc30691c5d95eca237d8e89 100644 (file)
@@ -123,8 +123,19 @@ typedef void * QueueSetMemberHandle_t;
                                                  );\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, queue's 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 can instead optionally\r
+ * provide the memory that will get used by the queue.  xQueueCreateStatic()\r
+ * therefore allows a queue to be created without using any dynamic memory\r
+ * allocation.\r
  *\r
  * @param uxQueueLength The maximum number of items that the queue can contain.\r
  *\r
@@ -170,7 +181,98 @@ typedef void * QueueSetMemberHandle_t;
  * \defgroup xQueueCreate xQueueCreate\r
  * \ingroup QueueManagement\r
  */\r
-#define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( uxQueueLength, uxItemSize, queueQUEUE_TYPE_BASE )\r
+#define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( uxQueueLength, uxItemSize, NULL, NULL, queueQUEUE_TYPE_BASE )\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, queue's 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 can instead optionally\r
+ * provide the memory that will get used by the queue.  xQueueCreateStatic()\r
+ * therefore allows a queue to be created without using any dynamic memory\r
+ * allocation.\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 pucQueueStorageBuffer is NULL then the memory\r
+ * used to hold items stored in the queue will be allocated dynamically, just as\r
+ * when a queue is created using xQueueCreate().  If pxQueueStorageBuffer is not\r
+ * NULL then it must point to a uint8_t array that is at least large enough to\r
+ * hold the maximum number of items that can be in the queue at any one time -\r
+ * which is ( uxQueueLength * uxItemsSize ) bytes.\r
+ *\r
+ * @param pxQueueBuffer If pxQueueBuffer is NULL then the memory required to\r
+ * hold the queue's data structures will be allocated dynamically, just as when\r
+ * a queue is created using xQueueCreate().  If pxQueueBuffer is not NULL then\r
+ * it must point to a variable of type StaticQueue_t, which will then be used to\r
+ * hold the queue's data structure, removing the need for the memory to be\r
+ * allocated dynamically.\r
+ *\r
+ * @return If the queue is successfully create then a handle to the newly\r
+ * created queue is returned.  If the queue cannot be created then 0 is\r
+ * 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 was used.  Therefore xQueue1 is now a handle to a valid queue.\r
+\r
+       // ... Rest of task code.\r
+ }\r
+ </pre>\r
+ * \defgroup xQueueCreate xQueueCreate\r
+ * \ingroup QueueManagement\r
+ */\r
+#if( configSUPPORT_STATIC_ALLOCATION == 1 )\r
+       #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) )\r
+#endif /* configSUPPORT_STATIC_ALLOCATION */\r
 \r
 /**\r
  * queue. h\r
@@ -1478,8 +1580,8 @@ BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTi
  * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling\r
  * these functions directly.\r
  */\r
-QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r
-QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION;\r
+QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION;\r
+QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION;\r
 void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
@@ -1517,7 +1619,7 @@ BaseType_t xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION
  * 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
@@ -1531,15 +1633,30 @@ BaseType_t xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) PRIVILEGED_FUNCTION
  *\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
+ * The registry is provided as a means for kernel aware debuggers to\r
+ * locate queues, semaphores and mutexes.  Call pcQueueGetQueueName() 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
+#if( configQUEUE_REGISTRY_SIZE > 0 )\r
+       const char *pcQueueGetQueueName( QueueHandle_t xQueue );\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
-QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r
+QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
  * Queue sets provide a mechanism to allow a task to block (pend) on a read\r