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)时间段时,消费者的优先级仅有助于将队列填充状态保持在合理的水平。只要您的消费者有这样的等待期,仅凭优先级并不能使您免于接受队列可能已满的事实。
我有一个使用 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)时间段时,消费者的优先级仅有助于将队列填充状态保持在合理的水平。只要您的消费者有这样的等待期,仅凭优先级并不能使您免于接受队列可能已满的事实。