TOPPERS 活用アイデア・アプリケーション開発
コンテスト

部門

：活用アイデア部門

アプリケーション開発部門

作品のタイトル：

Arduino on TOPPERS プロトタイプ環境作成者：

石岡之也（個人）

対象者： 電子工作や組み込みソフトウェア作成の初心者から中級者、RTOS 未経験者から初心者使用する開発成果物：

TOPPERS/ASP カーネル
STBEE（Strawberry Linux）簡易パッケージ

目的・狙い
近年、初心者向けの Arduino が広まり、新規のデバイスを用いたボードやサンプルプログラムが Arduino 用に公開され短期で動作確認が行えるようになっています。
しかし、Arduino は単一ループで処理を実現しているため、複雑な処理系の実装は困難です。このため、公開されたサンプルプログラムを容易に動作させることができ、また Arduino で複雑な処理を実装できるようにするため、Arduino プログラムを Toppers 上で動作させる環境の開発を思い立ちました。

アイデア/アプリケーションの概要
Interface 誌 2012 年 6 月号付録の FM3 マイコン基板と STBEE 簡易パッケージにFM3 用パッチを適用した TOPPERS をベースに、ARM Cortex-M3 を用いた Due用の Arduino IDE のハードウェアアクセスライブラリを FM3 用へ置き換え、スタートアップルーチンを削除して TOPPERS のタスクとして動作するよう改造します。更に Arduino 上でマルチタスクと周期ハンドラ登録が行えるよう、TOPPERS
API へアクセスするためのライブラリと、動作サンプル用にキャラクタ LCD、グラフィック LCD のライブラリも開発、移植しました。

●ハードウェアベースとなるＭＰＵボードは Interface 誌２０１２年６月号付録のＦＭ３ボード（CQ-FRK-FM3）を使用しています。デモ機のハードウェア概観画像を以下へ記します。
デバイス接続用のコネクタは、Arduino UNO 用シールドが搭載できるよう、コネクタピンを加工して配置してあります。
開発で対象としたグラフィックＬＣＤのピン配置は以下の製品に合わせてあります。
http://www.aitendo.com/product/9482
キャラクタＬＣＤは、下記の「Arduino はやみ表」内の「キャラクタ液晶ディスプレイ」に記載されている配線を利用しています。
http://k-tai.impress.co.jp/img/ktw/docs/369/056/html/STPblog2010-05-24_IT1.jpg.html
回路図は別紙 FM3_BF618T_topopers.pdf を参照ください。

●ソフトウェア構成
ソフトウェア構成を以下に記します。
細線部分が TOPPERS の開発環境で設定、作成を行います。
太線部分が Arduino の開発環境である Arduino IDE で作成します。
TOPPERS

周期ハンドラ

Arduinocyclic_handler(*atot_handler_f(*atot_task_func

main()

unc_p)(void)_p)(void) ()setup()

主タスク
main_task()

Arduino

シールド

主タスク

登録タスク

ライブラリ

arduino_task()

arduino_regtask\libraries()()

loop()LED 点滅

LiquidCrystal
TFT
Toppers

ＴＯＰＰＥＲＳ／ＡＳＰ:Arduino IDE で作成する関数（スケッチ）●ソフトウェア詳細（１）TOPPERS「TOPPERS/ASP カーネル簡易パッケージのダウンロード」ページから取得できる「STBEE（Strawberry Linux）簡易パッケージ」をベースにします。
今回は FM3 ボードを使用することから、Interface 誌 2012 年 7 月号付録 DVD に収録されている松浦商事・松浦さんが作成したパッチ ( asp_cqbbel_mp3.zip ) を適用し、FM3 ボードで動作する TOPPERS/ASP カーネルを作成します。
TOPPERS のビルド環境は、最終的にバイナリを Arduino IDE が出力したファイルとの結合を行うことを考慮し、Arduino IDE と同じ以下のコンパイラを取得し、Linux 上にクロス開発環境を構築しました。
Sourcery G++ Lite 2010q1-188 for ARM EABITOPPERS 側のプログラムは初期設定時に生成される「sample1」のプログラムや設定を流用します。

関数名main_task

内容
Arduino のメイン関数。今開発では変数の初期化とオンボード LED の点滅処理を追加。
Arduino の main 関数をタスクとして動作させるためのタスクの入り

arduino_task

口関数で、サンプルの TASK1 に相当。Arduino のプログラムをアイドルタスクとして動作させるため優先度を LOW_PRIORITY で動作。
Arduino 側でマルチタスクを実現させるため、Arduino で登録された

arduino_regtask

関数ポインタを呼び出すタスクで、サンプルの TASK2 に相当。未登
録時は dly_tsk()を繰り返す。
arduino_task()と同じく優先度を LOW_PRIORITY で動作。

task

サンプルの TASK3 に相当。
今回は未使用で dly_tsk()を繰り返す。
周期ハンドラ。

cyclic_handler

Arduino 側で周期的な処理を行わせるため、Arduino で登録された関数ポインタを呼び出す。
Arduino 側での反応を良くするため、今回は 100m 秒で動作。

今回のプログラムは TOPPERS だけは完結せず、最終的に Arduino IDE が出力したバイナリと結合する必要があります。
初心者でも利用できる環境を提供するため、最終的な結合は Arduino IDE 上で行い、TOPPERS のビルドは中間状態のバイナリ作成までとします。
このため、sample1/Makefile へ以下の行を追加し、asp.a というライブラリとして中間状態のバイナリを出力するようにします。
$(AR) -rcs $(OBJFILE).a $(START_OBJS) \$(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS)（２）Arduino
Arduino IDE は現在、1.5.7 が最新版として取得できますが、今回は、個人的に以前から解析、改造で使用していた 1.5.2 版を使用します。
Arduino IDE のプログラムは以下からダウンロードできます。
http://downloads.arduino.cc/arduino-1.5.2-windows.zip
今開発では、Cortex-M3 の FM3 を動作対象とるため、Arduino Due 用のファイルやプログラムへ修正、追加することで FM3 用の環境を構築します。また、TOPPERS で生成されたバイナリファイルも併せてリンクするよう修正も行います。

修正対象

修正概要
hardware\arduino\sam 配下のテキストファイルにチップやボードのハード情報やコンパイル・リンク時のパラメータなどが設定でき、FM3設定ファイル用や TOPPERS で生成したバイナリファイルをリンクするように追加、修正を行います。
また、項目を追加することで下図のように新規ボードの設定を選択できるようになります。

ハードアクセスライ
ブラリ

hardware\arduino\sam\system\libsam 配下へ
FM3 やボード上のハードウェアへアクセスするためのサブルーチンを追加、変更します。
hardware\arduino\sam\system\CMSIS\Device\ATMEL\sam3xa\include

CMSIS 用ファイル

へ FM3 用の CMSIS ファイルを追加します。
今開発では、修正量を抑えるため、Arduino Due のディレクトリそのままで環境を構築します。

Arduino CORE 系

main.cpp から不要な処理を削除します。
io 制御用のファイルを FM3 用へ修正します。
hardware\arduino\sam\variants\arduino_due_x 配下へ FM3 用のリンカスクリプトを追加します。

ビルド用

TOPPERS が代理するスタートアップルーチンやベクタテーブルなどの記述を削除します。
TOPPERS で生成したバイナリファイルを配置します。
arduino-1.5.2\hardware\tools 配下に FM3 への書き込みで使用する書き込みツール用「FLASH USB DIRECT Programmer」のための設定ファイル、バッチフ
ァイルを追加します。

シールドライブラリ\arduino-1.5.2\libraries へキャラクタＬＣＤ、グラフィックＬＣ
Ｄ、TOPPERS へのアクセス用のライブラリを追加する。

●構築、動作手順
以下のＵＲＬからダウンロードしたファイルが展開されているものとして記述します。
http://www009.upp.so-net.ne.jp/yistudio/arduinoONtoppers20140915.zip
前項までの説明したファイル類のダウンロードや展開、インストールがされているものとし、また、TOPPERS は Linux、Arduino IDE は Windows 上の環境とします。
TOPPRES 側の修正を行わない場合、(3)から開始しても構いません。
また、Arduino IDE を含め開発環境を用意しない場合、提供ファイルのarduino-1.5.2¥build ディレクトリ内にビルド済みのファイルが含まれているので、(9)から開始できます。
（１）提供ファイル sample1-20140914.tar を展開し、TOPPERS の sample1 ディレクトリへ上書きします。

（２）sample1 ディレクトリ内で make を実行します。
事前に Sourcery G++ Lite がインストールされ、以下のような環境変数が設定されているものとします。PATH は各自の Sourcery G++ Lite をインストールしたディレクトリとして下さい。
export PATH=/usr/local/cross-compiler/arm-2010q1/bin:$PATH
export GCC_TARGET=arm-none-eabi（３）Windows 上の任意のディレクトリへ Arduino IDE 1.5.2 を展開します。
提供ファイル内の arduino-1.5.2 ディレクトリの内容を展開した Arduino IDE へコピーします。
（４）TOPPERS で生成された以下のファイルを Arduino IED のhardware¥arduino¥sam¥variants¥arduino_due_x ディレクトリへコピーします。
TOPPERS 側の修正をおこわない場合、この項目は飛ばして下さい。
・asp.a・libkernel.a・start.o（５）Arduino IED を展開したディレクトリの直下にある arduino.exe を実行します。
（６）Arduino のスケッチを作成するかサンプルを開きます。
サンプルは提供ファイル内の ino ディレクトリ内にあります。
スケッチ名

内容
digitalWrite のテストプログラム。

Arduino_FM3

D0～D12、A0～A5 へ 0、1 の書き込みを繰り返します。
LED の点滅は TOPPERS 側 main_task 関数内で実行されています。
キャラクタＬＣＤへの表示を行います。
「Hellow・・」は setup 関数、「*」の点滅は loop 関数で表示していArduino_Toppers1ます。
「#」は周期ハンドラでスペースとの切り替えを行い、Arduino側のマルチタスク登録された sub_task 関数で LCD へ表示を行っています。

Arduino_Toppers2

グラフィックＬＣＤへ表示を行います。
loop 関数内でマンデルブロ集合の表示を行っています。

（７）Arduino IDE のメニューから「ツール」「Borad..」「Interface FM3」を選択します。
（８）Arduino IDE のメニュー直下の「→」ボタン（マイコンボードに書き込む）を押し、ビルドを行います。
「FLASH USB DIRECT Programmer」がインストールされていない場合、エラーが表示されますが、無視してもらって構いません。
（９）Arduino IDE をインストールしたディレクトリ直下に「build」ディレクトリが生成され、その中に ELF ファイルやインテル HEX ファイルが生成されるので、必要なツールを使って FM3 ボードへ書き込みを行います。
「FLASH USB DIRECT Programmer」の場合、インテル HEX ファイルが利用できます。
●動作状況「Hallo・・」
Arduino の setup()内で表示しています「*」は Arduino のloop()内で表示しています「#」は Arduino の周期ハンドラ内でデータを設定し、副タスク内で表示しています

オンボード LED はTOPPERS の main_task()で点滅させていますグラフィック LCD はArduino の loop()内で描画しています

オンボード LED は
TOPPERS の main_task()で点滅させています●最後に
TOPPERS は今回が初めての使用で、ビルド環境の構築からとなり敷居が高かったのですが、公開されている簡易パッケージと松浦さん作成の FM3 用パッチを当て、configure するだけでタスクと周期ハンドラ用の設定や関数が作成され、その後の作業をスムースに進めることができよかったです。
また、Arduino IDE 側バイナリとの結合が不安要素でもありましたが、Linux を使うことになったとはいえ、Arduino IDE と同じ版のコンパイラで問題なくビルドし、結合できたことがコンテストへの応募につながったと思います。
Arduino 用の環境は FM3 という Arduino IDE に対応していない MPU を用いたことで、特定のグラフィックＬＣＤ、キャラクタＬＣＤ、および、汎用のＧＰＩＯまでで限定的な利用範囲となっていますが、Arduino に不足している機能を補完するための手段としての布石になったと思います。
この開発を元により汎用的なツールとして作り上げる人が現れることを期待したいと思います。

●謝辞・グラフィックＬＣＤの制御ライブラリは Seeed Technology Inc.の公開ソースを流用しています。
・マンデルブロ集合の表示プログラムは佐伯英子技術士事務所のサンプルプログラムを参考に作成しています。
http://saeki-ce.xsrv.jp/C_src/mandelbrot01.html
・グラフィックＬＣＤの制御ライブラリに同梱しているフォントデータの権利などは以下の通りです。
//2014 written by mituhiromatuura//pattern data generated from Shinonome-font-12-kanjic BITMAP (Public Domain)
http://openlab.ring.gr.jp/efont/shinonome/●ツール類のダウンロード元・STBEE（Strawberry Linux）簡易パッケージ
https://www.toppers.jp/download.cgi/asp_stbee_gcc-20120310.tar.gz
・Toppers/ASP 用 Linux クロスコンパイラ
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
ダウンロードする版数は、Arduino IDE に同梱されている 2010q1-188 for ARM EABI。
・Arduino IDE プログラム
http://downloads.arduino.cc/arduino-1.5.2-windows.zip
・グラフィックＬＣＤ用ライブラリ
https://github.com/Seeed-Studio/TFT_Touch_Shield_V2/

A

B

C

FRK-FM3-CN1

1

1
3
5
79111315
171921232527
2931
33
3537394143

D4
D6
D8
D10D2E

FRK-FM3-CN22468101214161820222426283032343638404244

D5D7D9135791113151719212325272931333537394143A0A2A4D0 (RxD)
D11
D13+3.3V
D3FRK-FM3-CN3
24681012141618202224262830323436384042
44

CN1CN-44P

2

D

1
3
5791113151719212325272931333537394143

A1A3A5

D1 (TxD)
D12RESET+5.0V

2468101214161820222426283032343638404244

CN2CN-44P

1CN3CN-44P2GND+5.0V

87654321+3.3V
654321RESET

3D2D3D7
D6D5D4CN5CN-8P

CN7CN-6P

GND

GND

A0A1A2A3A4A5+5.0V
D13D12D11D10D9D887654321654321CN6
CN-6P

D7D6D5D4D3D2GND

RS
R/WE
DB7
DB6
DB5DB4
DB3
DB2
DB1
DB0VDD
VO
VSS

132

VR15K
3GND
U1SC1602

Character LCD

D1 (TxD)
D0 (RxD)

CN4CN-8P

Arduino UNO connector"Arduino on TOPPERS" DEMO BOARDDESIGNED BY Y.ISHIOKADATE 2014.09.15

4A4561413121110987BCDE4