xQueueSendFromISR

[Queue Management]

queue.h

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

これは xQueueGenericSendFromISR () を呼び出すマクロです。
これはxQueueSendToBackFromISR () と xQueueSendToFrontFromISR () マクロが含まれていないFreeRTOS.org のバージョンとの後方互換性のために含まれます。

待ち行列の後部の中にアイテムをポストする。 これは割り込みサービスルーチンの中からこの関数を安全に使用できます。
アイテムは参照ではなくコピーによって待ち行列に入れられるので、特にISRからのコールでは、小さいアイテムを待ち行列に入れのが推奨されるが。ほとんどの場合、アイテムへのポインタを格納することが望ましい。

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

pvItemToQueue   待ち行列の上に置かれるべきアイテムへのポインタ。 待ち行列が作成した時、待ち行列が持つアイテムの大きさは定義された、そのバイト数 pvItemToQueue から待ち行列格納エリアへコピーされる。
もし待ち行列に送信することがタスクのブロック解除につながれば、xQueueSendFromISR () が * pxHigherPriorityTaskWoken を pdTRUE にセットする、そしてブロック解除されたタスクは現在走っているタスクより高い優先度を持っている。 もし xQueueSendFromISR () がこの値をpdTRUE にセットしたなら、割り込み終了前に、コンテキストスイッチを実行する事が求められる。

リターン:
もしデータが待ち行列に送信成功ならばpdTRUEを返す、さもなければ 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. */  
        xQueueSendFromISR( 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 (); 
    } 
}