xSemaphoreGiveFromISR() を呼ぶなら portYIELD_FROM_ISR()も呼ぶ

FreeRTOSのTIPSです。

ITRONのStandard Profileの場合、ISRの中でisig_sem()を呼びその結果タスク切り替えが必要になると、ISRからタスクコンテキストに戻った際に即座にタスク切り替えが発生します。

この感覚でFreeRTOSのxSemaphoreGiveFromISR()を使うと脚をすくわれます。このAPIを呼んだ結果タスク切り替えが必要になっても、ISRからタスクコンテキストに戻ってタスク切り替えが発生するのは、次回明示的にタスクスイッチが呼ばれた時です。

この仕様には納得が行かないのですが、ISRから出た時に即座にタスク切り替えを起こしたければportYIELD_FROM_ISR()を呼ぶしかありません。

portYIELD_FROM_ISR()の引数は明確に定められていない(xSemaphoreGiveFromISRの対応する引数はobsoleteになっている)のですが、trueを渡しておけばよいでしょう。この引数はSTM32F7のポートでは無視されています。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください