はじめに
TOPPERS/R2CAは,Arduino M0 Pro (以下,M0)上で,Arduinoライブラリ+TOPPERS/ASPカーネルベースのマルチタスクプログラミング環境を提供するパッケージです.
この記事では,インストールとサンプルの実行に続き,マルチタスクを使用する方法について説明します.開発環境のインストールやビルド&実行方法はこちらの記事を見て下さい.
実行
とりあえずサンプルプログラムを実行します.以下のファイルを
examples/MultiTask/do_make.do
をダブルクリップしてビルドして下さい.次にボードを接続して,
examples/MultiTask/do_run.do
をダブルクリックしてダウンロードして実行します.
実行すると,タスクが5個実行され定期的にログをTerminalに出力します.
マルチタスクサンプル
コードはr2ca_app.cppに記述します.通常のArduinoのプログラミングで記述するsetup()/loop()に加えてloopx()が用意されています.例えばloop1()はタスク1用の記述です.タスクは標準で最大5個まで追加することができます.今回のサンプルではタスクを5個(setup()/loop()用に1個,loopx()用に5個)動作させています.
#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というマクロで指定します.
#define R2CA_NUM_TASK 4
プログラムが開始されると,まずsetup()が実行され,その後に他の関数が実行されます.そのため,全体的な初期化はsetup()に記述するようにします.
各タスクのディフォルトの優先度は同一で'5'に設定されています.
おわりに
R2CAでは可能な限りArduinoのプログラミングモデルでマルチタスクを実現しています.今回のプログラムでは必要性は分かりにくいかとおもいますが,外部との通信をする場合にはマルチタスクの必要性が出てくると思います.次回はIoT的にESP8266を使うプログラムについて紹介します.