SSブログ

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

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 ) );
  }
}

ESP32_counterSema_001.png


セマフォのタイプをカウンティングセマフォとしたプログラム。この場合は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 ) );
  }
}

ESP32_counterSema_002.png


この様に発生側のセマフォの数を間違わずに伝える為にはカウンティングセマフォを使用する。


ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発

ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発

  • 出版社/メーカー: オーム社
  • 発売日: 2005/04/23
  • メディア: Kindle版



図解 μITRONによる組込みシステム入門(第2版)

図解 μITRONによる組込みシステム入門(第2版)

  • 作者: 武井 正彦
  • 出版社/メーカー: 森北出版
  • 発売日: 2018/02/17
  • メディア: 単行本(ソフトカバー)



μITRON4.0標準ガイドブック

μITRON4.0標準ガイドブック

  • 作者:
  • 出版社/メーカー: パーソナルメディア
  • 発売日: 2001/11/01
  • メディア: 単行本(ソフトカバー)



リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))

リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))

  • 作者: 高田 広章
  • 出版社/メーカー: CQ出版
  • 発売日: 2004/02
  • メディア: 単行本



nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。