ESP32でマルチタスクを行う為の、とりあえずここまで判った事 by freeRTOS 22タスク目 [ESP32]
現在実用ガイドを読みながら編集中、、、ある事ない事書いちょりまっす!
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf
ESP32はRTOSができるらしい、、、
排他制御について
〇 ミューテックス(とバイナリーセマフォ)、、、1?
ミューテックスはバイナリーセマフォの特殊なタイプで、資源を共有する複数のタスク間で資源へのアクセスを制御する。ミューテックスの語源は排他制御の”MUTual EXclusion”、、、そうだったのか!気にした事無かった。
排他制御として使われるミューテックスは、共有される資源に付随するトークンとして考える事ができる。正式に資源にアクセスする為にトークンを"Take"したタスクを、「トークン・ホルダーになる」と言う。トークン・ホルダーが資源の利用を終えたら、"Give"してトークンを戻さなければならない。トークンが戻された場合に限り他のタスクはトークンを得る事ができ、安全に共有資源にアクセスできる。言い換えれば、トークンを得ないタスクは資源にアクセスする事を許可されない。
● xSemaphoreCreateMutex関数
ミューテックスはセマフォのタイプの一つである。xSemaphoreHandleタイプの変数に保存されるFreeRTOSセマフォの全てのタイプを取り扱う 。
ミューテックスは使われる前に生成されなければならない。ミューテックスを生成する為にはxSemaphoreCreateMutex関数を使用する。
プロトタイプは以下となる。
(1) 戻り値:もしNULLが返って来たら、ミューテックスの生成に失敗している。失敗する原因は、HEAP領域の不足である。NULL以外が返って来た時はミューテックスの生成に成功した。戻ってきた値は、生成したミューテックスへのハンドルである。
例のコードを今度はミューテックスで置き換えてみた。2つのタスク間の排他制御なので、両方のタスクにミューテックスのTakeとGiveを使っている。
https://github.com/hamayanShowa-ele/ArduinoShare/tree/main/ESP32freeRTOS_TASK_ID_022
実行した結果は以下となった。割込み禁止で行った結果と一致する。
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf
ESP32はRTOSができるらしい、、、
排他制御について
〇 ミューテックス(とバイナリーセマフォ)、、、1?
ミューテックスはバイナリーセマフォの特殊なタイプで、資源を共有する複数のタスク間で資源へのアクセスを制御する。ミューテックスの語源は排他制御の”MUTual EXclusion”、、、そうだったのか!気にした事無かった。
排他制御として使われるミューテックスは、共有される資源に付随するトークンとして考える事ができる。正式に資源にアクセスする為にトークンを"Take"したタスクを、「トークン・ホルダーになる」と言う。トークン・ホルダーが資源の利用を終えたら、"Give"してトークンを戻さなければならない。トークンが戻された場合に限り他のタスクはトークンを得る事ができ、安全に共有資源にアクセスできる。言い換えれば、トークンを得ないタスクは資源にアクセスする事を許可されない。
● xSemaphoreCreateMutex関数
ミューテックスはセマフォのタイプの一つである。xSemaphoreHandleタイプの変数に保存されるFreeRTOSセマフォの全てのタイプを取り扱う 。
ミューテックスは使われる前に生成されなければならない。ミューテックスを生成する為にはxSemaphoreCreateMutex関数を使用する。
プロトタイプは以下となる。
xSemaphoreHandle xSemaphoreCreateMutex( void );
(1) 戻り値:もしNULLが返って来たら、ミューテックスの生成に失敗している。失敗する原因は、HEAP領域の不足である。NULL以外が返って来た時はミューテックスの生成に成功した。戻ってきた値は、生成したミューテックスへのハンドルである。
例のコードを今度はミューテックスで置き換えてみた。2つのタスク間の排他制御なので、両方のタスクにミューテックスのTakeとGiveを使っている。
https://github.com/hamayanShowa-ele/ArduinoShare/tree/main/ESP32freeRTOS_TASK_ID_022
xSemaphoreHandle mux; void setup() { Serial.begin( 115200 ); Serial.println( "FreRTOS Test." ); mux = xSemaphoreCreateMutex(); /* configure take task1. */ xTaskCreatePinnedToCore( lowerPriorityTask, /* task name */ "", /* task name string */ configMINIMAL_STACK_SIZE, /* stack size */ NULL, /* execute parameter */ 2, /* task priority : 0 to 24. 0 is lowest priority. */ NULL, /* task handle pointer */ 1 /* core ID */ ); /* configure take task2. */ xTaskCreatePinnedToCore( upperPriorityTask, /* task name */ "", /* task name string */ configMINIMAL_STACK_SIZE, /* stack size */ NULL, /* execute parameter */ 3, /* task priority : 0 to 24. 0 is lowest priority. */ NULL, /* task handle pointer */ 1 /* core ID */ ); vTaskDelete( NULL ); /* delete loopTask. */ } void loop() { } void lowerPriorityTask( void *execParam ) { int count = 1; while( 1 ) { xSemaphoreTake( mux, portMAX_DELAY ); Serial.print( "lowerPriorityTask count = " ); Serial.println( count++,DEC ); xSemaphoreGive( mux ); vTaskDelay( pdMS_TO_TICKS( 1 ) ); } } void upperPriorityTask( void *execParam ) { int count = 1; while( 1 ) { xSemaphoreTake( mux, portMAX_DELAY ); Serial.print( "upperPriorityTask count = " ); Serial.println( count++,DEC ); xSemaphoreGive( mux ); vTaskDelay( pdMS_TO_TICKS( 10 ) ); } }
実行した結果は以下となった。割込み禁止で行った結果と一致する。
ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発
- 出版社/メーカー: オーム社
- 発売日: 2005/04/23
- メディア: Kindle版
リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))
- 作者: 高田 広章
- 出版社/メーカー: CQ出版
- 発売日: 2004/02
- メディア: 単行本
2018-03-07 22:22
nice!(0)
コメント(0)
コメント 0