Previous: 5.1.3.2. 割込みハンドラの作成 |
Up: 5.1. バイナリセマフォ |
Next: 5.2. カウンティングセマフォ |
次に割込み処理用タスクを見てみましょう。サンプルプログラムでは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. カウンティングセマフォ |