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


Previous: 5.1.3.2. 割込みハンドラの作成

Up: 5.1. バイナリセマフォ

Next: 5.2. カウンティングセマフォ


マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法: 5. 割込み処理: 5.1. バイナリセマフォ:

5.1.4. バイナリセマフォを取る

 次に割込み処理用タスクを見てみましょう。サンプルプログラムではvHandlerTask関数が割込み処理用タスクのための関数です。

 割込み処理用関数では冒頭でxSemaphoreTake関数を実行し、セマフォが与えられているのであればセマフォを取る、セマフォが与えられていないのであれば与えられるまで待ちます。xSemaphoreTakeは実際にはマクロですが便宜上関数として紹介します。

関数名

xSemaphoreTake関数

関数プロトタイプ

xSemaphoreTake

? (

??? xSemaphoreHandle xSemaphore,

??? portTickType xBlockTime

? )

動作

セマフォがすでに与えられている場合にはセマフォを取って呼び出し元に戻ります。セマフォが与えられていない場合には、セマフォが与えられるまでBlocked状態で待ちます。

引数

xSemaphore

取る対象のセマフォのハンドラを指定します。

xBlockTime

最大待ち時間を指定します。単位はTickです。portMAX_DELAYを指定すると無制限に待ちます。

戻り値

無し

 サンプルプログラムでも以下のようにwhileループの冒頭でxSemaphoreTake関数を実行して、セマフォが与えられるのをBlocked状態で待っています。portMAX_DELAYを指定しているので待ち時間に制限はありません。セマフォが与えられるとこの関数の処理が終わって戻ってきますので、次の行以降が実行されます。

// Take semaphore to wait for interrupt

xSemaphoreTake (xBinarySemaphore, portMAX_DELAY);

//Print message through COM

cprintf("Handler task called.\r\n");

 割込み処理用タスクのループ内の処理が最後まで来ると、処理が先頭に戻りますので、そうするとまたxSemaphoreTake関数が実行されることになります。そうすると先ほど自分でセマフォを取っていますので、対象のセマフォはまだ与えられていない状態です。そこでまた次にセマフォが与えられるまではBlocked状態で待つことになります。


Previous: 5.1.3.2. 割込みハンドラの作成

Up: 5.1. バイナリセマフォ

Next: 5.2. カウンティングセマフォ


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