Проблемы FreeRtos в задачах ADC и Streaming Task - PullRequest
0 голосов
/ 25 мая 2018

У меня есть задача ADC, которая использует 4 канала и использует DMA для передачи. У меня также есть потоковый клиент, который передает данные ADC через сокет TCP. Я сделал задачу ADS более низким приоритетом, чем потоковый клиент.

Я посылаю целое число, которое выбирает, какой канал АЦП выбран в качестве очереди сообщений для потокового клиента.

Проблема в том, что я получаю переполнение очереди при отправке этого целого числа канала АЦП.

ADC TASK

if(bufferSelect != BUFFERS_NOT_READY)
        {
            if(xQueueSend(g_adcQueue, &bufferSelect,  0) != pdPASS)
            {
                throwError(ERROR_MESSAGE_QUEUE_FULL);
                PRINTF("%s\r\n", getErrorMessage(ERROR_MESSAGE_QUEUE_FULL));
            }
            bufferSelect = BUFFERS_NOT_READY;
        }

Потоковое задание клиента

/* obtain next buffer ready event */
        if(xQueueReceive(g_adcQueue, &bufferSelect, 0) == pdFALSE)
        {
            g_stopStreaming = true;
            continue;
        }

1 Ответ

0 голосов
/ 25 мая 2018

Похоже, вы обрабатываете состояние полной очереди как ошибку, которой обычно не является. Одна из целей очередей - оказать давление на производителя, и это именно то, что вы должны сделать здесь: Если задача потоковой передачивы не можете переварить данные, которые вы на него бросаете, вы просто производите слишком много.

Приоритет потребителя только помогает поддерживать состояние заполнения очереди на разумном уровне, когда нет неактивных (ожидание ввода-вывода) периоды в коде потребителя.Как только у вашего потребителя есть такие периоды ожидания, один приоритет не освобождает вас от принятия того, что очереди могут быть заполнены.

...