ESP32でマルチタスクを行う為の、とりあえずここまで判った事 by freeRTOS 27タスク目 [ESP32]
現在実用ガイドを読みながら編集中、、、ある事ない事書いちょりまっす!
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf
ESP32はRTOSができるらしい、、、
排他制御について
〇 ゲートキーパータスク(達)
ゲートキーパータスクは、デッドロックや優先度の逆転におびえる事無しに、すっきりとした実装方法を提供する。ゲートキーパータスクはその名の通りタスクであり、資源に対して単一の所有権を持つ。ゲートキーパータスクのみ資源に直接的なアクセスが許可され、他のタスクはゲートキーパータスクのサービスを使って間接的に資源にアクセスする。
ようするに資源にアクセスする専用のタスクを用意するので、資源利用の競合を無くせる。
例えばSPIデバイスに複数のタスクがアクセスする事を考えてみると、ある優先度の低いタスクがSPI通信中に別の優先度の高いタスクにプリエンプトされ、そのタスクがSPI通信してしまうと色々まずい事が起きそうである。
これを排他制御でバイナリーセマフォなり、ミューテックスなりでSPIにアクセス可能なタスクを制限してしまう事は可能だが、そうするとタスクに待ち状態が発生し、それぞれのタスクの処理が寸断されてしまう。
以下の例ではデータキューを使って複数のタスクからメッセージをSerial.printしているが、メッセージをゲートキーパータスクに託したタスクは、そのまま処理を継続できる。※まぁ寝ているけどね。
https://github.com/hamayanShowa-ele/ArduinoShare/tree/main/ESP32freeRTOS_TASK_ID_027
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf
ESP32はRTOSができるらしい、、、
排他制御について
〇 ゲートキーパータスク(達)
ゲートキーパータスクは、デッドロックや優先度の逆転におびえる事無しに、すっきりとした実装方法を提供する。ゲートキーパータスクはその名の通りタスクであり、資源に対して単一の所有権を持つ。ゲートキーパータスクのみ資源に直接的なアクセスが許可され、他のタスクはゲートキーパータスクのサービスを使って間接的に資源にアクセスする。
ようするに資源にアクセスする専用のタスクを用意するので、資源利用の競合を無くせる。
例えばSPIデバイスに複数のタスクがアクセスする事を考えてみると、ある優先度の低いタスクがSPI通信中に別の優先度の高いタスクにプリエンプトされ、そのタスクがSPI通信してしまうと色々まずい事が起きそうである。
これを排他制御でバイナリーセマフォなり、ミューテックスなりでSPIにアクセス可能なタスクを制限してしまう事は可能だが、そうするとタスクに待ち状態が発生し、それぞれのタスクの処理が寸断されてしまう。
以下の例ではデータキューを使って複数のタスクからメッセージをSerial.printしているが、メッセージをゲートキーパータスクに託したタスクは、そのまま処理を継続できる。※まぁ寝ているけどね。
https://github.com/hamayanShowa-ele/ArduinoShare/tree/main/ESP32freeRTOS_TASK_ID_027
xQueueHandle que; void setup() { Serial.begin( 115200 ); Serial.println( "FreRTOS Test." ); /* create data queue */ que = xQueueCreate( 10, sizeof(char *) ); /* configure take task1. */ xTaskCreatePinnedToCore( gateKeeperTask, /* task name */ "", /* task name string */ configMINIMAL_STACK_SIZE, /* stack size */ NULL, /* execute parameter */ 1, /* task priority : 0 to 24. 0 is lowest priority. */ NULL, /* task handle pointer */ 1 /* core ID */ ); /* configure take task2. */ xTaskCreatePinnedToCore( task2, /* 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 task3. */ xTaskCreatePinnedToCore( task3, /* 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 gateKeeperTask( void *execParam ) { while( 1 ) { char *pvBuffer; xQueueReceive( que, (void *)&pvBuffer, portMAX_DELAY ); Serial.print( pvBuffer ); } } void task2( void *execParam ) { static const char *msg = "this is task2.\r\n"; while( 1 ) { xQueueSendToBack( que, (const void *)&msg, portMAX_DELAY ); vTaskDelay( pdMS_TO_TICKS( 250 ) ); } } void task3( void *execParam ) { static const char *msg = "this is task3.\r\n"; while( 1 ) { xQueueSendToBack( que, (const void *)&msg, portMAX_DELAY ); vTaskDelay( pdMS_TO_TICKS( 500 ) ); } }
ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発
- 出版社/メーカー: オーム社
- 発売日: 2005/04/23
- メディア: Kindle版
リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))
- 作者: 高田 広章
- 出版社/メーカー: CQ出版
- 発売日: 2004/02
- メディア: 単行本
2018-03-08 16:10
nice!(0)
コメント(0)
コメント 0