Queue

Queues offer inter-task communication of a user-definable fixed length. The developer specifies the message length when creating the queue. This is done by calling QueueHandle_t queueName = xQueueCreate(queueLength, elementSize). The input parameter queueLength specifies the number of elements the queue can hold. elementSize specifies the size of each element in bytes. All elements in the queue must be of equal size. When the queue is created, tasks can communicate with each other by sending and receiving data through the queue. The queue is of FIFO structure (first in/first out) such that the receiver will always receive the item that was first inserted.

The functions for sending to and receiving from a queue are:
xQueueSend(queueName, *itemToQueue, ticksToWait)
xQueueReceive(queueName, *buffer, ticksToWait)

The last argument, ticksToWait, specifies how long the sending task should block when waiting for available space in a full queue. Similarly, it specifies how long a receiving task will block when waiting to receive any elements from an empty queue. The define portMAX_DELAY can be used here. If INCLUDE_vTaskSuspend in the configuration file is set to 1, then portMAX_DELAY will cause the task to block indefinitely (without a time-out). If set to 0, the blocking time will be 0xFFFF.

If the send and receive functions are to be called form an ISR, xQueueSendFromISR() and xQueueReceiveFromISR() must be used.