9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Arduino M0 Pro でマルチタスクプログラミング : マルチタスク

Last updated at Posted at 2016-02-22

はじめに

TOPPERS/R2CAは,Arduino M0 Pro (以下,M0)上で,Arduinoライブラリ+TOPPERS/ASPカーネルベースのマルチタスクプログラミング環境を提供するパッケージです.

この記事では,インストールとサンプルの実行に続き,マルチタスクを使用する方法について説明します.開発環境のインストールやビルド&実行方法はこちらの記事を見て下さい.

実行

とりあえずサンプルプログラムを実行します.以下のファイルを

examples/MultiTask/do_make.do

をダブルクリップしてビルドして下さい.次にボードを接続して,

examples/MultiTask/do_run.do

をダブルクリックしてダウンロードして実行します.

r2ca_term.jpg

実行すると,タスクが5個実行され定期的にログをTerminalに出力します.

マルチタスクサンプル

コードはr2ca_app.cppに記述します.通常のArduinoのプログラミングで記述するsetup()/loop()に加えてloopx()が用意されています.例えばloop1()はタスク1用の記述です.タスクは標準で最大5個まで追加することができます.今回のサンプルではタスクを5個(setup()/loop()用に1個,loopx()用に5個)動作させています.

examples/MultiTask/r2ca_app.cpp
#include "r2ca.h"

/*
 *  For MAINTASK
 */ 
void setup() {
    Serial.begin(115200);
    Serial.println("setup() : running ");

    pinMode(13, OUTPUT);
}

int loop_cnt = 0;

void loop() {
    Serial.print("loop() : running ");
    Serial.print(loop_cnt++);
    Serial.println(" .");
    delay(1000);
}

/*
 *  For TASK1
 */
void loop1() {
    digitalWrite(13, HIGH);
    delay(1000);           
    digitalWrite(13, LOW); 
    delay(1000);           
}

int task2_loop_cnt = 0;

/*
 *  For TASK2
 */
void loop2() {
    Serial.print("task2_loop() : running ");
    Serial.print(task2_loop_cnt++);
    Serial.println(" .");
    delay(2000);
}

int task3_loop_cnt = 0;

/*
 *  For TASK3
 */
void loop3() {
    Serial.print("task3_loop() : running ");
    Serial.print(task3_loop_cnt++);
    Serial.println(" .");
    delay(2000);
}

int task4_loop_cnt = 0;

/*
 *  For TASK4
 */
void loop4() {
    Serial.print("task4_loop() : running ");
    Serial.print(task4_loop_cnt++);
    Serial.println(" .");    
    delay(2000);
}


タスクの個数はr2ca_app.hでR2CA_NUM_TASKというマクロで指定します.

examples/MultiTask/r2ca_app.h

#define R2CA_NUM_TASK 4

プログラムが開始されると,まずsetup()が実行され,その後に他の関数が実行されます.そのため,全体的な初期化はsetup()に記述するようにします.

各タスクのディフォルトの優先度は同一で'5'に設定されています.

おわりに

R2CAでは可能な限りArduinoのプログラミングモデルでマルチタスクを実現しています.今回のプログラムでは必要性は分かりにくいかとおもいますが,外部との通信をする場合にはマルチタスクの必要性が出てくると思います.次回はIoT的にESP8266を使うプログラムについて紹介します.

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?