xQueueSendToBackFromISR

[Queue Management]

queue.h

portBASE_TYPE xQueueSendToBackFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken );

これは xQueueGenericSendFromISR () を呼び出すマクロです。

待ち行列の後部に項目をポストする。
割り込みサービスルーチンの中で安全にこの関数を使用できます。アイテムは参照ではなくコピーによって待ち行列に入れられる、そして特にISR から呼ばれた時、待ち行列に入れるアイテムは小さい方が望ましい。

パラメータ:
xQueue   アイテムがポストすべき待ち行列へのハンドル。

pvItemToQueue   待ち行列の上に置かれるべきアイテムへのポインタ。 待ち行列が作成した時、待ち行列が持つアイテムの大きさは定義された、そのバイト数分 pvItemToQueue から待ち行列格納エリアへコピーされる。

xTaskPreviouslyWoken   、もし待ち行列に送信することがタスクのブロック解除につながれば、xQueueSendFromISR() が * pxHigherPriorityTaskWoken を pdTRUE にセットする、そしてブロック解除されたタスクは現在走っているタスクより高い優先度を持つ。 もし xQueueSendToBackFromISR() がこの値をpdTRUE にセットするなら、割り込み終了前に、コンテキストスイッチを実行する事が求められる。

リターン:
もし待ち行列に送信が成功した場合pdPASS が返る、さもなければ errQUEUE_FULL が返る。

(ISR が1コール当たり複数の値を得ることができる) buffered IO のための使用例:

void vBufferISR( void )
{
portCHAR cIn;
portBASE_TYPE xHigherPriorityTaskWoken;

    /* We have not woken a task at the start of the ISR. */
    xHigherPriorityTaskWoken = pdFALSE;

    /* Loop until the buffer is empty. */
    do
    {
        /* Obtain a byte from the buffer. */
        cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );                                            

        /* Post the byte. */
        xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );

    } while( portINPUT_BYTE( BUFFER_COUNT ) );

    /* Now the buffer is empty we can switch context if necessary. */
    if( xHigherPriorityTaskWoken )
    {
        /* Actual macro used here is port specific. */
        taskYIELD_FROM_ISR ();
    }
}