現在実用ガイドを読みながら編集中、、、書いて有る事を信用しない様に!
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf
ESP32はRTOSができるらしい、、、
バイナリーセマフォについて
データキューには書く側と読む側の2者が存在したが、セマフォの場合はGiveする側とTakeする側が存在する。
腕木式信号機の例で言えば、
(1) 始発列車は前に列車が居ないので区間に進入する権利をTakeし、区間に進入する。すると腕木が横を向きその区間には次の列車は侵入できなくなる。
(2) 始発がその区間を抜けると権利をGiveし、腕木が上または下に回転する。
(3) 次の列車がその区間に進入する権利をTakeし、区間に進入する。すると腕木が横を向く。
バイナリーセマフォ関連の関数達
○セマフォの生成
xSemaphoreCreateBinary関数を使用してバイナリセマフォを生成する。
バイナリーセマフォを生成する為には若干のRAM領域を必要とする。xSemaphoreCreateBinary関数は呼ばれた時に動的にこの領域を確保するが、ユーザーが静的に確保した領域を使用するxSemaphoreCreateBinaryStatic関数もある。
プロトタイプは以下となる。
SemaphoreHandle_t xSemaphoreCreateBinary( void );
(1) 戻り値:NULLが返って来た場合はHEAP領域が不十分で失敗している。それ以外はセマフォへのハンドルが返る。このハンドルでGiveしたりTakeをしたりする。
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );
(1) pxSemaphoreBufferはユーザーが確保したRAM領域。
(2) 戻り値:NULLが返って来た場合はpxSemaphoreBufferがNULLで失敗した場合。それ以外はセマフォへのハンドルが返る。このハンドルでGiveしたりTakeをしたりする。
○セマフォをGive
xSemaphoreGive関数を用いてセマフォをGiveする。この関数はタスクで使用する。割込みサービスルーチンからGiveする為には xSemaphoreGiveFromISR関数を使用する。プロトタイプは以下となる。
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
(1) xSemaphoreは生成時に取得したハンドル。
(2) 戻り値:成功すればpdPASS、失敗でpdFAILが返る。原因は、Giveする前にTakeされていなかった為。
(1) xSemaphoreは生成時に取得したハンドル。
(2) pxHigherPriorityTaskWokenはセマフォ待ちをしているタスクの中で現在実行中のタスクの優先度以上の優先度のタスクが存在するとき、*pxHigherPriorityTaskWokenにpdTRUEが代入される。pdTRUEが代入される場合、割込みの終了直前にコンテキストスイッチが実行される。
この引数はNULLを渡す事ができる。
(3) 戻り値:成功すればpdTRUE、失敗でerrQUEUE_FULLが返る。原因はすでにセマフォが有効だったため。
○セマフォをTake
xSemaphoreTake関数を用いてセマフォをTakeする。この関数はタスクで使用する。割込みサービスルーチンからTakeする為には xSemaphoreTakeFromISR関数を使用する。プロトタイプは以下となる。
(1) xSemaphoreは生成時に取得したハンドル。
(2) xTicksToWaitはセマフォ待ちのタイムアウト(タイムティック数)を決める。0の時は即座に返る。portMAX_DELAYの場合は無限待ちとなる。
pdMS_TO_TICKS()マクロを使うとmsをタイムティックに変換してくれる、、、え!
#define pdMS_TO_TICKS( xTimeInMs ) ( ( ( TickType_t ) ( xTimeInMs ) * configTICK_RATE_HZ ) / ( TickType_t ) 1000 )
(3) 戻り値:成功すればpdPASSが返る。時間切れの時はpdFAIL が返る。
(1) xSemaphoreは生成時に取得したハンドル。
(2) pxHigherPriorityTaskWokenはセマフォ待ちをしているタスクの中で現在実行中のタスクの優先度以上の優先度のタスクが存在するとき、*pxHigherPriorityTaskWokenにpdTRUEが代入される。pdTRUEが代入される場合、割込みの終了直前にコンテキストスイッチが実行される。
この引数はNULLを渡す事ができる。
(3) 戻り値:成功すればpdPASSが返る。失敗した時はpdFAILが返る。失敗するのはセマフォが有効で無かった時。
※割り込みの中では何かを待ち状態に入れない。
※参考、 xQueueReceiveFromISR()
![ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発 ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発]()
![リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17)) リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))]()
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf
ESP32はRTOSができるらしい、、、
バイナリーセマフォについて
データキューには書く側と読む側の2者が存在したが、セマフォの場合はGiveする側とTakeする側が存在する。
腕木式信号機の例で言えば、
(1) 始発列車は前に列車が居ないので区間に進入する権利をTakeし、区間に進入する。すると腕木が横を向きその区間には次の列車は侵入できなくなる。
(2) 始発がその区間を抜けると権利をGiveし、腕木が上または下に回転する。
(3) 次の列車がその区間に進入する権利をTakeし、区間に進入する。すると腕木が横を向く。
バイナリーセマフォ関連の関数達
○セマフォの生成
xSemaphoreCreateBinary関数を使用してバイナリセマフォを生成する。
バイナリーセマフォを生成する為には若干のRAM領域を必要とする。xSemaphoreCreateBinary関数は呼ばれた時に動的にこの領域を確保するが、ユーザーが静的に確保した領域を使用するxSemaphoreCreateBinaryStatic関数もある。
プロトタイプは以下となる。
SemaphoreHandle_t xSemaphoreCreateBinary( void );
(1) 戻り値:NULLが返って来た場合はHEAP領域が不十分で失敗している。それ以外はセマフォへのハンドルが返る。このハンドルでGiveしたりTakeをしたりする。
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );
(1) pxSemaphoreBufferはユーザーが確保したRAM領域。
(2) 戻り値:NULLが返って来た場合はpxSemaphoreBufferがNULLで失敗した場合。それ以外はセマフォへのハンドルが返る。このハンドルでGiveしたりTakeをしたりする。
○セマフォをGive
xSemaphoreGive関数を用いてセマフォをGiveする。この関数はタスクで使用する。割込みサービスルーチンからGiveする為には xSemaphoreGiveFromISR関数を使用する。プロトタイプは以下となる。
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
(1) xSemaphoreは生成時に取得したハンドル。
(2) 戻り値:成功すればpdPASS、失敗でpdFAILが返る。原因は、Giveする前にTakeされていなかった為。
BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore, BaseType_t *pxHigherPriorityTaskWoken );
(1) xSemaphoreは生成時に取得したハンドル。
(2) pxHigherPriorityTaskWokenはセマフォ待ちをしているタスクの中で現在実行中のタスクの優先度以上の優先度のタスクが存在するとき、*pxHigherPriorityTaskWokenにpdTRUEが代入される。pdTRUEが代入される場合、割込みの終了直前にコンテキストスイッチが実行される。
この引数はNULLを渡す事ができる。
(3) 戻り値:成功すればpdTRUE、失敗でerrQUEUE_FULLが返る。原因はすでにセマフォが有効だったため。
○セマフォをTake
xSemaphoreTake関数を用いてセマフォをTakeする。この関数はタスクで使用する。割込みサービスルーチンからTakeする為には xSemaphoreTakeFromISR関数を使用する。プロトタイプは以下となる。
BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );
(1) xSemaphoreは生成時に取得したハンドル。
(2) xTicksToWaitはセマフォ待ちのタイムアウト(タイムティック数)を決める。0の時は即座に返る。portMAX_DELAYの場合は無限待ちとなる。
pdMS_TO_TICKS()マクロを使うとmsをタイムティックに変換してくれる、、、え!
#define pdMS_TO_TICKS( xTimeInMs ) ( ( ( TickType_t ) ( xTimeInMs ) * configTICK_RATE_HZ ) / ( TickType_t ) 1000 )
(3) 戻り値:成功すればpdPASSが返る。時間切れの時はpdFAIL が返る。
BaseType_t xSemaphoreTakeFromISR( SemaphoreHandle_t xSemaphore, signed BaseType_t *pxHigherPriorityTaskWoken );
(1) xSemaphoreは生成時に取得したハンドル。
(2) pxHigherPriorityTaskWokenはセマフォ待ちをしているタスクの中で現在実行中のタスクの優先度以上の優先度のタスクが存在するとき、*pxHigherPriorityTaskWokenにpdTRUEが代入される。pdTRUEが代入される場合、割込みの終了直前にコンテキストスイッチが実行される。
この引数はNULLを渡す事ができる。
(3) 戻り値:成功すればpdPASSが返る。失敗した時はpdFAILが返る。失敗するのはセマフォが有効で無かった時。
※割り込みの中では何かを待ち状態に入れない。
※参考、 xQueueReceiveFromISR()

ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発
- 出版社/メーカー: オーム社
- 発売日: 2005/04/23
- メディア: Kindle版

リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))
- 作者: 高田 広章
- 出版社/メーカー: CQ出版
- 発売日: 2004/02
- メディア: 単行本