Previous: 6.2. 割込み無効化 |
Up: 6. クリティカルセクション |
Next: 7. ミューテックス |
サンプルプログラム |
freertos_critical_section_suspend_scheduler |
優先度の低いタスクが優先度の高いタスクに取って代わられるのはOS(スケジューラ)がコンテキストスイッチを行うからです。そのためスケジューラを停止すると、コンテキストスイッチが発生しなくなります。結果、クリティカルセクションを作成できることになります。
スケジューラを停止しても、スケジューラとは関係のない割込みには影響を与えませんので、システム全体の動作に対する副作用は少なくなります。一方、割込みを無効化するのに比べると、スケジューラの停止には時間がかかります。
スケジューラを停止するために使用するのが、vTaskSuspendAll関数です。
関数名 |
vTaskSuspendAll関数 |
関数プロトタイプ |
void vTaskSuspendAll( void ) |
動作 |
スケジューラを停止してクリティカルセクションを開始します。 |
引数 |
無し。 |
戻り値 |
無し。 |
スケジューラを再開させるために使用するのが、xTaskResumeAll関数です。
関数名 |
xTaskResumeAll関数 |
関数プロトタイプ |
void xTaskResumeAll ( void ) |
動作 |
スケジューラを再開させてクリティカルセクションを終了します。 |
引数 |
無し。 |
戻り値 |
無し。 |
サンプルプログラムでは以下のようにして、メッセージの表示を行っている間だけ、スケジューラを停止させています。
//Entering Critical Section by stopping schduler vTaskSuspendAll(); //Print message through COM cprintf("**Low Priority Task**\r\n"); //Exit from critical section xTaskResumeAll(); |
このサンプルプログラムの実行結果は以下の通りです。メッセージが中断されることなくきれいに表示できているのがわかると思います。
Handler task called. **Low Priority Task** Handler task called. **Low Priority Task** **Low Priority Task** **Low Priority Task** **Low Priority Task** Handler task called. **Low Priority Task** |
Previous: 6.2. 割込み無効化 |
Up: 6. クリティカルセクション |
Next: 7. ミューテックス |