crQUEUE_SEND

[Co-Routine Specific]

croutine.h

crQUEUE_SEND( xCoRoutineHandle xHandle, xQueueHandle pxQueue, void *pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE *pxResult )

 crQUEUE_SEND はマクロです。 上記のプロトタイプで示すデータ型は参照用です。
crQUEUE_RECEIVE ()とcrQUEUE_SEND()は、タスクで使われる関数xQueueSend () と xQueueReceive ()と同等の、コルーチンで使うマクロです。
 xQueueSend () と xQueueReceive () はタスク専用に対して、 crQUEUE_SEND と crQUEUE_RECEIVE はコルーチン専用です。コルーチン用はデータを他のコルーチンに送ることのみできることに注意してください。 コルーチンが待ち行列を使ってデータをタスクに送る/受け取るために使うことができません。
 crQUEUE_SEND はコルーチン関数自身からのみ呼び出すことができます-(コルーチン関数によって呼び出された関数の中からはではなく)。 これはコルーチンがそれ自身のスタックを保守しないからです。

タスクとコルーチンの間、 ISR とコルーチンの間でのデータ受け渡しについてのインフォメーションは Web ドキュメンテーションのコルーチンのセクションを見てください。

パラメータ:
xHandle   呼び出しコルーチンのハンドル。 これはコルーチン関数の xHandle パラメータです。

pxQueue   データが送信される待ち行列のハンドル。 このハンドルは、待ち行列が xQueueCreate () API 機能を使って作成されるとき、リターン値として取得される。

pvItemToQueue   待ち行列に送信されるデータのポインタ。 待ち行列の各項目のバイト長は、待ち行列が作成されるとき指定されます。 pvItemToQueueのバイト長がpvItemToQueueから待ち行列自身にコピーされます。

xTickToDelay   コルーチンが、待ち行列の上のデータ空間が利用可能になるのを待つためにブロックするチック数で、データ空間がすぐに利用可能であるとは限らない。 この実際の時間量は(FreeRTOSConfig.h にある) configTICK_RATE_HZ によって定義されます。 portTICK_RATE_MS はチックをミリ秒に変換するために使うことができます(下の例参照)。

pxResult   待ち行列への送信が成功すれば、pxResult 変数にpdPASS が戻る、そうでなければProjDefs.h の中で定義されたエラー値がセットされる。

使用例:

 // Co-routine function that blocks for a fixed period then posts a number onto
 // a queue.
 static void prvCoRoutineFlashTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
 {
 // Variables in co-routines must be declared static if they must maintain value across a blocking call.
 static portBASE_TYPE xNumberToPost = 0;
 static portBASE_TYPE xResult;

    // Co-routines must begin with a call to crSTART().
    crSTART( xHandle );

    for( ;; )
    {
        // This assumes the queue has already been created.
        crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );

        if( xResult != pdPASS )
        {
            // The message was not posted!
        }

        // Increment the number to be posted onto the queue.
        xNumberToPost++;
 
        // Delay for 100 ticks.
        crDELAY( xHandle, 100 );
    }

    // Co-routines must end with a call to crEND().
    crEND();
 }