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;
}
回答 1 件
キューのフルステータスをエラーとして処理しているようですが、通常はそうではありません。キューの目的の1つは、プロデューサーにバックプレッシャーをかけることです。それがまさにここですべきことです。あなたがそれに投げかけているデータ、あなたは単にあまりにも多くを作り出しています。
消費者の優先度は、消費者コードに非アクティブな(I/Oを待機している)期間がない場合にのみ、キューの充填状態を適切なレベルに維持するのに役立ちます。消費者にそのような待機期間があるとすぐに、優先順位だけでは、キューがいっぱいになることを受け入れることから解放されません。