TOPPERS/ASP(2020-03-10版)をビルドして動かす

##はじめに
以前にも「<a href="https://qiita.com/Yukiya_Ishioka/items/9ecbe080939600c323c6">TOPPERS/ASPをビルドして動かしてみる</a>」、「<a href="https://qiita.com/Yukiya_Ishioka/items/63618319d47ac743a631">TOPPERS/ASP3をビルドして動かしてみる</a>」としてTOPPERS/ASPを題材にした記事を投稿しましたが、**2020年03月10日付**の ARM Cortex-M4用と ARM Cortex-M7用の依存部パッケージのバージョンアップされてたという記事を見つけたので、この新しいバージョンのソースコードを使って再び**ビルド**と**実行**を試してみることにしました。

・TOPPERSホームページ
　https://www.toppers.jp/

・ASP 1.9.6 ARM Cortex-M4アーキテクチャ・GCC依存部パッケージ
　https://www.toppers.jp/asp-d-download.html#arm_m4

・ASP 1.9.5 ARM Cortex-M7アーキテクチャ・GCC依存部パッケージ
　https://www.toppers.jp/asp-d-download.html#arm_m7

いままでのQiitaの記事では ARM Cortex-M4をコアに持つ **STMicroelectronics社**（以下、**STマイクロ**）から発売されている**NUCLEO-F401RE**というマイコンボード用のコードだけをビルドして実行していましたが、今回は**Cortex-M7**をコアに持つボードを含めて以下の４つのボード用のコードをビルドして動作させてみました。

・NUCLEO-F401RE
・NUCLEO-F446RE
・NUCLEO-G474RE
・STM32F7-DISCOVERY

ちなみに「NUCLEO-G474RE」は「ARM Cortex-M4アーキテクチャ」の今回のバージョンアップで追加されたボードになります。
※他のボードは以前のバージョンで対応済みです。

![gra_f401_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/fe5e4139-d587-4611-65ba-9ffa93e898c1.jpeg) ![gra_f446_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/88cb465e-4b5b-7c50-8e26-bd146063e03f.jpeg)
![gra_g474_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/73a40acc-9a91-0f40-d91f-cfe184e09cf4.jpeg) ![gra_f7disc1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/200251a3-95eb-8e04-37f8-8d1afd47b4d6.jpeg)

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

・TOPPERS/ASPカーネルのページ
　https://www.toppers.jp/asp-kernel.html

###ビルド環境について
今回のビルド環境も以前のQiitaの記事と同様に Linux上に Arm Cortex-M用のクロスコンパイラなどのツールチェーンをインストールしてTOPPERS/ASPなどのソースコードをビルドしていきます。
環境構築に必要なファイルの所在や展開方法、注意点を「<a href="https://qiita.com/Yukiya_Ishioka/items/9ecbe080939600c323c6">TOPPERS/ASPをビルドして動かしてみる</a>」の「TOPPERS/ASPを動かすための準備」「ビルド環境の構築」に記してあり、今回のTOPPERS/ASPもこの環境でビルドできますので、そちらの<a href="https://qiita.com/Yukiya_Ishioka/items/9ecbe080939600c323c6">記事</a>を参考に環境構築してください。

##TOPPERS/ASPのビルド準備
ビルド環境の準備が整ったら、次に実際にTOPPERS/ASPをビルドするための準備を行います。

###１．ソースファイルの取得
ビルドをするにあたり、TOPPERS/ASPのターゲット非依存部と、今回の対象であるCortex-M4とCortex-M7のターゲット依存部のソースコードを以下からダウンロードします。

・ターゲット非依存部
　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.6.tar.gz
　https://www.toppers.jp/download.cgi/asp_arch_arm_m7_gcc-1.9.5.tar.gz

また、TOPPERS/ASPのソースコードの他に、ビルドに必要なコンフィグレータもダウンロードします。

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

###２．コンフィグレーションツールのビルド
**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.6.tar.gz**
　**asp_arch_arm_m7_gcc-1.9.5.tar.gz**

```
cd ..
tar xzf asp-1.9.3.tar.gz
tar xzf asp_arch_arm_m4_gcc-1.9.6.tar.gz
tar xzf asp_arch_arm_m7_gcc-1.9.5.tar.gz
```


まず、asp-1.9.3.tar.gzを展開すると aspディレクトリ配下にTOPPERS/ASPカーネルの本体が展開されます。

```
asp
|-- arch
|   |-- gcc
|   |-- logtrace
|   `-- m68k_gcc
|-- doc
|-- extension
|-- include
|-- kernel
|-- library
|-- pdic
|-- sample
|-- syssvc
|-- target
|   `-- dve68k_gcc
|-- test
`-- utils
```


次に**asp_arch_arm_m4_gcc-1.9.6.tar.gz**と**asp_arch_arm_m7_gcc-1.9.5.tar.gz**を展開すると、それぞれ**asp**ディレクトリ配下の**arch**ディレクトリと**target**ディレクトリへ **Cortex-M4**用、**Cortex-M7**用のそれぞれのターゲット依存部のコードが展開されます。

asp_arch_arm_m4_gcc-1.9.6.tar.gzを単体で展開した場合の構成

```
asp
|-- arch
|   |-- arm_m_gcc
|   |   |-- common
|   |   |-- stm32f4xx
|   |   |-- stm32g4xx
|   |   |-- stm32l4xx
|   |   `-- stm32wbxx
|   `-- gcc
|-- target
|   |-- stm32e407_gcc
|   |-- stm32f401nucleo_gcc
|   |-- stm32f429board_gcc
|   |-- stm32f446nucleo144_gcc
|   |-- stm32f446nucleo64_gcc
|   |-- stm32f4discovery_gcc
|   |-- stm32g431nucleo64_gcc
|   |-- stm32g474nucleo64_gcc
|   |-- stm32l476discovery_gcc
|   |-- stm32l476nucleo64_gcc
|   |   `-- stm32l4xx
|   |-- stm32l4r5nucleo144_gcc
|   `-- stm32wb55nucleo_gcc
`-- tools
    |-- TrueSTUDIO
    |   `-- stm32f401nucleo
    `-- rommon
```


asp_arch_arm_m7_gcc-1.9.5.tar.gzを単体で展開した場合の構成

```
asp
|-- arch
|   |-- arm_m_gcc
|   |   |-- common
|   |   |-- stm32f7xx
|   |   `-- stm32h7xx
|   `-- gcc
|-- target
|   |-- stm32f723discovery_gcc
|   |-- stm32f746nucleo144_gcc
|   |-- stm32f767nucleo144_gcc
|   |-- stm32f769discovery_gcc
|   |-- stm32f7discovery_gcc
|   `-- stm32h743nucleo144_gcc
`-- tools
```


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

```
mkdir -p asp/cfg/cfg
cp -a cfg/cfg/cfg asp/cfg/cfg/
```

```
asp
 |-- arch
 |-- cfg
 |   `-- cfg
 |       `-- cfg　←ここへ cfgコマンド をコピー
 `-- doc
```


###４．アプリケーションビルド用ディレクトリの作成
アプリケーション用ディレクトリとアプリケーションビルド用ディレクトリを作成します。
ここではアプリケーション用ディレクトリとしてマイコン種別が分かるディレクトリ名にしましたが、任意のディレクトリ名を付けて構いません。

```
mkdir -p f401/obj
mkdir -p f446/obj
mkdir -p g474/obj
mkdir -p f7disc/obj
```

```
asp
 |-- arch
 |  ：
 |
 |-- f401     ←アプリケーション用ディレクトリ
 |   `-- obj  ←アプリケーションビルド用ディレクトリ
 |
 |-- f446
 |   `-- obj
 |
 |-- g474
 |   `-- obj
 |
 `-- f7disc
     `-- obj
```

##TOPPERS/ASPのビルド実行
###１．TOPPERS/ASPカーネルのコンフィグレーション
次にビルド対象のマイコン種別の**/obj**ディレクトリへ移動し、カーネルのコンフィグレーションを行います。
configureコマンドのオプションの意味は以下になります。
 -T：ターゲットの選択
 　　今回動作させるボードに合わせ、それぞれのディレクトリで以下の文字列を指定します。
 　　　stm32f401nucleo_gcc
 　　　stm32f446nucleo64_gcc
 　　　stm32g474nucleo64_gcc
 　　　stm32f7discovery_gcc
 　　asp/target配下のディレクトリ名を指定することで他の
 　　ターゲットを選ぶことが可能です。
 -d：実行環境の選定
 　　「**RAM**」以外を指定することでビルド後のコードをFlashメモリ領域へ割り当てます。

それぞれのディレクトリへ移動し、configureコマンドを実行します。

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

```
cd ../..
cd f446/obj
../../asp/configure -T stm32f446nucleo64_gcc -dROM
```

```
cd ../..
cd f446/obj
../../asp/configure -T stm32g474nucleo64_gcc -dROM
```

```
cd ../..
cd f7disc/obj
../../asp/configure -T stm32f7discovery_gcc -dROM
```

###２．Makefileの確認と修正
コンフィグレーションに成功すると、**obj**ディレクトリ配下に**Makefile**が生成されます。生成された**Makefile**の**51行目**と**79行目**の定義を確認してください。

```
TARGET = stm32f401nucleo_gcc　←configureコマンドで指定したターゲット名
```

```
DBGENV := TOPPERS_ROM
```

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

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

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

```
make
```

```
$ ll asp*
-rwxrwxr-x 1 ubuntu ubuntu 301548  3月 25 02:54 asp*
-rwxrwxr-x 1 ubuntu ubuntu  28600  3月 25 02:54 asp.bin*
-rwxrwxr-x 1 ubuntu ubuntu  85868  3月 25 02:54 asp.srec*
-rw-rw-r-- 1 ubuntu ubuntu   8125  3月 25 02:54 asp.syms
```

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

###２．実行する
STマイクロのドライバをインストールすると、各マイコンボードのUSBは仮想COMポートとしても認識されます。
TeraTermなどのシリアル端末ソフトを立ち上げ、各マイコンボードのCOMポートを**115200bps**で接続するとTOPPERS/ASPカーネルが出力するログ情報がシリアル端末ソフト上に表示され、TOPPERS/ASPカーネルとサンプルプログラムが動作していることを確認できます。
今回は全て同じサンプルプログラムを動作させているため表示はほとんど同じですが、起動直後の１行目にターゲットやマイコンコア名、および、ビルドの日時が出力されるので、異なるボードやプログラムが動作していることが確認できると思います。

・NUCLEO-F401REの出力例

```
TOPPERS/ASP Kernel Release 1.9.3 for stm32f401-nucleo(Cortex-M4) (Mar 24 2020, 01:13:55)
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).   |
           ：
```

・NUCLEO-F446REの出力例

```
TOPPERS/ASP Kernel Release 1.9.3 for stm32f446-nucleo-64(Cortex-M4) (Mar 24 2020, 01:27:50)
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) 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).   |
           ：
```

・NUCLEO-G474REの出力例

```
TOPPERS/ASP Kernel Release 1.9.3 for stm32fg474-nucleo-64(Cortex-M4) (Mar 24 2020, 01:36:13)
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) 2016-2019 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).   |
           ：
```

・STM32F7-DISCOVERYの出力例

```
TOPPERS/ASP Kernel Release 1.9.3 for stm32f7-discovery(Cortex-M7) (Mar 24 2020, 01:31:49)
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, JAPAN

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).   |
           ：
```

##さいごに
以前のTOPPERS/ASPの記事を書いたときにもユーザプログラムやMakefileへの登録方法を記事にしたいと書きましたが、毎回、TOPPERS/ASPに付属のサンプルプログラムでは面白みに欠けるので、次あたりには今回作成したビルド環境を利用したアプリケーション絡みの記事を書きたいと思います。


##付録：リンク一覧

・TOPPERS/ASPをビルドして動かしてみる
　https://qiita.com/Yukiya_Ishioka/items/9ecbe080939600c323c6

・TOPPERS/ASP3をビルドして動かしてみる
　https://qiita.com/Yukiya_Ishioka/items/63618319d47ac743a631

・TOPPERS/ASPカーネルのページ
　https://www.toppers.jp/asp-kernel.html

・ASP 1.9.6 ARM Cortex-M4アーキテクチャ・GCC依存部パッケージ
　https://www.toppers.jp/asp-d-download.html#arm_m4

・ASP 1.9.5 ARM Cortex-M7アーキテクチャ・GCC依存部パッケージ
　https://www.toppers.jp/asp-d-download.html#arm_m7

・ターゲット非依存部
　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.6.tar.gz
　https://www.toppers.jp/download.cgi/asp_arch_arm_m7_gcc-1.9.5.tar.gz

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


－ 以上 －