現在実用ガイドを読みながら編集中、、、書いて有る事を信用しない様に!
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf
ESP32はRTOSができるらしい、、、
バイナリーセマフォについて
バイナリーセマフォと言えば、誰もが思い浮かべるのが腕木式信号機であろう、、、
電車に乗っていても信号機を意識した事は無いので、よく知らないけれど。
列車が走行するレールは連続した区間に別れていて、それぞれの区間に居る事ができる編成は原則的に1編成に限られる。じゃないとうっかり列車同士でぶつかってしまいますから。
信号機は区間の入り口にあり、腕木式信号機なら腕木が上または下に回転(信号機の構造に依存)していれば先の区間に列車は侵入可能だが、横になっている時は手前で停止する。
列車が区間に侵入すると、両方のレールがショートされる。いわばスイッチみたいなものなので、このスイッチで腕木が横になる、、、と思う。
バイナリーセマフォは2つの状態を元に制御をするもので、先の例では横になっていれば停止、それ以外は進行である。
勿論μiTRONにも「同期・通信機能」として同じものがある。
以下の例題はタイマー割り込みサービスルーチンからハンドラタスクをセマフォを使って待ち状態から解除する。ハンドラタスクは可能な限り優先度を高くしておく。
冷静に考えるとセマフォで制御する理由がまったく無い気がするが、きっとどこかに使いどころは有る。
それはそれとして、実用ガイドに書かれている関数名やその使い方が微妙に異なっている事が判る。
実用ガイドに書かれている関数は古くて、使わない様に関数マニュアルには書かれている。
旧 vSemaphoreCreateBinary → 新 xSemaphoreCreateBinary
いやぁ!読んでいて「ドキュメントもしかして古い?」気はしていたんだよね、、、
※ IRAM_ATTR修飾子って何だろう?と調べたら、iramってセクションに配置するマクロだった。iramって何?
※ loopTaskを削除すると、micros()が正し答えを返さない可能性がある。あまり困らないけど。
![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ができるらしい、、、
バイナリーセマフォについて
バイナリーセマフォと言えば、誰もが思い浮かべるのが腕木式信号機であろう、、、
電車に乗っていても信号機を意識した事は無いので、よく知らないけれど。
列車が走行するレールは連続した区間に別れていて、それぞれの区間に居る事ができる編成は原則的に1編成に限られる。じゃないとうっかり列車同士でぶつかってしまいますから。
信号機は区間の入り口にあり、腕木式信号機なら腕木が上または下に回転(信号機の構造に依存)していれば先の区間に列車は侵入可能だが、横になっている時は手前で停止する。
列車が区間に侵入すると、両方のレールがショートされる。いわばスイッチみたいなものなので、このスイッチで腕木が横になる、、、と思う。
バイナリーセマフォは2つの状態を元に制御をするもので、先の例では横になっていれば停止、それ以外は進行である。
勿論μiTRONにも「同期・通信機能」として同じものがある。
以下の例題はタイマー割り込みサービスルーチンからハンドラタスクをセマフォを使って待ち状態から解除する。ハンドラタスクは可能な限り優先度を高くしておく。
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で始める組み込み開発
- 出版社/メーカー: オーム社
- 発売日: 2005/04/23
- メディア: Kindle版

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