首页 > 解决方案 > ADC 任务和流式任务中的 FreeRtos 问题

问题描述

我有一个使用 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;
        }

标签: cfreertosrtos

解决方案


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

只有当消费者代码中没有非活动(等待 I/O)周期时,消费者的优先级才有助于将队列填充状态保持在合理的水平。一旦您的消费者有这样的等待期,单靠优先级并不能让您免于接受队列可能已满。


推荐阅读