Seeeduino XIAO マイコンで TOPPERS を始めよう

# はじめに

Arduino マイコンの環境で気軽に TOPPERS の リアルタイムOS を利用できる環境の一つとして、@exshonda 先生が開発された[TOPPERS/R2CA](https://dev.toppers.jp/trac_user/contrib/wiki/rtos_arduino) (RTE and RTOS compatible with Arduino) があります。

TOPPERS/R2CA は、ARM マイコン（Atmel SAMD21）を搭載した Arduino ボードである Arduino M0 Pro / M0 を対象として開発されましたが、残念ながら Arduino M0 は既に生産中止になっています。そこで、入手性が良く値段もお手頃な SeeedStudio 社のArduino 互換マイコン Seeduino XIAO で TOPPERS/R2CA を動かす手順を説明します。

# Seeeduino XIAO について

Seeeduino XIAO は、SeeedStudio 社が販売する Arduino 互換マイコンボードです。親指の先ほどの非常にコンパクトな基板サイズであること、また実売価格が600円程度と非常に安価であることから、趣味の電子工作にもぴったりの製品です。
![XIAO.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640483/15ddff16-0027-3be1-81fd-de0cac3f2ae7.jpeg)

Seeduino XIAO が搭載する ARM マイコン（ATMEL SAMD21D）は、実は Arduino M0/M0 Pro の搭載マイコンと同じものです。そのため、Arduino M0 用に開発された TOPPERS/R2CA を軽微な変更で動作させることが可能です。

# 普通の Arduino マイコンとして使う

まずは、Seeduino XIAO を普通の Arduino マイコンとして使うための開発環境を整えましょう。
（詳細な説明は、[SeeedStudio社の記事](https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/)を参照して下さい）

Arduino の開発環境である [Arduino IDE](https://www.arduino.cc/en/software) をダウンロード、インストールします。2020年12月時点での最新版は 1.8.13 です。Windows 版の Arduino IDE は、通常版（インストーラを用いる）、ZIP版、および Windows App版の3種類が提供されていますが、通常版を選んで下さい（後でTOPPERS/R2CAを導入する作業が容易になります）。

標準の Arduino IDE は Seeduino XIAO には対応していないので、File > Preference メニューを選び、「追加のボードマネージャ」の欄に以下のURLを入力します。

 * [https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json](https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json)

上記 URL を設定すると、ツール>ボード>ボードマネージャ の対応ボード一覧で「Seeed SAMD Board」が選択可能になるので、これをインストールします。

この状態で、ツール>ボード より 「Seeeduino XIAO M0」を選択すると、Seeeduino XIAO 用の設定が完了します。あとは普通の Arduino と同じですので、色々とサンプルを動かしてみましょう。

# TOPPERS/R2CA の開発環境を準備する

## Arduino IDE にマイコンボードを追加する

TOPPERS/R2CA は、元々 Arduino M0 Pro / M0 向けに開発されものなので、Arduino IDE のボードマネージャから Arduino M0 Pro 用のコードを追加します。

メニューからツール>ボード>ボードマネージャ を選択し、次の二つのボードをインストールして下さい。

 * Arduino SAM Boards (32-bits ARM Cortex-M0+)
 * Arduino SAM Boards (32-bits Arm Cortex-M3)  

前者は、Arduino M0 などのマイコンボードのためのパッケージです。後者は、本来は関係ないパッケージなのですが、これに含まれるツールを TOPPERS/R2CA が内部的に利用します。

![BSPs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640483/0e81c600-8c9c-98e7-a26c-51e9fc838a2d.png)


## TOPPERS/R2CA を入手する

オリジナルの TOPPERS/R2CA は [TOPPERSプロジェクトのサイトで配布されています](https://dev.toppers.jp/trac_user/contrib/wiki/rtos_arduino)。しかし、最後に更新されたのが2016年で現在は保守されておらず、最新の Arduino IDE の環境ではそのまま動作しません。

そこで、最新版の Arduino IDE (1.8.x)に対応し、かつSeeeduino XIAO で動作するように変更を加えたものを用意しました。以下の URL からダウンロードしてください。

 * https://github.com/hori-takeshi/rtos_arduino/releases/tag/seeeduino_xiao-20201223

## サンプルのコンパイルと実行

TOPPERS/R2CA は、開発環境としてArduino IDE内 に含まれるツール類（コンパイラなど）を利用しますので、Arduino IDEがインストールされている環境ならばそのまま動作します。追加のツール類のインストールは不要です。

しかし、Arduino IDE の GUI 上での作業には（今のところ）対応していません。コンパイルやボードへの書き込みなどの作業は Windows コマンドプロンプトから行います。

ダウンロードしたTOPPERS/R2CA の配布物を、お好みのディレクトリに展開して下さい（以下、rtos_arduino とします）。rtos_arduino/examples ディレクトリ以下に、サンプルのスケッチがいくつか含まれています。ここでは、MultiTask というサンプルをビルドしてみます。

Windows コマンドプロンプトを起動し、CD コマンドで rtos_arduino\examples\MultiTask に移動し、do_make.bat を実行します。

```
C:> cd rtos_arduino\examples\MultiTask
C:> do_make
```

色々とビルド作業のメッセージが表示されますが、最後の方に

```
"../../asp_1.9.2/cfg/cfg/cfg" --pass 3 --kernel asp -I. -I../../asp_1.9.2/include -I../../asp_1.9.2/arch -I../../asp_1.9.2 -I"../../arduino_lib/hardware/tools/CMSIS/CMSIS/Include/" -I"../../arduino_lib/hardware/tools/CMSIS/Device/ATMEL/" -I"../../arduino_lib/hardware/arduino/samd/cores/arduino/" -I"../../arduino_lib/hardware/arduino/samd/variants/arduino_zero/" -I/lib -I../../asp_1.9.2/target/arduino_m0_gcc -I../../asp_1.9.2/arch/arm_m_gcc/common -I../../asp_1.9.2/arch/gcc -I../../lib -I../../arduino_lib/hardware/arduino/samd/cores/arduino/ -I../../arduino_lib/hardware/arduino/samd/cores/arduino/avr -I../../arduino_lib/hardware/arduino/samd/cores/arduino/USB -I../../arduino_lib/hardware/arduino/samd/variants/arduino_zero/ -I../../asp_1.9.2/library \
                                --rom-image r2ca.srec --symbol-table r2ca.syms \
                                -T ../../asp_1.9.2/target/arduino_m0_gcc/target_check.tf --api-table ../../asp_1.9.2/kernel/kernel_api.csv --cfg1-def-table ../../asp_1.9.2/kernel/kernel_def.csv  --cfg1-def-table ../../asp_1.9.2/target/arduino_m0_gcc/target_def.csv --cfg1-def-table ../../asp_1.9.2/arch/arm_m_gcc/common/core_def.csv r2ca_app.cfg
check complete
```

このようなメッセージが表示されていたら、ビルド作業は正常終了しています。

次に、ビルドした結果を Seeeduino XIAO に書き込みます。

ホストPCと Seeeduino XIAO を USBケーブルで接続して下さい。Seeeduino XIAO は PC側からは仮想 COM ポートとして認識されます。Windows デバイスマネージャを開き、「ポート(COMとLPT)」の項目を見ると「Arduino Pro M0(COM6)」のようなポートが見つかります（皆さんの環境によって COM6 の部分は異なった値になります）。
見つかった COMポートの名前を、次のように環境変数 R2CA_NATIVE_PORT に設定します。

```
C:> set R2CA_NATIVE_PORT=COM6
```

あとは、先ほどビルドしたサンプルのディレクトリで、do_run.bat を実行すると、ボードへの書き込みが行われます。

```
C:> do_run.bat
```

書き込みが成功すると、自動的に書き込まれたスケッチの実行が始まり、Seeeduino XIAO 表面の 橙色がLEDが点滅します。

# マルチタスク処理のスケッチの説明

先ほど実行したサンプル examples/MultiTask の内容を見ながら、TOPPERS/R2CA のプログラムの構造をを簡単に説明します。

MultiTask\r2ca_app.cpp が、Arduino スケッチに相当するファイルです。

スケッチの先頭部分

```
#include "r2ca.h"
#define Serial SerialUSB
```

の記述は、TOPPERS/R2CA を使う準備です。その後ろには、普通の Arduino スケッチと同じように、初期化処理を書く setup() 関数、繰り返し実行される処理を書く loop() 関数が続きます。

```
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);
}
```

普通の Arduino スケッチでは、繰り返し処理を記述する loop() 関数は一つだけですが、TOPPERS/R2CA では リアルタイムOSのマルチタスク機能を用いて、複数の loop() 関数を書くことが出来ます。

```
void loop1() {
    digitalWrite(13, HIGH);
    delay(1000);           
    digitalWrite(13, LOW); 
    delay(1000);           
}

int task2_loop_cnt = 0;

void loop2() {
    Serial.print("task2_loop() : running ");
    Serial.print(task2_loop_cnt++);
    Serial.println(" .");
    delay(2000);
}
（※以下略）
```

サンプル MultiTask では、loop() の他にloop1()～loop4()までの関数を定義されており、それぞれ異なるタイミングで LEDを点滅させたり、シリアルコンソールにメッセージを出力しています。端末エミュレータソフト（Arduino IDEのツール>シリアルモニタを使うのが簡単です）でシリアルコンソールの出力を確認すると、以下の様な結果になります。

![serialmonitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640483/745e78af-e100-9833-1be4-d760e4f93191.png)

普通の arduino スケッチでは、一つのloop()関数の中で全ての処理を書くことになるため、複数の処理を同時に行おうとするとスケッチが複雑になってしまいます。TOPPERS/R2CA を使うと、それぞれの処理を独立した loop() 関数として記述することができるようになります。

利用する loop()関数の数は、r2ca_app.h ファイルで次のように設定します。

```
#define R2CA_NUM_TASK 4
```

R2CA_NUM_TASK は最大で5まで設定可能です（さらに増やすこともできますが、その場合はリアルタイムOSのコンフィギュレーションファイルを独自に書く必要があります）。

サンプルではなく、独自のプログラムを開発したい場合は、既存のサンプルをフォルダごとコピーし、それをベースに書き換えていくのがよいでしょう。

# より複雑なマルチタスク処理

今回紹介したマルチタスク処理は、複数のタスクが独立に（勝手に）実行されるだけでしたが、TOPPERS カーネルの機能を活用することで、

* タスクの起動、停止を制御する
* タスク同士で通信や同期を行う

などの、より高度なマルチタスク機能を用いることができます。詳細は、@exshonda 先生が書かれたTOPPERS/R2CA の解説記事などを参照して下さい。

 * [Arduino M0 Pro でマルチタスクプログラミング : 優先度・スケジューリング](https://qiita.com/exshonda/items/e4b09f299f647a2b7018)
 * [Arduino M0 Pro でマルチタスクプログラミング : 基本API](https://qiita.com/exshonda/items/cb4c5d1fa2836d602844)

# まとめ

SeeedStudio 社の安価な Arduino 互換マイコン Seeeduino XIAO を用いて、TOPPERS/R2CA を使用する方法を紹介しました。Seeeduino XIAO は国内での入手性もよい上に非常に安価ですので、試しにTOPPERSを始めてみるためには最適のプラットフォームではないかと思います。これまで Arduino で色々な電子工作をされてきた方にもおすすめです。

そして、Seeeduino XIAO と TOPPERS/R2CA を用いた楽しい電子工作の作品が完成したら、ぜひ[TOPPERS活用アイデア・アプリケーション開発コンテスト](http://www.toppers.jp/contest.html)への応募をご検討下さい。