お疲れさんのしがらきたぬき

お疲れさんのしがらきたぬき

PR

プロフィール

メディクス

メディクス

サイド自由欄


いちまいホームページ


キーワードサーチ

▼キーワード検索

カレンダー

コメント新着

メディクス @ Re[1]:Arduino ESP32開発(ESP-WROOM-32)JJY信号発生器(08/30) 我是名さんへ AD9833はSPIでしたね。 tt…
メディクス @ Re:Arduino ESP32開発(ESP-WROOM-32)JJY信号発生器(08/30) 我是名 さん コメントありがとうございま…
我是名@ Re:Arduino ESP32開発(ESP-WROOM-32)JJY信号発生器(08/30) こんにちは。申し訳ありませんが、このよ…
メディクス @ Re[1]:無線I/Oモジュール「JDY-41」を使ってみた(03/11) Akiさんへ コメントありがとうございます…
Aki@ Re:無線I/Oモジュール「JDY-41」を使ってみた(03/11) カメラシャッターリモコンの無線化がした…
2019.08.10
XML
カテゴリ: マイコン


ESP32の特徴の1つ「DualCore」
せっかくコアが2つあるなら使わないのはもったいない。(電気の消費は増えるが・・・)
RTOSが乗ってて、DualCore使わないなんて選択肢は私には無い(笑)

ここ ​を参考に、MultiTask(マルチタスク)で使う時の基本の形を書いてみたので
参考にしてほしい。

ソースはこちら。


#include "freertos/task.h"

/* Define                                 */
/******************************************/
/* hard ware devices */
/* Degital OUT */
#define ONBLED  2
/*********************/
#define ON  1
#define OFF 0
/* Multi Task */
#define TSK1STACK 4096  // Task1 Stack size
#define TSK2STACK 4096  // Task2 Stack size
/******************************************/
/* Global variable                        */
/******************************************/
/******************************************/
/* Dual Task MAIN                         */
/******************************************/
void task0(void* param)
{
    Serial.printf("Task0 on core %d done\n",xPortGetCoreID());
    vTaskDelay(1);// TaskでDelay()は使えないのでFreeRTOSシステムコールを使う
                  // Delayの単位はSystemTicらしい。
  }
}
/******************************************/
/* Initial routine                        */
/******************************************/
/******************************************/
/* Dual CPU assigned TASKs                */
/* task0:core 0  loop:core 1              */
/******************************************/
void init_tasks()
{
  // コア0で関数task0を優先順位1で起動
  xTaskCreatePinnedToCore(task0, "Task0", TSK1STACK, NULL, 1, NULL, 0);
/***
  // コア1で関数task1を優先順位1で起動
  xTaskCreatePinnedToCore(task1, "Task1", TSK2STACK, NULL, 1, NULL, 1);
***/
}
/*****************************************/
/* Conslole Serial BPS Set               */
/*****************************************/
void init_console()
{
  Serial.begin(115200);
  delay(100);
  Serial.print("Start\n");
}
/******************************************/
/* Hard ware initial                      */
/******************************************/
void init_hard()
{
  // Set pin mode
  pinMode(ONBLED,OUTPUT);
}
/******************************************/
void setup()
{
  init_hard();    // Hard ware initial
  init_console(); // Console initial for Debug
  init_tasks();   // Dual Core assigned TASK
}
/******************************************/
/* MAIL LOOP                              */
/******************************************/
void loop()
{
  Serial.printf("Loop on core %d done\n",xPortGetCoreID());
  delay(1);
}
/*******/
/* END */
/*******/



  1. #include "freertos/task.h"

  2. /******************************************/
  3. /* Define                                 */
  4. /******************************************/
  5. /* hard ware devices */
  6. /* Degital OUT */
  7. #define ONBLED  2
  8. /*********************/
  9. #define ON  1
  10. #define OFF 0
  11. /* Multi Task */
  12. #define TSK1STACK 4096  // Task1 Stack size
  13. #define TSK2STACK 4096  // Task2 Stack size
  14. /******************************************/
  15. /* Global variable                        */
  16. /******************************************/
  17. /******************************************/
  18. /* Dual Task MAIN                         */
  19. /******************************************/
  20. void task0(void* param)
  21. {
  22.   while(1) {// Taskは無限ループとする。でないとRTOSがこける。 
  23.     Serial.printf("Task0 on core %d done\n",xPortGetCoreID());
  24.     vTaskDelay(1);// TaskでDelay()は使えないのでFreeRTOSシステムコールを使う
  25.                   // Delayの単位はSystemTicらしい。
  26.   }
  27. }
  28. /******************************************/
  29. /* Initial routine                        */
  30. /******************************************/
  31. /******************************************/
  32. /* Dual CPU assigned TASKs                */
  33. /* task0:core 0  loop:core 1              */
  34. /******************************************/
  35. void init_tasks()
  36. {
  37.   // コア0で関数task0を優先順位1で起動
  38.   xTaskCreatePinnedToCore(task0, "Task0", TSK1STACK, NULL, 1, NULL, 0);
  39. /***
  40.   // コア1で関数task1を優先順位1で起動
  41.   xTaskCreatePinnedToCore(task1, "Task1", TSK2STACK, NULL, 1, NULL, 1);
  42. ***/
  43. }
  44. /*****************************************/
  45. /* Conslole Serial BPS Set               */
  46. /*****************************************/
  47. void init_console()
  48. {
  49.   Serial.begin(115200);
  50.   delay(100);
  51.   Serial.print("Start\n");
  52. }
  53. /******************************************/
  54. /* Hard ware initial                      */
  55. /******************************************/
  56. void init_hard()
  57. {
  58.   // Set pin mode
  59.   pinMode(ONBLED,OUTPUT);
  60. }
  61. /******************************************/
  62. void setup()
  63. {
  64.   init_hard();    // Hard ware initial
  65.   init_console(); // Console initial for Debug
  66.   init_tasks();   // Dual Core assigned TASK
  67. }
  68. /******************************************/
  69. /* MAIL LOOP                              */
  70. /******************************************/
  71. void loop()
  72. {
  73.   Serial.printf("Loop on core %d done\n",xPortGetCoreID());
  74.   delay(1);
  75. }
  76. /*******/
  77. /* END */
  78. /*******/


12-13行目でTask毎のStackサイズを宣言(Stackサイズの管理を自分で行うので注意)
   プログラムを作っている間にスタックOverflowを起こして妙な現象に悩まされる事も
20-17行目Task0のメインルーチンTask0の処理はここに記述します。(Core0で実行)
     ここの処理は無限ループとします。loop()関数のように、プログラムENDで
     リターンしてしまうと下の図のようにRTOSがRebootします。
     Delay()が使えないらしいのでvTaskDelay()を使います。
               また無限ループ内に必ず1回はvTaskDelay(1)を入れます。
     これが無いとOSにサービスを戻すことが出来ないようです。
     (FreeRTOSの仕様?)
35-43行目Taskの生成処理。setup()から呼び出してTaskを生成します。
     Core 0をTask0に割り当てています。

     処理毎にTaskを分けたい場合にはTaskを作ってもいいですが、
              OSのオーバーヘッドは増えます。
67行目Taskの生成
73-76行目loop()の処理。(Core1で実行)












お気に入りの記事を「いいね!」で応援しよう

最終更新日  2019.08.10 12:25:34
コメント(6) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

© Rakuten Group, Inc.

Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: