SSブログ

ESP32でマルチタスクを行う為の、とりあえずここまで判った事 by freeRTOS 11タスク目 [ESP32]

現在実用ガイドを読みながら編集中、、、書いて有る事を信用しない様に!
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf

ESP32はRTOSができるらしい、、、

バイナリーセマフォについて

バイナリーセマフォと言えば、誰もが思い浮かべるのが腕木式信号機であろう、、、
電車に乗っていても信号機を意識した事は無いので、よく知らないけれど。

列車が走行するレールは連続した区間に別れていて、それぞれの区間に居る事ができる編成は原則的に1編成に限られる。じゃないとうっかり列車同士でぶつかってしまいますから。
信号機は区間の入り口にあり、腕木式信号機なら腕木が上または下に回転(信号機の構造に依存)していれば先の区間に列車は侵入可能だが、横になっている時は手前で停止する。

列車が区間に侵入すると、両方のレールがショートされる。いわばスイッチみたいなものなので、このスイッチで腕木が横になる、、、と思う。

バイナリーセマフォは2つの状態を元に制御をするもので、先の例では横になっていれば停止、それ以外は進行である。

勿論μiTRONにも「同期・通信機能」として同じものがある。

以下の例題はタイマー割り込みサービスルーチンからハンドラタスクをセマフォを使って待ち状態から解除する。ハンドラタスクは可能な限り優先度を高くしておく。

https://github.com/hamayanShowa-ele/ArduinoShare/tree/main/ESP32freeRTOS_TASK_ID_011

const int ledPin = 2;
hw_timer_t * timer = NULL;
volatile SemaphoreHandle_t timerSemaphore;

void IRAM_ATTR onTimer()
{
  // Give a semaphore that we can check in the loop
  xSemaphoreGiveFromISR( timerSemaphore, NULL );
}

void setup()
{
  Serial.begin( 115200 );
  Serial.println( "FreRTOS Test." );
  pinMode( ledPin, OUTPUT );
  digitalWrite( ledPin, LOW );  /* turn off led. */

  // Create semaphore to inform us when the timer has fired
  timerSemaphore = xSemaphoreCreateBinary();

  timer = timerBegin( 0, 80, true );
  timerAttachInterrupt( timer, &onTimer, true );
  timerAlarmWrite( timer, 100 * 1000UL, true );
  timerAlarmEnable( timer );

  /* configure led blink task. */
  xTaskCreatePinnedToCore(
    task1,  /* 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 */
  );
  vTaskDelete( NULL );  /* delete loopTask. */
}

void loop()
{
}

void task1( void *execParam )
{
  while( 1 )
  {
    if( xSemaphoreTake(timerSemaphore, 0) == pdTRUE )
    {
      digitalWrite( ledPin, ( digitalRead(ledPin) ) ? LOW : HIGH );  /* toggle led. */
    }
  }
}

冷静に考えるとセマフォで制御する理由がまったく無い気がするが、きっとどこかに使いどころは有る。

それはそれとして、実用ガイドに書かれている関数名やその使い方が微妙に異なっている事が判る。
実用ガイドに書かれている関数は古くて、使わない様に関数マニュアルには書かれている。
旧 vSemaphoreCreateBinary → 新 xSemaphoreCreateBinary

いやぁ!読んでいて「ドキュメントもしかして古い?」気はしていたんだよね、、、

※ IRAM_ATTR修飾子って何だろう?と調べたら、iramってセクションに配置するマクロだった。iramって何?

※ loopTaskを削除すると、micros()が正し答えを返さない可能性がある。あまり困らないけど。

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:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

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

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