You are here

xQueueSendToBackFromISR

Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS xQueueSendToBackFromISR() API function descriptions

Назад: [xQueueSendToBack()] Вверх: [ИПП: Очереди] Вперёд: [xQueueSendToFront()]

 

xQueueSendToBackFromISR()

Функция объявляется в файле queue.h

BaseType_t xQueueSendToBackFromISR
    (
        QueueHandle_t   xQueue,
        const void      *pvItemToQueue,
        BaseType_t      *pxHigherPriorityTaskWoken
    );

Это макрос, который вызвает xQueueGenericSendFromISR(). И этот макрос эквивалентен макросу xQueueSendFromISR().

Макрос помещает элемент в конец очереди. Элемент размещается копированием (НЕ по ссылке). Данный макрос предназначен для вызова из обработчиков прерываний. Если элемент имеет большой размер, желательно размещать в очереди указатель на элемент вместо самого элемента. Это может быть важно при вызове из обработчика прерывания.

Параметры

xQueue Хэндлер очереди, в которую необходимо поместить элемент.
pvItemToQueue Указатель на элемент, который будет помещён в очередь. При этом количество байт, скопированное из pvItemToQueue в область хранения очереди, определяется размером элемента очереди. А собственно размер элемента указывается при создании очереди.
pxHigherPriorityTaskWoken xQueueSendToBackFromISR() установит значение переменной *pxHigherPriorityTaskWoken в pdTRUE, если отправка в очередь вызвала разблокировку некоей задачи, и приоритет этой задачи выше, чем приоритет текущей запущенной задачи. Если вызов xQueueSendToBackFromISR() установит значение этой переменной в pdTRUE, то необходимо запросить переключение контекста ДО выхода из прерывания. Начиная с версии FreeRTOS V7.3.0 pxHigherPriorityTaskWoken является необязательным параметром, и может быть установлен в NULL

Возвращаемое значение

pdPASS если элемент был помещён в очередь. Иначе возвращается errQUEUE_FULL.

Пример использования:

/* Пример использования буферизованного ввода. Т.е. за один вызов обработчика прерывания можно получить несколько байт данных. */

void vBufferISR( void )
{
    char cIn;
    BaseType_t xHigherPriorityTaskWoken;

    /* Изначально считается, что никакая задача не разбужена. */
    xHigherPriorityTaskWoken = pdFALSE;

    /* В цикле забираем байты из входного буфера до его опустошения. */
    do
    {
        /* Получаем очередной байт из буфера. */
        cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );

        /* Помещаем байт в очередь. */
        xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    } while( portINPUT_BYTE( BUFFER_COUNT ) );

    /* Данные во входном буфере закончились. Теперь мы можем переключить контекст, если это необходимо. */
    if( xHigherPriorityTaskWoken )
    {
        /* Макрос, используемый здесь, зависит от конкретной реализации порта ОС. */
        taskYIELD_FROM_ISR();
    }
}
Hobby's category: