Previous: 6. クリティカルセクション |
Up: 6. クリティカルセクション |
Next: 6.2. 割込み無効化 |
サンプルプログラム |
freertos_critical_section_not_used |
クリティカルセクションとは、あるタスクの実行を、より優先度の高いタスクや、割込みによって中断させないための仕組みや、中断されない区間のことをいいます。実例を見た方がわかりやすいので、このサンプルプログラムをまずは実行してみてください。実行結果は以下の様になります。高速で表示されるので適当なところでターミナルを切断して中身を確認してください。
Handler task called. **Low PriHandler task called. ority Task** **Low Priority Task** **Low Priority Task** **Low Priority Task** **Low Priority THandler task called. ask** **Low Priority Task** **Low Priority Task** |
vLowPriorityTask関数によるタスクが連続して実行され、「**Low Priority Task**」を表示します。その一方で、より優先度の高いvHandlerTask関数によるタスクが10ms毎に実行され、「Handler task called.」を表示させています。結果を見てみるとわかるとおり、表示がどうも見にくくなっています。これはvLowPriorityTask関数によるタスクが「**Low Priority Task**」を表示している途中で、vHandlerTask関数によるタスクが「Handler task called.」を表示させているからです。メッセージの途中から別のメッセージが割り込んでいるので見にくいわけですね。
割込み処理や優先度の高いタスクを優先させたいということはあるにしても、「少なくともこの処理を終わらせてから割り込ませたい」「この処理を行っている間はコンテキストスイッチさせたくない」という場合があります。このような場合、そういった処理をクリティカルセクションの中におくと、割込みや優先処理から守ることができるようになります。
このサンプルプログラムであれば、「**Low Priority Task**」を実行中は割込みやコンテキストスイッチを許可しないということにすれば、メッセージ表示の混乱を防ぐことができます。
クリティカルセクションを作成するためには、割込みを無効化する方法と、スケジューラを停止する方法が有ります。またクリティカルセクション自体ではありませんが、似た目的の仕組みとしてミューテックスが有ります。
Previous: 6. クリティカルセクション |
Up: 6. クリティカルセクション |
Next: 6.2. 割込み無効化 |