queue.h
portBASE_TYPE xQueueSendToFrontFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken );
これは xQueueGenericSendFromISR() を呼び出すマクロです。
待ち行列の前部にアイテムをポストする。 割り込みサービスルーチンの中からこの関数を安全に使用することができます。アイテムは参照ではなくコピーによって待ち行列に入れられるので、小さなアイテムにするかポインタに代える方が望ましい。
パラメータ:
xQueue アイテムがポストするべき待ち行列へのハンドル。
pvItemToQueue 待ち行列の上に置かれるべきアイテムへのポインタ。 待ち行列の作成時、待ち行列のアイテムの大きさを定義した、このバイト数分pvItemToQueue
から待ち行列格納エリアへコピーされる。
xTaskPreviouslyWoken もし待ち行列に送信することがタスクのブロック解除につながれば、xQueueSendToFrontFromISR
() が * pxHigherPriorityTaskWoken を pdTRUE にセットする、そしてブロック解除されたタスクは現在走っているタスクより高い優先度を持つ。
もし xQueueSendToFrontFromISR () がこの値を pdTRUE にセットするなら、割り込み終了前に、コンテキストスイッチを実行することが求められる。
リターン:
もし待ち行列に送信が成功した場合pdPASS が返る、さもなければ errQUEUE_FULL が返る。
使用例:
void vBufferISR( void ) { portCHAR cIn; portBASE_TYPE xHigherPriorityTaskWoken; /* We have not woken a task at the start of the ISR. */ xHigherPriorityTaskWoken = pdFALSE; /* Obtain a byte from the buffer. */ cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); if( cIn == EMERGENCY_MESSAGE ) { /* Post the byte to the front of the queue. */ xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); } else { /* Post the byte to the back of the queue. */ xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); } /* Did sending to the queue unblock a higher priority task? */ if( xHigherPriorityTaskWoken ) { /* Actual macro used here is port specific. */ taskYIELD_FROM_ISR (); } }