Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS xQueueSendFromISR() API function descriptions
| Назад: [xQueueSend()] | Вверх: [ИПП: Очереди] | Вперёд: [xQueueSendToBack()] |
Функция объявляется в файле queue.h
BaseType_t xQueueSendFromISR
(
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);Это макрос, который вызвает xQueueGenericSendFromISR(). Он включён в состав FreeRTOS для обратной совместимости с версиями, в которых не реализованы макросы xQueueSendToBackFromISR() и xQueueSendToFrontFromISR(). И этот макрос эквивалентен макросу xQueueSendToBackFromISR().
Макрос помещает элемент в конец очереди. Элемент размещается копированием (НЕ по ссылке). Данный макрос предназначен для вызова из обработчиков прерываний. Если элемент имеет большой размер, желательно размещать в очереди указатель на элемент вместо самого элемента. Это может быть важно при вызове из обработчика прерывания.
Параметры
| xQueue | Хэндлер очереди, в которую необходимо поместить элемент. |
| pvItemToQueue | Указатель на элемент, который будет помещён в очередь. При этом количество байт, скопированное из pvItemToQueue в область хранения очереди, определяется размером элемента очереди. А собственно размер элемента указывается при создании очереди. |
| pxHigherPriorityTaskWoken | xQueueSendFromISR() установит значение переменной *pxHigherPriorityTaskWoken в pdTRUE, если отправка в очередь вызвала разблокировку некоей задачи, и приоритет этой задачи выше, чем приоритет текущей запущенной задачи. Если вызов xQueueSendFromISR() установит значение этой переменной в pdTRUE, то необходимо запросить переключение контекста ДО выхода из прерывания. Начиная с версии FreeRTOS V7.3.0 pxHigherPriorityTaskWoken является необязательным параметром, и может быть установлен в NULL |
Возвращаемое значение
pdTRUE если элемент был помещён в очередь. Иначе возвращается errQUEUE_FULL.
Пример использования:
void vBufferISR( void )
{
char cIn;
BaseType_t xHigherPriorityTaskWoken;
/* Изначально считается, что никакая задача не разбужена. */
xHigherPriorityTaskWoken = pdFALSE;
/* В цикле забираем байты из входного буфера до его опустошения. */
do
{
/* Получаем очередной байт из буфера. */
cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
/* Помещаем байт в очередь. */
xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
} while( portINPUT_BYTE( BUFFER_COUNT ) );
/* Данные во входном буфере закончились. Теперь мы можем переключить контекст, если это необходимо. */
if( xHigherPriorityTaskWoken )
{
/* Макрос, используемый здесь, зависит от конкретной реализации порта ОС. */
taskYIELD_FROM_ISR();
}
}