FreeRtos在ADC任务和Streaming Task中的问题

FreeRtos problems in ADC task and Streaming Task

我有一个使用 4 个通道并使用 DMA 进行传输的 ADC 任务我还有一个流式客户端,它通过 TCP 套接字流式传输 ADC 数据我使 ADS 任务的优先级低于流式客户端。

我正在发送一个整数,用于选择哪个 ADC 通道被选为流式客户端的消息队列。

问题是我在发送那个 adc 通道整数时出现队列溢出。

ADC 任务

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;
        }

您似乎将队列已满状态视为错误,而通常情况下并非如此 - 队列的目的之一是对生产者施加背压,而这正是您应该在这里做的:如果流式任务无法消化你扔给它的数据,你只是产生了太多。

当消费者代码中没有非活动(等待 I/O)时间段时,消费者的优先级仅有助于将队列填充状态保持在合理的水平。只要您的消费者有这样的等待期,仅凭优先级并不能使您免于接受队列可能已满的事实。