TOPPERS/TTSPをathrillで動作させる

#概要
[athrill](https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97)のCIツールとして，TOPPERS/TTSPを利用しようと考えています．
※TTSPの詳細は，[こちら](https://www.toppers.jp/ttsp.html)を参照ください．

ただし，TTSPをそのまま適用することはできないので，athrill用に移植しなければなりません．

本記事では，誰かが同じところでトラブらないように，TTSPの移植までの道のりを記録として残しておくことにします．

#ゴール設定
TTSP移植のゴール設定ですが，最終ゴールは以下のとおりです．

『athrill の修正をコミットしたら，クラウド上で TTSP が実行され，CI環境として利用できるようになる』

#サブゴール設定
いきなりゴールに行き着くのは難しいので，以下のサブゴールを設定します．

* 1. クラウド上で CI 実行できる環境構築する
* 2. TTSP のマニュアルを理解して，概念をクラス図で表す
* 3. TTSP が実行するTOPPERS/OSを athrill 用に移植する
* 4. TTSP のターゲット依存コードを実装する
* 5. TTSP の１ケースをビルドできるようにする
* 6. TTSP の１ケースを実行できるようにし，CI環境で動作させる
* 7. TTSP のテストケース数をどこまで増やすか決める
* 8. TTSP の対応対象テストの全ビルド実行できるようにする
* 9. TTSP の対応対象テストの全テスト実行できるようにする
* 10. 上記 TTSP をCI上で実行できるようにする

#進捗状況
* 2018/7/15時点では，進捗率30%(3まで)
* 2018/7/22時点では，進捗率100%

一部，テストでエラーが発生していましたが，すべてのバグ修正できました．
※athrill2のバグを１件検出できましたー．
※その他は，すべてターゲット依存部のバグでした．

以下，進捗状況詳細です．

## 1. クラウド上で CI 実行できる環境構築する
以下のサイトを参考にさせていただき，athrill用のCI環境の構築できました．
意外に簡単にできてびっくりしました(便利な世の中になったものだ)．

* [Travis CIによるC言語プログラムの自動テスト](http://kivantium.hateblo.jp/entry/2016/09/23/163408)

.travis.yml　の内容は以下のように単純化しています．
※将来的にもう少し見直しする予定ですが，一旦はこれで十分．

```
language: c
compiler:
  - gcc
script:
  - ls -l /bin/sh
  - echo ${HOME}
  - pwd
  - ls -l
  - bash test/do_build.sh
  - bash test/do_test.sh
```

★注意事項：
★travisのubuntu環境では，デフォルトshが「dash」で設定されています．
★そのため，bash前提で作成したシェルスクリプトを実行すると思わぬエラーに悩まされます．．
★この問題を回避するためには，明示的にbashでシェルスクリプトを起動する必要があります．

## 2. TTSP のマニュアルを理解して，概念をクラス図で表す
TTSPのマニュアルをざっと理解して，用語の関係性をまとめました．
※不足・不備等あれば，適宜直していきます．

![TTSP.png](https://qiita-image-store.s3.amazonaws.com/0/244147/e5a8e75e-8a99-ae54-1f65-928f3f10b420.png)

## 3. TTSP が実行するTOPPERS/OSを athrill 用に移植する
現状，TTSPはASP3には対応していないようでしたので，ASPをathrillに移植しました．成果は，以下にコミット済みです．

https://github.com/tmori/athrill/tree/master/test/test_os/asp

### ビルドおよび動作確認結果
* OBJ フォルダ配下で以下のコマンドを実行

```
$ make clean;make depend;make
$ ls -l asp
-rwxrwxr-x 1 tmori tmori 254705  7月 15 18:47 asp
```
* OBJ フォルダ配下でaspを実行

以下のコマンドを実行して，起動するところまで確認済み．
※細かな動作確認まではできていないけれど，TTSPで問題を洗い出せるので一旦放置しておきます．

```
$ athrill2 -c1 -m memory.txt -d device_config.txt -i asp
core id num=1
ROM : START=0x0 SIZE=512
RAM : START=0x3ff7000 SIZE=512
Elf loading was succeeded:0x0 - 0x9653 : 37.595 KB
Elf loading was succeeded:0x9654 - 0xd328 : 0.0 KB
ELF SYMBOL SECTION LOADED:index=17
ELF SYMBOL SECTION LOADED:sym_num=481
ELF STRING TABLE SECTION LOADED:index=18
[DBG>
HIT break:0x0
[NEXT> pc=0x0 kernel_cfg_asm.S 24
c
[CPU>System logging task is started on port 1.
q
[NEXT> pc=0x10f4 sample1.c 361
```
## 4. TTSP のターゲット依存コードを実装する
詳細は，[TTSP のターゲット依存コードを実装する](https://qiita.com/kanetugu2018/items/43fdcb578f1d9c1dcbcb)を参照ください．

## 5. TTSP の１ケースをビルドできるようにする
TTSPでは，ターゲット依存部のテスト，APIテスト，SILテストがありますが，案外簡単にビルドできました．
以下，ビルド手順です．

* athrillプロジェクト内でttspルートディレクトリへ移動する

```
$ cd test/test_os/asp/ttsp
```
* ttbを起動する

```
$ ./ttb.sh
======================================================================
 TTSP main menu
======================================================================
 1: API Tests
 2: SIL Tests
 c: Check the Functions for Target Dependent
 k: Kernel Library
 q: Quit
----------------------------------------------------------------------
 Please input menu no: 
```

* ターゲット依存部コードをビルドする(TTSP main menu で「c]を入力)


```
======================================================================
 Check the Functions for Target Dependent
======================================================================
 1: Check all function (No.2-4)
 2: Check exception
 3: Check interrupt
 4: Check timer
 r: Return to main menu
 q: Quit
----------------------------------------------------------------------
Please input menu no: 
```

上記選択画面で，「1」を入力することでターゲット依存部の全ビルドが行われます．


* SILテストコードをビルドする(TTSP main menu で「2]を入力)


```
======================================================================
 SIL Tests
======================================================================
 1: Build the program (No.2-4)
 2: Make folder for SIL test
 3: "make depend" for SIL test
 4: "make" for SIL test
 5: "make clean" for SIL test
 6: "make realclean" for SIL test
 e: Run executable module (Target Dependent)
 r: Return to main menu
 q: Quit
----------------------------------------------------------------------
Please input menu no: 
```

上記選択画面で，「1」を入力することでSILテストの全ビルドが行われます．


* APIテストコードをビルドする(TTSP main menu で「3]を入力)


```
======================================================================
 API Tests
======================================================================
 1: Auto-Code Test
 2: Scratch-Code Test
 3: Configuration Error Test
 4: Test for specified TESRY
 r: Return to main menu
 q: Quit
----------------------------------------------------------------------
Please input menu no: 
```

上記選択画面で，「1」を入力すると以下の選択画面が更に出てきます．

```
======================================================================
 API Tests (Auto-Code Test)
======================================================================
 1: Generate a MANIFEST file for All TESRYs
 2: Generate a MANIFEST file for each functions
 3: Generate a MANIFEST file divided by specified number
 4: Build all program files (No.5-8)
 5: Make MANIFEST folders
 6: Execute TTG
 7: "make depend" for each MANIFEST folders
 8: "make" for each MANIFEST folders
 9: "make clean" for each MANIFEST folders
 a: "make realclean" for each MANIFEST folders
 b: Operate a specified MANIFEST folder
 e: Run executable module (Target Dependent)
 r: Return to main menu
 q: Quit
----------------------------------------------------------------------
 Please input menu no: 
```
上記選択画面で，「3」を入力し，４分割選択したあと，「4」を入力すると，APIテストバイナリが４個できます．

ここで４分割した理由ですが，最初は「1」を入力してビルドを試みたのですが，ROMサイズが4MB近くまで膨れ上がってしまい，V850の「jr命令」で飛べる範囲を超え始めてしまったためです(リンクエラーが大量に出ます…)．

なお，TTGはruby1.8系で動作確認されており，私のruby環境(ruby2.3)ですと，APIテストコード生成時にエラーとなりました．
そのため，一番近いruby1.9系に切り替えてコード生成するようにしています．

* ビルド結果確認

ビルドが成功すると，以下のディレクトリ配下に，それぞれテストバイナリが「asp」というファイル名で配置されています．

```
test/ttsp/obj/
├── api_test
│   ├── auto_code_1
│   │   └── asp
│   ├── auto_code_2
│   │   └── asp
│   ├── auto_code_3
│   │   └── asp
│   └── auto_code_4
│       └── asp
├── check_library
│   ├── exception
│   │   └── asp
│   ├── interrupt
│   │   └── asp
│   └── timer
│       └── asp
└── sil_test
    └── asp
```
## 6. TTSP の１ケースを実行できるようにし，CI環境で動作させる
CI環境からテストを実行する場合，テスト実行シェルスクリプトを独自に作成する必要があります※．
※ttb.shからテスト実行させることもできますが，入力待ちとなるので，CI向きではないと判断しました．

よって，scriptsディレクト配下に以下のテスト実行シェルスクリプトを配置しました．
また，テスト結果格納用ログをscripts/logディレクトリで管理することにしました．

```
test/scripts/
├── do_test_asp_api.sh
├── do_test_asp_sil.sh
├── do_test_asp_target_exception.sh
├── do_test_asp_target_interrupt.sh
├── do_test_asp_target_timer.sh
└── log
    ├── do_test_asp_api.log
    ├── do_test_asp_sil.log
    ├── do_test_asp_target_exception.log
    ├── do_test_asp_target_interrupt.log
    └── do_test_asp_target_timer.log

```

## 7. TTSP のテストケース数をどこまで増やすか決める
TTSPでは，「静的API」，「動的API」を確認するテストがありますが，今回は「動的API」のみをテスト対象とすることにしました．
理由は，静的APIはターゲット非依存と思われ，athrillの検査という視点では優先度はそれほど高くないためです．
ただ，OSのテスト環境構築という視点では必須になってきますので，将来的には対応していきたいと考えています．


## 8. TTSP の対応対象テストの全ビルド実行できるようにする
上述の通り，動的APIについては全ビルドできるようになりました．


## 9. TTSP の対応対象テストの全テスト実行できるようにする
現状テスト実行状況です．

|テスト|テスト実行有無|テスト結果|NG内容|
|-----|-----|-----|-----|
|ターゲット依存(timer)|○|OK|-|
|ターゲット依存(割り込み)|○|OK|-|
|ターゲット依存(CPU例外)|○|OK|-|
|SILテスト|○|OK|-|
|APIテスト(auto_code_1)|○|OK|-|
|APIテスト(auto_code_2)|○|OK|-|
|APIテスト(auto_code_3)|○|OK|-|
|APIテスト(auto_code_4)|○|OK|-|

## 10. 上記 TTSP をCI上で実行できるようにする
TTSPが生成したテストコードは，ローカルでビルドして，バイナリのみテストツールとしてコミットしています．
※テストコードのビルドをCI上で実施していないのは，v850のgccをCI環境にインストールできていないためです．

現状，athrillプロジェクトの .travis.yml からテスト実行シェルスクリプト(do_test.sh)を起動し，以下のテストを流せるようになっています．

|テスト|CI対応有無|
|-----|-----|
|ターゲット依存(timer)|○|
|ターゲット依存(割り込み)|○|
|ターゲット依存(CPU例外)|○|
|SILテスト|○|
|APIテスト(auto_code_1)|○|
|APIテスト(auto_code_2)|○|
|APIテスト(auto_code_3)|○|
|APIテスト(auto_code_4)|○|


#関連記事
* [athrill(アスリル) を使用して TOPPERS OS(ASP3) をデバッグ](https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97)
* [マルチコア対応仮想環境(athrill)を使用して TOPPERS/ATK2 を実行する](https://qiita.com/kanetugu2018/items/b43c5715124f42a0393d)
* [メモリ保護対応版 athrill(アスリル) のご紹介](https://qiita.com/kanetugu2018/items/f2205475c4a4eae699c0)
* [今さらなぜCPUエミュレータを自作しようとおもったのか？](https://qiita.com/kanetugu2018/items/d692e612c3d4d715c0ad)
* [athrill(アスリル)機能マニュアル](https://qiita.com/kanetugu2018/items/cf3dea16710a3f0737e8)
* [athrill(アスリル) を使用してベアメタル・プログラミング(１回目：main関数が動き出すまで)](https://qiita.com/kanetugu2018/items/7d2ce8def53cb9bda06b)
* [athrill(アスリル) を使用してベアメタル・プログラミング(2回目：割り込みがソフトウェアに通知されるまで)](https://qiita.com/kanetugu2018/items/8cb411717511ca96bc64)