athrill(アスリル) を使用して TOPPERS OS(ASP3) をデバッグ

#概要
PC上で組込み系プログラムをデバッグしたいと思っている方に向けて、１つのソリューションをご紹介します。本ソリューションを使用してデバッグできるプログラムは以下のものです。

* ベアメタル・プログラム
* 組込み制御系 OS(TOPPERS OS, AUTOSAR OS 等)
* OS上で動作するリアルタイムなアプリケーション

今回は、[TOPPERS OS(ASP3)](https://www.toppers.jp/asp3-kernel.html)をデバッグします。

#athrill(アスリル)
ここでご紹介するソリューション (CPU エミュレータ) は athrill(アスリル) というものです。
athrillは、[athrill開発プロジェクト](https://github.com/tmori/athrill)で公開されているオープンソースですので、誰でも使用可能です。
※[第7回TOPPERS活用アイデア・アプリケーション開発コンテスト](https://www.toppers.jp/contest.html) 活用アイディア部門の受賞作品

athrillの特徴を以下にまとめます(2018/03時点)。

* 仮想化範囲

|項目|詳細|
|---|---|
|CPU|V850| 
|割り込みコントローラ|多重割り込み可能|
|周辺デバイス|CAN、タイマ、シリアル、A/D変換器等|
|マルチノード対応|エミュレータ間でCAN通信可能|

* 支援機能

|項目|詳細|
|---|---|
|対話型CUI機能|CUIでCPUエミュレータをコントロールできる|
|デバッグ機能|gdbライクにデバッグできる|
|割り込み機能|任意のタイミングで任意の割り込み発生できる|
|命令ログ機能|命令実行ログがログファイルとして保存できる|
|プロファイル機能|性能解析用に関数単位での命令数を計測できる|

* ソース

|項目|詳細|
|---|---|
|ソース|OSS|
|ライセンス|TOPPERSライセンス|

#動作環境
|項目|詳細|
|---|---|
|OS|MinGW(Windows10, 7)), Linux(Ubuntu(32bit, 64bit))| 
|ソースデバッグ用エディタ|Windows(サクラエディタ), Linux(Visual Studio Code)|


#ダウンロード方法
GitHub上で公開されいてる[athrill開発プロジェクト](https://github.com/tmori/athrill)をダウンロードしてください。

#インストール方法
* Windows

|step|概要|詳細|
|---|---|---|
| 1 |環境変数登録|環境変数Pathに以下を追加する<br> [1] [athrill root folder]/bin/windows<br> [2] サクラエディタバイナリ配置フォルダパス|
| 2 |MinGW起動|MinGWのターミナルを起動する|
| 3 |インストール確認|MinGWのターミナル上で athrillを空打ちする|

* Linux

|step|概要|詳細|
|---|---|---|
| 1 |ターミナル起動|任意のターミナルを起動する|
| 2 |環境変数登録|`export PATH=[athrill root folder]/bin/linux:$PATH`|
| 3 |[Visual Studio Code](https://code.visualstudio.com/#alt-downloads) のインストール|`$ dpkg -i code_1.21.1-1521038898_i386.deb`|
| 4 |インストール確認|ターミナル上で athrillを空打ちする|

athrillを空打ちして、以下のメッセージが出力されていれば、インストール成功です。

	Usage:athrill -m<memory config file> [OPTION]... <load_file>
	-c                             : set core num. if -c is not set, core num = 2.
	-i                             : execute on the interaction mode. if -i is not set, execute on the background mode.
	-r                             : execute on the remote mode. this option is valid on the interaction mode.
	-t<timeout>                    : set program end time using <timeout> clocks. this option is valid on the background mode.
	-m<memory config file>         : set athrill memory configuration. rom, ram region is configured on your system.
	-d<device config file>         : set device parameter.

#事前準備
デバッグ対象となるプログラムは、事前にv850のクロスコンパイラでビルドされている必要があります。v850のクロスコンパイラは、[このサイト](https://gcc-renesas.com/ja/v850/v850-download-toolchains/)からダウンロードできます。

athrillプロジェクトでは、すでにビルド済みのTOPPERS OS(ASP3)のサンプルプログラムを用意していますので、そのバイナリを使用して、athrillの使用方法をお見せします。

サンプル・バイナリの配置場所は、
　"athrill/sample/os/asp3/OBJ/asp"
です。

#デモ
今回のデモは、Ubuntu(32bit)環境で、Visual Studio COde を使用します。
`$ uname -a`

     4.13.0-38-generic #43-Ubuntu SMP Wed Mar 14 15:23:42 UTC 2018 i686 i686 i686 GNU/Linux

`$ cat /etc/lsb-release` 

    DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=17.10
    DISTRIB_CODENAME=artful
    DISTRIB_DESCRIPTION="Ubuntu 17.10"


|step|デバッグ内容|
|---|---|
|0|Visual Studio Codeを起動する| 
|1|athrillを起動する| 
|2|asp3を実行する|
|3|TASK1の特定ポイント(sample1.c 150行目)にブレークポイント設定|
|4|割り込み番号 36 の割り込みを発生させる|
|5|命令ログを参照し、TASK1のブレークポイントから割り込みが発生し、もとのTASK1の処理に戻っていることを確認する|

##Visual Studio Code 起動

以下のコマンドで Visual Studio Code を起動します。

```
 $ code
```
![vscode.png](https://qiita-image-store.s3.amazonaws.com/0/244147/f7d9a64f-999f-a818-f815-a1c41a924595.png)

Visual Studio Code 起動後、athrill プロジェクトのトップフォルダをワークスペースフォルダとして追加してください。athrill でデバッグする場合、ターミナルは右側に配置しておくと便利です。

ターミナル上でカレントディレクトリを asp3 のフォルダに移動してください。

```
 $ cd sample/os/asp3/OBJ
```

##athrill 起動
athrill に asp バイナリファイル(ELF形式)を渡して起動します。

```
 $ athrill -i -m memory.txt -d device_config.txt asp
```

![athrill_up.png](https://qiita-image-store.s3.amazonaws.com/0/244147/34e645e8-5e5b-a620-6f9a-9102a788b112.png)

athrillが起動すると、ELFファイルのローディングメッセージが出力され、プログラムカウンタのアドレス 0x0 番地に停止し、コマンド入力待ちとなります。
※オプション説明
※ -i :インタラクションモード(デバッグするためのオプション)
※ -d :デバイスコンフィグファイル(athrill のカスタマイズ情報を指定する)

##asp3 実行
athrill のコマンド上で、continue コマンド(c)を実行すると、asp3の起動メッセージが出力され、TASK1 のメッセージが連続出力されていることがわかります。

![asp3_exec.png](https://qiita-image-store.s3.amazonaws.com/0/244147/4ab259ec-c2b5-1f61-f535-752bb91c8f65.png)

##ブレークポイント設定
ブレークポイントは、「関数名」、「ファイル名と行番号のセット」、「アドレス番地」のいずれかで設定できます。今回は、TASK1 の特定ポイント(sample1.c 150行目)に設定し、continueすると、設定したポイントでブレーク発生していることがわかります。

```
[DBG>b sample1.c 150
break 0x916
```

さらに、「lコマンド」を実行すると、Visual Studio Codeの左側のエディタに、該当ファイル/行を指し示してくれます。

![l_command.png](https://qiita-image-store.s3.amazonaws.com/0/244147/cda3edd2-3df0-7512-6dca-1d7ece44804e.png)

※「lコマンド」を実行するとフォーカスを奪われますので、Visual Studio Code のキーボード・ショートカットで
※「前のターミナルフォーカス」に「Ctrl+L」を割り当てると便利です。

##割り込み発生
割り込み発生コマンド(i コマンド)を使用すると、任意の割り込みを発生させることができるます。今回は、36 番の割り込みを発生させ、ステップ実行(n コマンド)します。

```
[DBG>i 36
[DBG>n
[DONE> core0 pc=0x95c task(+ec) 0x95c: B cond(0x1):0x94c
[NEXT> pc=0x2c0 kernel_cfg_asm.S 415
```

0x94c 番地の命令実行後、プログラムカウンタが 0x2c0 番地に移動していることがわかります。0x2c0 番地は 36 番の割り込み発生時のアドレス番地であり,割り込み発生したことになります。割り込み発生してから、プログラムカウンタが TASK1 に戻るまでの命令の流れを記録するため、v コマンドでロギングしてみます。

```
[DBG>v
VIEW_MODE=ON
```

##命令ログ確認
命令ログは athrill 起動フォルダ直下に log.txt としてテキスト出力されます。エクスプローラから log.txt をクリックし、内容を確認すると、v コマンド実行からのログ情報が大量に生成されていることがわかります(1 行 1 命令)。

![log_start.png](https://qiita-image-store.s3.amazonaws.com/0/244147/3293509d-1694-dbc7-3ec3-3e51d1a4ac10.png)

1行目のログ情報は、TASK1 の命令実行ポイントであり,その直後に 36 番地の割り込み発生し,割り込み処理が実行されていることがわかります。最終行を確認すると、割り込み復帰命令(RETI)実行後、無事、TASK1 の命令アドレス(0x94c)に戻っていることが確認できました！

![log_end.png](https://qiita-image-store.s3.amazonaws.com/0/244147/3f6333fd-dbe9-c8f0-794d-a112b1afc1b0.png)

#関連記事
* [マルチコア対応仮想環境(athrill)を使用して TOPPERS/ATK2 を実行する](https://qiita.com/kanetugu2018/items/b43c5715124f42a0393d)
* [メモリ保護対応版 athrill(アスリル) のご紹介](https://qiita.com/kanetugu2018/items/f2205475c4a4eae699c0)
* [今さらなぜCPUエミュレータを自作しようとおもったのか？](https://qiita.com/kanetugu2018/items/d692e612c3d4d715c0ad)
* [athrill(アスリル)を使用してC言語ポインタ変数を理解する](https://qiita.com/kanetugu2018/items/b9ad84c2f74324174864)
* [athrill(アスリル)機能マニュアル](https://qiita.com/kanetugu2018/items/cf3dea16710a3f0737e8)
* [athrill(アスリル) を使用してベアメタル・プログラミング(１回目：main関数が動き出すまで)](https://qiita.com/kanetugu2018/items/7d2ce8def53cb9bda06b)
* [athrill(アスリル) を使用してベアメタル・プログラミング(2回目：割り込みがソフトウェアに通知されるまで)](https://qiita.com/kanetugu2018/items/8cb411717511ca96bc64)
* [WSLでマイコンシミュレータ環境(athrill)をつくる](https://qiita.com/Maeda-Shoota/items/4b1be75a6c4993522ab1)
* [TOPPERS/ATK2カーネル向け実機レス環境(athrill2)](https://qiita.com/kanetugu2018/items/75dadc340f3db2a344ab)
* [64bitCPUへの道 and/or 64歳の決意(1)V850/RH850 gcc 64bit](https://qiita.com/kaizen_nagoya/items/9934c0f9911ad29779b5)
* [dockerでathrill](https://qiita.com/kaizen_nagoya/items/599ccdd07276aae5d29e#_reference-457dd5318af4f84ad2d2)