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(); }