PR

ESP32のマルチタスクについて動作・考え方まとめ

マルチタスクって何ですか…?

こうした悩みを解決します。

以前、delay関数を深堀りすると、リアルタイムOSにたどり着くという記事を書きました。

そこで出てきたタスクという概念。実際に動かして学んでいこうというのが本記事です。

姫野秀徳

組み込みエンジニアとしてメーカー勤務10年。
第二種電工事士、基本情報技術者、Code.org認定教師。
microbitを用いた電子工作&プログラミング教室を開校。
組み込み開発の実際を発信するyoutube活動も行う。

無料で学べる組み込み開発オンラインスクールはじめました!
https://kumicla.tatepro.com

姫野秀徳をフォローする

タスクとは

タスクというのは一連の処理をまとめたものです。

これまではmain関数から始まり、通信・演算・制御などの機能を割込みを駆使して回すのが一般的でした。

逐次的に処理が行われ、これがいわゆるシングルタスクです。

一方で、処理毎にタスクという形で並列的に配置し、1つのプログラムを構成しているのがマルチタスクです。

シングルタスクの問題点

で、シングルタスクは何が問題かと言うと、何かを処理している際に他の処理ができない、ということです。

たとえば、演算の割込み内で重い計算させているうちに、Bluetooth通信している機器から文字が送られてきたとします。

割込み処理中の計算が終わるまでバッファに受信文字列がたまり続け、文字化けやオーバーフローするなど動作不良を起こすことがあります。

だから、割込み内の処理は最低限に、と先輩にはよく言われたものです。

その点、マルチタスクにすると機能毎に切り分けられるので、互いに影響を及ぼす可能性が低くすることができるのは利点です。

タスクの作り方

xTaskCreatePinnedToCore( task_one ,"task_one",2048,NULL,2,&taskhandle[0],0);

こんな感じでタスクを作ることができます。

引数の先頭から、

タスクコード(=関数名)、名称(何でもOK)、スタックサイズ、タスクパラメータ、タスクの優先順位、タスクハンドル、コア番号

となっています。

詳細は公式を参照ください。

FreeRTOS (IDF) - ESP32 - — ESP-IDF Programming Guide latest documentation

作ったタスクは下記のように関数を宣言して使います。

void task_one(void *args) {
  while (1) {
    delay(200);
    Serial.print("a");
  }
}

マルチタスクの動作

マルチタスクと言っても、複数のアドレスを参照できないので、複数のタスクが同時に動いているわけではないです※。
(※シングルコアの場合。マルチコアの場合はコアの数だけ同時に動きます)

タイムスライスと言って、タスク毎に処理時間を区切って切替えながら実行する仕組みとなっています。

ESP32では、CONFIG_FREERTOS_HZで定義される時間間隔(通常は1ms)でタスクが切り替えられます

タスク間通信

編集中

コア間通信

編集中

この内容が良いと思ったら、いいね💖を押して教えてください!

組みクラ – 組み込み開発を学び、未来を創るエンジニアへ
無料で学べる!組み込み開発の基礎から応用までをマスターできるオンラインスクール「組みクラ」

組み込みエンジニアは、あらゆる産業の基盤を支える重要な職業です。
私たちタテプロは、次世代の組み込みエンジニアを育成し、業界の競争力を高めるために活動しています。
あなたも、無料で学べる「組みクラ」で、組み込み開発のスキルをしっかり身につけ、キャリアを加速させましょう!
今すぐ学び始めて、将来の自分をステップアップさせる第一歩を踏み出しませんか?

\立プロとLINEで友だちになりませんか/
立プロと友だちになる
組み込み機器
シェアしていただけると嬉しいです!

コメント

タイトルとURLをコピーしました