ESP32でマルチタスクを行う為の、とりあえずここまで判った事 by freeRTOS 16タスク目 [ESP32]
現在実用ガイドを読みながら編集中、、、書いて有る事を信用しない様に!
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf
ESP32はRTOSができるらしい、、、
カウンティングセマフォ、、、について書く事を忘れていた。
バイナリーセマフォは2値、0と1とか、YesかNoとか、攻めと受けとかで制御を行うが、カウンティングセマフォは1よりも大きい数を使って制御する。
カウンティングセマフォと言えば思い浮かべるのはあれだろうか?イナバの物置には100人乗れるが、101人乗ると崩壊する、、、(イナバに怒られないかな?)とする。
100人まではスムースに屋根の上に乗れるが、101人目は誰かが降りるまでその場に待たされる。誰か一人降りれば、次の方どうぞ!となる。これはつまり誰かが屋根の上の人数を数えていて、100人未満なら100人になるまで乗せる。100人に達したら待ちにさせる動作である。
バイナリーセマフォ同様GiveとTakeの関係で説明すれば、1回Giveする事でカウントが1増える。1回Takeすることでカウントが1減る。カウントが0であればTake側を待たせる。
バイナリーセマフォの長所は、とても小さなリソースやCPU負荷で、タスク間の同期を取れる。
短所は、Takeする側のタスクの優先度が低く、そのタスクの処理に時間が掛かる時、セマフォを取りこぼす可能性がある。
※割り込みは、どのタスクよりも高い優先度を持つタスクとも考えられる。
バイナリーセマフォを使って以下のプログラムを実行すると、Giveは50まで数えるが、Takeは46で停止する。
https://github.com/hamayanShowa-ele/ArduinoShare/tree/main/ESP32freeRTOS_TASK_ID_016
セマフォのタイプをカウンティングセマフォとしたプログラム。この場合はTake側も50で停止する。
この様に発生側のセマフォの数を間違わずに伝える為にはカウンティングセマフォを使用する。
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf
ESP32はRTOSができるらしい、、、
カウンティングセマフォ、、、について書く事を忘れていた。
バイナリーセマフォは2値、0と1とか、YesかNoとか、攻めと受けとかで制御を行うが、カウンティングセマフォは1よりも大きい数を使って制御する。
カウンティングセマフォと言えば思い浮かべるのはあれだろうか?イナバの物置には100人乗れるが、101人乗ると崩壊する、、、(イナバに怒られないかな?)とする。
100人まではスムースに屋根の上に乗れるが、101人目は誰かが降りるまでその場に待たされる。誰か一人降りれば、次の方どうぞ!となる。これはつまり誰かが屋根の上の人数を数えていて、100人未満なら100人になるまで乗せる。100人に達したら待ちにさせる動作である。
バイナリーセマフォ同様GiveとTakeの関係で説明すれば、1回Giveする事でカウントが1増える。1回Takeすることでカウントが1減る。カウントが0であればTake側を待たせる。
バイナリーセマフォの長所は、とても小さなリソースやCPU負荷で、タスク間の同期を取れる。
短所は、Takeする側のタスクの優先度が低く、そのタスクの処理に時間が掛かる時、セマフォを取りこぼす可能性がある。
※割り込みは、どのタスクよりも高い優先度を持つタスクとも考えられる。
バイナリーセマフォを使って以下のプログラムを実行すると、Giveは50まで数えるが、Takeは46で停止する。
https://github.com/hamayanShowa-ele/ArduinoShare/tree/main/ESP32freeRTOS_TASK_ID_016
volatile SemaphoreHandle_t xSemaphore; void setup() { Serial.begin( 115200 ); Serial.println( "FreRTOS Test." ); // Create semaphore to inform us when the timer has fired xSemaphore = xSemaphoreCreateBinary(); /* configure take task. */ xTaskCreatePinnedToCore( takeTask, /* task name */ "", /* task name string */ 1024, /* stack size */ NULL, /* execute parameter */ 2, /* task priority : 0 to 24. 0 is lowest priority. */ NULL, /* task handle pointer */ 1 /* core ID */ ); /* configure give task. */ xTaskCreatePinnedToCore( giveTask, /* task name */ "", /* task name string */ 1024, /* 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 giveTask( void *execParam ) { int count = 1; while( 1 ) { vTaskDelay( pdMS_TO_TICKS( 500 ) ); Serial.print( "give count =" ); Serial.println( count, DEC ); xSemaphoreGive( xSemaphore ); if( ++count > 50 ) vTaskDelete( NULL ); } } void takeTask( void *execParam ) { int count = 1; while( 1 ) { if( xSemaphoreTake( xSemaphore, 0 ) == pdTRUE ) { Serial.print( "take count =" ); Serial.println( count++, DEC ); } vTaskDelay( pdMS_TO_TICKS( 550 ) ); } }
セマフォのタイプをカウンティングセマフォとしたプログラム。この場合はTake側も50で停止する。
volatile SemaphoreHandle_t xSemaphore; void setup() { Serial.begin( 115200 ); Serial.println( "FreRTOS Test." ); // Create semaphore to inform us when the timer has fired xSemaphore = xSemaphoreCreateCounting( 100, 0 ); /* configure take task. */ xTaskCreatePinnedToCore( takeTask, /* task name */ "", /* task name string */ 1024, /* stack size */ NULL, /* execute parameter */ 2, /* task priority : 0 to 24. 0 is lowest priority. */ NULL, /* task handle pointer */ 1 /* core ID */ ); /* configure give task. */ xTaskCreatePinnedToCore( giveTask, /* task name */ "", /* task name string */ 1024, /* 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 giveTask( void *execParam ) { int count = 1; while( 1 ) { vTaskDelay( pdMS_TO_TICKS( 500 ) ); Serial.print( "give count =" ); Serial.println( count, DEC ); xSemaphoreGive( xSemaphore ); if( ++count > 50 ) vTaskDelete( NULL ); } } void takeTask( void *execParam ) { int count = 1; while( 1 ) { if( xSemaphoreTake( xSemaphore, 0 ) == pdTRUE ) { Serial.print( "take count =" ); Serial.println( count++, DEC ); } vTaskDelay( pdMS_TO_TICKS( 550 ) ); } }
この様に発生側のセマフォの数を間違わずに伝える為にはカウンティングセマフォを使用する。
ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発
- 出版社/メーカー: オーム社
- 発売日: 2005/04/23
- メディア: Kindle版
リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))
- 作者: 高田 広章
- 出版社/メーカー: CQ出版
- 発売日: 2004/02
- メディア: 単行本
2018-02-26 22:09
nice!(0)
コメント(0)
コメント 0