croutine.h
void crQUEUE_RECEIVE( xCoRoutineHandle xHandle, xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait, portBASE_TYPE *pxResult )
crQUEUE_RECEIVE はマクロです。 上記のプロトタイプで示すデータ型は参照用です。マクロの crQUEUE_SEND() と crQUEUE_RECEIVE()
は、タスクで使われるxQueueSend () 、xQueueReceive ()と同等の、コルーチンで使うマクロです。xQueueSend
() と xQueueReceive () がタスク専用に対して、 crQUEUE_SEND と crQUEUE_RECEIVE はコルーチン専用です。
コルーチン用はデータを他のコルーチンに送ることのみできることに注意してください。 コルーチンは待ち行列を使ってデータをタスクに送信/受信するために使うことはできません。
crQUEUE_RECEIVEはコルーチン関数自身からのみ呼び出すことができます-(コルーチン関数によって呼び出された関数の中からはではなく)。 これはコルーチンそれ自身のスタックを保守しないからです。
タスクとコルーチンの間、 ISR とコルーチンの間でのデータ受け渡しについてのインフォメーションは Web ドキュメンテーションのコルーチンのセクションを見てください。
パラメータ: xHandle 呼び出した通話コルーチンのハンドル。 これはコルーチン関数の xHandle パラメータです。
pxQueue データを受信する待ち行列のハンドル。 このハンドルは、待ち行列が xQueueCreate () API 機能を使って作成されるとき、リターン値として取得される。
pvBuffer 受信アイテムがコピーされるバッファ。 待ち行列の各項目のバイト長は、待ち行列が作成されるとき指定されます。 項目のバイト長分pvBuffer にコピーされます。
xTickToDelay コルーチンがデータが待ち行列から利用可能になるのを待つためにブロックするチック数、データがいつでも利用可能であるとは限りません。
この実際の時間量は(FreeRTOSConfig.h にある) configTICK_RATE_HZ によって定義されます。 portTICK_RATE_MS
はチックをミリ秒に変換するために使うことができます(crQUEUE_SEND 例参照)。
pxResult データが待ち行列から取得に成功したなら、 pxResult変数にpdPASS が返る、さもなければ、 ProjDefs.h
の中で定義されるエラーコードが返る。
使用例:
// A co-routine receives the number of an LED to flash from a queue. It
// blocks on the queue until the number is received.
static void prvCoRoutineFlashWorkTask( 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 xResult;
static unsigned portBASE_TYPE uxLEDToFlash;
// All co-routines must start with a call to crSTART().
crSTART( xHandle );
for( ;; )
{
// Wait for data to become available on the queue.
crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
if( xResult == pdPASS )
{
// We received the LED to flash - flash it!
vParTestToggleLED( uxLEDToFlash );
}
}
crEND();
}