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