You are here

xStreamBufferSend

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

Назад: [xStreamBufferCreateStaticWithCallback()] Вверх: [ИПП: Буферы потока] Вперёд: [xStreamBufferSendFromISR()]

 

xStreamBufferSend()

Функция объявляется в файле stream_buffer.h, кроме того, в проект должен быть включён файл исходного кода FreeRTOS/source/stream_buffer.c.

size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
                          const void *pvTxData,
                          size_t xDataLengthBytes,
                          TickType_t xTicksToWait );

Функция отправляет байты в буфер потока. Байты передаются копированием в потоковый буфер.

ПРИМЕЧАНИЕ: Уникальная среди объектов FreeRTOS реализация буфера потока (а также реализация буфера сообщений, поскольку буферы сообщений построены поверх буферов потока) предполагает, что есть только одна задача или прерывание, которые будут записывать в буфер (отправитель), и только одна задача или прерывание, которые будут считывать из буфера (получатель). Отправитель и получатель могут быть разными задачами или прерываниями, но, в отличие от других объектов FreeRTOS, небезопасно иметь несколько разных отправителей или несколько разных получателей. Если должно быть несколько разных отправителей, то программист должен поместить каждый вызов функции ИПП записи (например, xStreamBufferSend()) внутрь критической секции и использовать время блокировки на отправке, равное 0. Аналогично, если должно быть несколько разных получателей, то программист должен поместить каждый вызов функции API чтения (например, xStreamBufferReceive()) внутрь критической секции и использовать время блокировки на приеме, равное 0.

Используйте xStreamBufferSend() для отправки данныых в буфер потока из задачи. А для отправки в буфер потока из обработчика прерывания следует использовать вызов ИПП xStreamBufferSendFromISR().

Параметры

xStreamBuffer Хэндлер буфера потока, в который будут отправлены данные.
pvTxData Указатель на буфер, содержащий байты, которые будут скопированы в буфер потока.
xDataLengthBytes Максимальное количество байтов, которое будет скопировано из pvTxData в буфер потока.
xTicksToWait Максимальное время, в течение которого задача будет оставаться в заблокированном состоянии, ожидая освобождения достаточного места в буфере потока, если его слишком мало для размещения xDataLengthBytes. Если время блокировки задачи истечёт ранее, чем в буфере потока появится необходимое место, то в буфер потока будет скопировано столько байтов, сколько возможно. Время блокировки указывается в тиках ядра FreeRTOS, поэтому физическое время зависит от частоты тиков. Макрос pdMS_TO_TICKS() можно использовать для преобразования времени, указанного в миллисекундах, во время, указанное в тиках. Установка xTicksToWait в portMAX_DELAY заставит задачу ждать бесконечно (без тайм-аута), при условии, что INCLUDE_vTaskSuspend установлен в 1 в файле FreeRTOSConfig.h. И если задача находится в заблокированном состоянии, она не использует процессорное время.

Возвращаемое значение

Количество байтов, отправленное в буфер потока. Если в буфере потока не достаточно места для размещения всех байтов, и за время ожидания в заблокированном состоянии его не появится, то будет возвращено будет количество байтов, фактически сохранённое в буфере потока.

Пример использования:

void vAFunction( StreamBufferHandle_t xStreamBuffer )
{
    size_t              xBytesSent;
    uint8_t             ucArrayToSend[] = { 0, 1, 2, 3 };
    char                *pcStringToSend = "String to send";
    const TickType_t    x100ms          = pdMS_TO_TICKS( 100 );

    /* Отправляем массив в буфер потока, блокируя задачу не более, чем
    на 100мс для ожидания необходимого места в буфере потока. */
    xBytesSent = xStreamBufferSend( xStreamBuffer,
                                   ( void * ) ucArrayToSend,
                                   sizeof( ucArrayToSend ),
                                   x100ms );

    if( xBytesSent != sizeof( ucArrayToSend ) )
    {
        /* Вызов xStreamBufferSend() завершился по таймауту, не дождавшись
        необходимого места в буфере потока, но в процессе работы в буфере потока
        было сохранено xBytesSent байтов. */
    }

    /* Отправляем строку в буфер потока. Если места в буфере потока недостаточно,
    функция возвращает управление немедленно, без ожидания освобождения места. */
    xBytesSent = xStreamBufferSend( xStreamBuffer,
                                    ( void * ) pcStringToSend,
                                    strlen( pcStringToSend ), 0 );

    if( xBytesSent != strlen( pcStringToSend ) )
    {
        /* Всю строку целиком отправить в буфер не удалось, поскольку
        в буфере потока нет необходимого места. Но xBytesSent байтов было
        отправлено. Позже можно будет повторить попытку для отправки
        оставшихся байтов. */
    }
}
Hobby's category: