Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS xQueueSendToBackFromISR() API function descriptions
| Назад: [xQueueSendToBack()] | Вверх: [ИПП: Очереди] | Вперёд: [xQueueSendToFront()] |
Функция объявляется в файле 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();
}
}