Перевод может содержать ошибки. Читайте первоисточник: xQueueOverwrite()
| Назад: [xQueueReset] | Вверх: [ИПП: Очереди] | Вперёд: [xQueueOverwriteFromISR()] |
Функция объявляется в файле queue.h
BaseType_t xQueueOverwrite
(
QueueHandle_t xQueue,
const void *pvItemToQueue
);
Это макрос, который вызвает xQueueGenericSend().
Этот макрос является разновидностью xQueueSendToBack(), и помещает элемент в очередь, даже если она заполнена, перезаписывая при этом данные, которые уже хранятся в очереди.
Макрос предназначен для использования с очередями, длина которых равна 1 (иначе сработает макрос configASSERT()), а это означает, что очередь либо пуста, либо заполнена. Элемент размещается копированием (НЕ по ссылке). Данный макрос нельзя вызывать из обработчиков прерываний. Если необходимо выполнить вызов из обработчика прерывания, следует использовать xQueueOverwriteFromISR().
Параметры
| xQueue | Хэндлер очереди, в которую необходимо поместить элемент. |
| pvItemToQueue | Указатель на элемент, который будет помещён в очередь. При этом количество байт, копируемое из pvItemToQueue в область хранения очереди, определяется размером элемента очереди. А собственно размер элемента указывается при создании очереди. |
Возвращаемое значение
xQueueOverwrite() это макрос, который вызвает xQueueGenericSend(), следовательно мог бы иметь те же возвращаемые значения, что и, например, xQueueSendToFront(). Однако pdPASS это единственно возможное возвращаемое значение, т.к. xQueueOverwrite() будет отправлять элемент в очередь, даже если она уже заполнена.
Пример использования:
void vFunction( void *pvParameters )
{
QueueHandle_t xQueue;
unsigned long ulVarToSend, ulValReceived;
/* Создаём очередь, содержащую один элемент типа unsigned long.
Строго рекомендуется НЕ использовать вызов xQueueOverwrite()
для очередей, которые могут содержать более одного элемента.
Дело в том, что если длина больше единицы, сработает макрос
configASSERT(), если таковой определён в пользовательском проекте. */
xQueue = xQueueCreate( 1, sizeof( unsigned long ) );
/* Отправляем в очередь значение 10, используя xQueueOverwrite(). */
ulVarToSend = 10;
xQueueOverwrite( xQueue, &ulVarToSend );
/* Если теперь просмотреть первый элемент в очереди, он будет равен 10, но
сам элемент при этом останется в очереди. Используем время блокировки 0,
т.к. знаем, что очередь сейчас содержит элемент.
ulValReceived = 0;
xQueuePeek( xQueue, &ulValReceived, 0 );
if( ulValReceived != 10 )
{
/* Ошибка, если только другая задача не удалила элемент из очереди. */
}
/* Очередь по-прежденему заполнена. Используем вызов xQueueOverwrite()
для перезаписи сохранённого элемента в очереди на новое значение,
пусть это будет 100. */
ulVarToSend = 100;
xQueueOverwrite( xQueue, &ulVarToSend );
/* На этот раз "забираем" значение из очереди, оставляя её пустой.
Время блокировки также указываем 0, т.к. знаем, что элемент в очереди есть. */
xQueueReceive( xQueue, &ulValReceived, 0 );
/* Полученное из очереди значение должно быть последним записанным в неё, т.к.
несмотря на то, что очередь в момент перезаписи была уже полной, перезапись
всё равно выполняется. */
if( ulValReceived != 100 )
{
/* Ошибка, если только другая задача не использует эту же очередь.
}
/* ... */
}