TOPPERS/ASPをビルドして動かしてみる

##はじめに
**TOPPERS/ASP**という**リアルタイムOS（RTOS）**を**NUCLEO-F401RE**というマイコンボードで動くよう、Linux環境でソースからビルドするための方法をビルド環境の構築からまとめてあります。自身の備忘録の意味合いが強いですが、RTOS初心者の参考になりそうなので公開してみました。

##TOPPERS/ASPとは
**TOPPERS/ASP**は、TOPPERSプロジェクト（TOPPERS：**T**oyohashi **OP**en **P**latform for **E**mbedded **R**eal-time **S**ystems）が管理、公開しているITRON仕様のRTOSの１つです。
TOPPERS新世代カーネルとしてワンチップマイコンで動かすことができるRTOSです。
**TOPPERS**や**TOPPERSプロジェクト**、**TOPPERS/ASP**の詳細は以下のページを参照してください。

・TOPPERSのページ
　https://www.toppers.jp/
・TOPPERSプロジェクトのページ
　https://www.toppers.jp/project.html
・TOPPERS/ASPカーネルのページ
　https://www.toppers.jp/asp-kernel.html

##TOPPERS/ASPを動かすための準備
###１．マイコンボードを用意しよう
今回は、**STMicroelectronics社**（以下、**STマイクロ**）から発売されている**NUCLEO-F401RE**というマイコンボードを使ってTOPPERS/ASPを動かします。
https://www.st.com/ja/evaluation-tools/nucleo-f401re.html

**NUCLEO-F401RE**はARM社のCortex-M4コアのマイコンを使ったボードです。組込み機器向けなどの展示会のSTマイクロのブースでアンケートに回答すると無料でもらえたりしますし、以下のページのような電子部品を扱う販売店で購入することもできます。
http://akizukidenshi.com/catalog/g/gM-07723/

###２．ソースファイルをゲットしよう
TOPPERS/ASPのソースファイルは以下のページからゲットできます。
https://www.toppers.jp/asp-d-download.html

TOPPERS/ASPは多数のマイコンやマイコンボードで利用できるよう、**ターゲット非依存部**と**ターゲット依存部**の２つに分けて提供されています。
今回は、以下の２つのファイルを使います。
・ターゲット非依存部
　https://www.toppers.jp/download.cgi/asp-1.9.3.tar.gz
・ターゲット依存部
　https://www.toppers.jp/download.cgi/asp_arch_arm_m4_gcc-1.9.5.tar.gz

また、TOPPERS/ASPをビルドするためにはカーネルのコンフィグレーションを行うための**TOPPERS新世代カーネル用コンフィギュレータ（コンフィギュレーションツール）**が必要となるので、以下のファイルもダウンロードします。

・コンフィギュレータ Release 1.9.6 
　https://www.toppers.jp/download.cgi/cfg-1.9.6.tar.gz

###３．ビルド環境を準備しよう（１）
今回はLinux環境でのビルドを目指していますが、主なるPCはWindowsを使っていて、新たにLinux用のPCを用意するのは金銭やスペースの観点から厳しく、Windows上に仮想環境を用意し、そこにLinuxインストールしました。
具体的には VirtuslBoxという仮想環境用のソフトをインストールして仮想マシンを用意し、そこにLinuxのUbuntuをインストールしました。インストール方法などはここでは省略しますが、私が環境構築に使用したファイルを以下に記します。

・VirtualBoxダウンロードのページ
　https://www.virtualbox.org/wiki/Downloads
　　VirtualBox 6.0.4 platform packages
　　・[Windows hosts](https://download.virtualbox.org/virtualbox/6.0.4/VirtualBox-6.0.4-128413-Win.exe) 

・Ubuntuのダウンロードページ
　http://ftp.riken.jp/Linux/ubuntu-releases/xenial/
　　　[<font color="Red">ubuntu-16.04.6-desktop-i386.iso</font>](http://ftp.riken.jp/Linux/ubuntu-releases/xenial/ubuntu-16.04.6-desktop-i386.iso)

ここで<font color="Red">一番の注意点</font>があります。
**コンフィグレーションツール**を正しくビルドするためには**32ビット**環境のLinuxが**必須**です。使用するUbuntuは**32ビット**用をダウンロードし、インストールしてください。
これを間違うとTOPPERS/ASPのビルドは成功したのにマイコンボードで動かないという状況に陥ります。

###４．ビルド環境を準備しよう（２）
PC Linux上でARM Cortex-M4マイコンのビルド（コンパイルやリンク）を行うためには、クロス開発用のコンパイラなどのツールチェーンが必要となります。
LinuxのARM用ツールチェーンは「[**The GNU Embedded Toolchain for Arm**](https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads)」にバイナリが既に用意されていて以下のページからダウンロードすることが可能です。なお、ダウンロードするツールチェーンは32ビットLinux用で、以下のファイルになります。間違えないようにしてください。
・GNU Arm Embedded Toolchain: 5-2016-q3-update September 28, 2016 
　[<font color="Red">gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2</font>](https://developer.arm.com/-/media/Files/downloads/gnu-rm/5_4-2016q3/gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2?revision=111dee36-f88b-4672-8ac6-48cf41b4d375?product=GNU Arm Embedded Toolchain,32-bit,,Linux,5-2016-q3-update)

##ビルド環境の構築
###１．パッケージの追加
Ubuntuがインストールできたら、カーネルのコンフィグレーションやSSHによるログインやファイルの送受信のため、Ubuntu起動後に以下のパッケージをインストールしてください。

```
sudo apt-get install g++
sudo apt-get install libboost-all-dev
sudo apt-get install openssh-server
```

###２．ツールチェーンの展開
次にARM用ツールチェーンをUbuntu上の任意のディレクトリに展開します。私は個人でしか使用しないので、ホームディレクトリ配下に**bin**ディレクトリを作成し、そこでダウンロードした **～.tar.bz2**ファイルを展開しました。
ARM用ツールチェーンを使用する前にPATHにクロスコンパイラのパスを追加してください。

```
mkdir ~/bin
cd ~/bin
tar xjf gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2
export PATH=$PATH:~/bin/gcc-arm-none-eabi-5_4-2016q3/bin/
```
##TOPPERS/ASPのビルド準備
###１．コンフィグレーションツールのビルド
**cfg-1.9.6.tar.gz**をUbuntu上の任意のディレクトリに展開します。
展開すると**cfg**ディレクトリが生成され配下にファイルやディレクトリが展開されます。

```
tar xzf cfg-1.9.6.tar.gz
cd cfg
```

ここで**./configure**を実行したいのですがconfigureファイルの改行コードが**0x0d 0x0a**で作成されているため、このまま実行するとエラーでコンフィグレーションに失敗します。このため、以下の操作で改行コードを**0x0a**のみへ変換します。

```
mv configure configure.org
tr -d '\r' < configure.org > configure
chmod a+x configure
```
変換後、以下のコマンドでコンフィグレーションツールをビルドします。

```
./configure
make
```

ビルドに成功すると以下のコマンドが生成されますが、ここではこのままで次に進みます。

```
./cfg/cfg     ・・・・※１
```

###２．TOPPERS/ASPカーネルのソースの展開

TOPPERS/ASPカーネルのソースファイル**asp-1.9.3.tar.gz**と**asp_arch_arm_m4_gcc-1.9.5.tar.gz**を任意のディレクトリに展開します。展開するとaspディレクトリが生成され、配下は以下のようなディレクトリ構成となります。

```
├─asp
│  ├─arch
│  ├─cfg
│  ├─doc
│  ├─extension
│  ├─include
│  ├─kernel
│  ├─library
│  ├─pdic
│  ├─sample
│  ├─syssvc
│  ├─target
│  │  ├─dve68k_gcc
│  │  ├─stm32e407_gcc
│  │  ├─stm32f401nucleo_gcc　←※２今回使用するターゲット
│  │  ├─stm32f429board_gcc
│  │  ├─stm32f446nucleo144_gcc
│  │  ├─stm32f446nucleo64_gcc
│  │  ├─stm32f4discovery_gcc
│  │  ├─stm32l476discovery_gcc
│  │  ├─stm32l476nucleo64_gcc
│  │  └─stm32l4r5nucleo144_gcc
│  ├─test
│  ├─tools
│  └─utils
```

展開後、先に作成した※１の**cfg**コマンドを./cfgディレクトリ配下へコピーします。

```
mkdir -p cfg/cfg
cp -a {cfgコマンドのパス}/cfg cfg/cfg/.
```

```
├─asp
│  ├─arch
│  ├─cfg
│  │  └─cfg
│  │     └─cfg　←ここにcfgコマンドをコピー
│  ├─doc
```

###３．アプリケーションビルド用ディレクトリの作成

**asp**ディレクトリの１つ上のディレクトリへ戻り、アプリケーション用ディレクトリとアプリケーションビルド用ディレクトリを作成します。
ここではアプリケーション用ディレクトリとしてマイコン種別が分かるよう**401**としましたが、任意のディレクトリ名を付けて構いません。

```
cd ..
mkdir -p 401/obj
```

```
├─asp
│  ├─arch
│  ：
│
└─401　   ←アプリケーション用ディレクトリ
   └─obj  ←アプリケーションビルド用ディレクトリ
```

###４．TOPPERS/ASPカーネルのコンフィグレーション
次に**401/obj**ディレクトリへ移動し、カーネルのコンフィグレーションを行います。
configureコマンドのオプションの意味は以下になります。
 -T：ターゲットの選択
 　　今回は**NUCLEO-F401RE**用なので**stm32f401nucleo_gcc**を設定
 　　asp/target配下のディレクトリ名を指定することで他の
 　　ターゲットを選ぶことが可能です。
 -d：実行環境の選定
 　　RAM以外を設定することでビルド後のコードをFlashメモリ領域に割り当てます。

```
cd 401/obj
../../asp/configure -T stm32f401nucleo_gcc -dROM
```

###５．Makefileの修正
カーネルのコンフィグレーションが成功すると401/obj/Makefileが生成されます。生成されたMakefileの51行目と79行目の定義を確認してください。

```
TARGET = stm32f401nucleo_gcc
```

```
DBGENV := TOPPERS_ROM
```

ビルドで生成されるコードのファイルにバイナリファイルが含まれるよう331行目の次の行に定義を追加します。

```
  $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec
  $(OBJCOPY) -O binary -S $(OBJFILE) $(OBJNAME).bin  ←追加
```

##TOPPERS/ASPのビルド実行
**401/obj**ディレクトリで makeコマンドを実行してください。
ビルドに成功するとasp.binなどTOPPERS/ASPの実行に必要なファイルが生成されます。

```
$ ll asp*
-rwxrwxr-x 1 ubuntu ubuntu 301548  3月 29 04:46 asp*
-rwxrwxr-x 1 ubuntu ubuntu  28600  3月 29 04:46 asp.bin*
-rwxrwxr-x 1 ubuntu ubuntu  85868  3月 29 04:46 asp.srec*
-rw-rw-r-- 1 ubuntu ubuntu   8125  3月 29 04:46 asp.syms
```

##マイコンボードで動かす
###１．マイコンに書き込む
NUCLEO-F401REボードをUSB経由でPCと接続します。接続するとPCからはマスストレージとして認識され、エクスプローラーでファイルのコピー操作が可能となります。
次にUbuntu上でビルドにより生成された asp.binファイルをエクスプローラー経由でNUCLEO-F401REボードへコピーします。
コピーが完了するとボードへの書き込みが完了となります。

###２．実行する
STマイクロのドライバをインストールすると、NUCLEO-F401REボードのUSBは仮想COMポートとしても認識されます。
TeraTermなどのシリアル端末ソフトを立ち上げ、NUCLEO-F401REボードのCOMポートを**115200bps**で接続するとTOPPERS/ASPカーネルが出力するログ情報がシリアル端末ソフト上に表示され、NUCLEO-F401REボード上でTOPPERS/ASPカーネルとサンプルプログラムが動作していることを確認できます。

```
TOPPERS/ASP Kernel Release 1.9.3 for stm32f401-nucleo(Cortex-M4) (Mar 29 2019, 04:46:07)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2014 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN
Copyright (C) 2015-2016 by Education Working Group TOPPERS PROJECT

System logging task is started on port 1.
Sample program starts (exinf = 0).
task1 is running (001).   |
task1 is running (002).   |
task1 is running (003).   |
           ：
```

上記の操作で実行した場合、401/obj/sample1.cがユーザプログラムとしてビルドされ実行しています。sample1.cのコメントには以下のように記述されています。文字を入力すると文字コードにあった動作をログ出力で確認できます。
また、このソースコードを参考に自分で作成したプログラムも動かせます。
イロイロと試してみてください。

```
 *  '1' : 対象タスクをTASK1に切り換える（初期設定）．
 *  '2' : 対象タスクをTASK2に切り換える．
 *  '3' : 対象タスクをTASK3に切り換える．
 *  'a' : 対象タスクをact_tskにより起動する．
 *  'A' : 対象タスクに対する起動要求をcan_actによりキャンセルする．
 *  'e' : 対象タスクにext_tskを呼び出させ，終了させる．
 *  't' : 対象タスクをter_tskにより強制終了する．
 *  '>' : 対象タスクの優先度をHIGH_PRIORITYにする．
 *  '=' : 対象タスクの優先度をMID_PRIORITYにする．
 *  '<' : 対象タスクの優先度をLOW_PRIORITYにする．
 *  'G' : 対象タスクの優先度をget_priで読み出す．
 *  's' : 対象タスクにslp_tskを呼び出させ，起床待ちにさせる．
 *  'S' : 対象タスクにtslp_tsk(10秒)を呼び出させ，起床待ちにさせる．
 *  'w' : 対象タスクをwup_tskにより起床する．
 *  'W' : 対象タスクに対する起床要求をcan_wupによりキャンセルする．
 *  'l' : 対象タスクをrel_waiにより強制的に待ち解除にする．
 *  'u' : 対象タスクをsus_tskにより強制待ち状態にする．
 *  'm' : 対象タスクの強制待ち状態をrsm_tskにより解除する．
 *  'd' : 対象タスクにdly_tsk(10秒)を呼び出させ，時間経過待ちにさせる．
 *  'x' : 対象タスクに例外パターン0x0001の例外処理を要求する．
 *  'X' : 対象タスクに例外パターン0x0002の例外処理を要求する．
 *  'y' : 対象タスクにdis_texを呼び出させ，タスク例外を禁止する．
 *  'Y' : 対象タスクにena_texを呼び出させ，タスク例外を許可する．
 *  'r' : 3つの優先度（HIGH_PRIORITY，MID_PRIORITY，LOW_PRIORITY）のレ
 *        ディキューを回転させる．
 *  'c' : 周期ハンドラを動作開始させる．
 *  'C' : 周期ハンドラを動作停止させる．
 *  'b' : アラームハンドラを5秒後に起動するよう動作開始させる．
 *  'B' : アラームハンドラを動作停止させる．
 *  'z' : 対象タスクにCPU例外を発生させる（タスクを終了させる）．
 *  'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる（プログラムを
 *        終了する）．
 *  'V' : get_utmで性能評価用システム時刻を2回読む．
 *  'v' : 発行したシステムコールを表示する（デフォルト）．
 *  'q' : 発行したシステムコールを表示しない．
```

次はユーザが作成したソースファイルの追加やユーザプログラムのディレクトリ構成をMakefileに反映する方法を投稿してみたいと思っています。

－ 以上 －