You are here

xQueueSendToFrontFromISR

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

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

 

xQueueSendToFrontFromISR()

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

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

Это макрос, который вызвает xQueueGenericSendFromISR().

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

Параметры

xQueue Хэндлер очереди, в которую необходимо поместить элемент.
pvItemToQueue Указатель на элемент, который будет помещён в очередь. При этом количество байт, скопированное из pvItemToQueue в область хранения очереди, определяется размером элемента очереди. А собственно размер элемента указывается при создании очереди.
pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() установит значение переменной *pxHigherPriorityTaskWoken в pdTRUE, если отправка в очередь вызвала разблокировку некоей задачи, и приоритет этой задачи выше, чем приоритет текущей запущенной задачи. Если вызов xQueueSendToFrontFromISR() установит значение этой переменной в 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 );

        if( cIn == EMERGENCY_MESSAGE )
        {
            /* Помещаем экстренное сообщени в начало очереди. */
            xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
        }
        else
        {
            /* Обычное сообщение помещаем в конец очереди. */
            xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
        }
    } while( portINPUT_BYTE( BUFFER_COUNT ) );

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