Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS xQueueSendToFront() API function descriptions
| Назад: [xQueueSendToBackFromISR()] | Вверх: [ИПП: Очереди] | Вперёд: [xQueueSendToFrontFromISR()] |
Функция объявляется в файле queue.h
BaseType_t xQueueSendToFront
(
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);Это макрос, который вызвает xQueueGenericSend().
Макрос помещает элемент в начало очереди. Элемент размещается копированием (НЕ по ссылке). Данный макрос нельзя вызывать из обработчиков прерываний. Если необходимо поместить элемент в очередь из обработчика прерывания, следует использовать xQueueSendToFrontFromISR().
Параметры
| xQueue | Хэндлер очереди, в которую необходимо поместить элемент. |
| pvItemToQueue | Указатель на элемент, который будет помещён в очередь. При этом количество байт, копируемое из pvItemToQueue в область хранения очереди, определяется размером элемента очереди. А собственно размер элемента указывается при создании очереди. |
| xTicksToWait | Максимальное время, в течение которого задача будет блокироваться в ожидании освобождения места в очереди, если она уже заполнена. Время задаётся в тиках ядра ОС. Для перевода реального времени в тики ядра ОС используется константа portTICK_PERIOD_MS или макрос pdMS_TO_TICKS(). Если значение xTicksToWait установлено равным 0, то возврат будет выполнен немедленно, без блокировки задачи, даже если очередь уже заполнена. Если значение xTicksToWait установлено равным portMAX_DELAY и параметр INCLUDE_vTaskSuspend во FreeRTOSConfig.h установлен в '1', то задача будет блокироваться на неопределённое время до тех пор, пока в очереди не появится место. |
Возвращаемое значение
pdTRUE если элемент был помещён в очередь. Иначе возвращается errQUEUE_FULL.
Пример использования:
struct AMessage
{
char ucMessageID;
char ucData[ 20 ];
} xMessage;
unsigned long ulVar = 10UL;
void vATask( void *pvParameters )
{
QueueHandle_t xQueue1, xQueue2;
struct AMessage *pxMessage;
/* Создаём очередь, в которой может содержаться до 10 элементов unsigned long. */
xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
/* Создаём очередь, в которой может содержаться до 10 указателей на структуры AMessage. */
/* Т.к. эти структуры содержат относительно много данных, их желательно передавать по указателю, а не напрямую. */
xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
/* ... */
if( xQueue1 != 0 )
{
/* Отправляем в очередь значение unsigned long. Ждём не более 10 тиков ядра ОС для освобождения необходимого места в очереди. */
if( xQueueSendToFront( xQueue1,
(void *) &ulVar,
(TickType_t) 10 ) != pdPASS )
{
/* Не удалось разместить элемент в очереди даже после ожидания в течение 10 тиков ядра ОС. */
}
}
if( xQueue2 != 0 )
{
/* Отправляем в очередь указатель на объект структуры AMessage. Не блокируем задачу в случае заполненности очереди. */
pxMessage = & xMessage;
xQueueSendToFront( xQueue2,
(void*) &pxMessage,
(TickType_t) 0 );
}
/* ... */
}