bugfix> c > 投稿

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を待機している)期間がない場合にのみ、キューの充填状態を適切なレベルに維持するのに役立ちます。消費者にそのような待機期間があるとすぐに、優先順位だけでは、キューがいっぱいになることを受け入れることから解放されません。

あなたの答え