Select your cookie preferences

We use essential cookies and similar tools that are necessary to provide our site and services. We use performance cookies to collect anonymous statistics, so we can understand how customers use our site and make improvements. Essential cookies cannot be deactivated, but you can choose “Customize” or “Decline” to decline performance cookies.

If you agree, AWS and approved third parties will also use cookies to provide useful site features, remember your preferences, and display relevant content, including relevant advertising. To accept or decline all non-essential cookies, choose “Accept” or “Decline.” To make more detailed choices, choose “Customize.”

Updated Mar 2025

crQUEUE_SEND

[Co-Routine Specific]

croutine.h

1crQUEUE_SEND(
2 CoRoutineHandle_t xHandle,
3 QueueHandle_t xQueue,
4 void *pvItemToQueue,
5 TickType_t xTicksToWait,
6 BaseType_t *pxResult
7 )

crQUEUE_SEND
is a macro. The data types are shown in the prototype above for reference only.

The macro's

crQUEUE_SEND()
and
crQUEUE_RECEIVE()
are the co-routine equivalent to the
xQueueSend()
and
xQueueReceive()
functions used by tasks.

crQUEUE_SEND
and
crQUEUE_RECEIVE
can only be used from a co-routine whereas
xQueueSend()
and
xQueueReceive()
can only be used from tasks. Note that co-routines can only send data to other co-routines. A co-routine cannot use a queue to send data to a task or vice versa.

crQUEUE_SEND
can only be called from the co-routine function itself - not from within a function called by the co-routine function. This is because co-routines do not maintain their own stack.

See the co-routine section of the web documentation for information on passing data between tasks and co-routines and between ISR's and co-routines.

Parameters:

  • xHandle

    The handle of the calling co-routine. This is the

    xHandle
    parameter of the co-routine function.

  • xQueue

    The handle of the queue on which the data will be posted. The handle is obtained as the return value when the queue is created using the

    xQueueCreate()
    API function.

  • pvItemToQueue

    A pointer to the data being posted onto the queue. The number of bytes of each queued item is specified when the queue is created. This number of bytes is copied from

    pvItemToQueue
    into the queue itself.

  • xTickToDelay

    The number of ticks that the co-routine should block to wait for space to become available on the queue, should space not be available immediately. The actual amount of time this equates to is defined by

    configTICK_RATE_HZ
    (set in FreeRTOSConfig.h). The constant
    portTICK_PERIOD_MS
    can be used to convert ticks to milliseconds (see example below).

  • pxResult

    The variable pointed to by

    pxResult
    will be set to
    pdPASS
    if data was successfully posted onto the queue, otherwise it will be set to an error defined within ProjDefs.h.

Example usage:

1// Co-routine function that blocks for a fixed period then posts a number onto
2// a queue.
3static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle,
4 UBaseType_t uxIndex )
5{
6 // Variables in co-routines must be declared static if they must maintain
7 // value across a blocking call.
8 static BaseType_t xNumberToPost = 0;
9 static BaseType_t xResult;
10
11 // Co-routines must begin with a call to crSTART().
12 crSTART( xHandle );
13
14 for( ;; )
15 {
16 // This assumes the queue has already been created.
17 crQUEUE_SEND( xHandle,
18 xCoRoutineQueue,
19 &xNumberToPost,
20 NO_DELAY,
21 &xResult );
22
23 if( xResult != pdPASS )
24 {
25 // The message was not posted!
26 }
27
28 // Increment the number to be posted onto the queue.
29 xNumberToPost++;
30
31 // Delay for 100 ticks.
32 crDELAY( xHandle, 100 );
33 }
34
35 // Co-routines must end with a call to crEND().
36 crEND();
37 }