Function esp_idf_svc::sys::xQueueReceiveFromISR

source ·
pub unsafe extern "C" fn xQueueReceiveFromISR(
    xQueue: *mut QueueDefinition,
    pvBuffer: *mut c_void,
    pxHigherPriorityTaskWoken: *mut i32,
) -> i32
Expand description

Receive an item from a queue. It is safe to use this function from within an interrupt service routine.

@param xQueue The handle to the queue from which the item is to be received.

@param pvBuffer Pointer to the buffer into which the received item will be copied.

@param pxHigherPriorityTaskWoken A task may be blocked waiting for space to become available on the queue. If xQueueReceiveFromISR causes such a task to unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will remain unchanged.

@return pdTRUE if an item was successfully received from the queue, otherwise pdFALSE.

Example usage: @code{c}

QueueHandle_t xQueue;

// Function to create a queue and post some values. void vAFunction( void *pvParameters ) { char cValueToPost; const TickType_t xTicksToWait = ( TickType_t )0xff;

// Create a queue capable of containing 10 characters. xQueue = xQueueCreate( 10, sizeof( char ) ); if( xQueue == 0 ) { // Failed to create the queue. }

// …

// Post some characters that will be used within an ISR. If the queue // is full then this task will block for xTicksToWait ticks. cValueToPost = ‘a’; xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); cValueToPost = ‘b’; xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );

// … keep posting characters … this task may block when the queue // becomes full.

cValueToPost = ‘c’; xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); }

// ISR that outputs all the characters received on the queue. void vISR_Routine( void ) { BaseType_t xTaskWokenByReceive = pdFALSE; char cRxedChar;

while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) ) { // A character was received. Output the character now. vOutputCharacter( cRxedChar );

 // If removing the character from the queue woke the task that was
 // posting onto the queue xTaskWokenByReceive will have been set to
 // pdTRUE.  No matter how many times this loop iterates only one
 // task will be woken.

}

if( xTaskWokenByReceive != ( char ) pdFALSE; { taskYIELD (); } } @endcode \ingroup QueueManagement