マイコン入門spacer ad
トップページに戻る(マイコン徹底入門:STM32で始めるARM/Cortex-M3組み込み開発)
「マイコン徹底入門」とは? |  「マイコン徹底入門」を読む |  ダウンロード |  掲示板 |  筆者の自己紹介


Previous: 6.2. 割込み無効化

Up: 6. クリティカルセクション

Next: 7. ミューテックス


マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法: 6. クリティカルセクション:

6.3. スケジューラ停止

サンプルプログラム

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. ミューテックス


このページはITと知的財産の法律情報「法務ネット」の管理人が制作・運営しています。