QEMU 上の RTOS で遊ぼう (再訂:その１)

本稿では Linux 上での TOPPERS/ASP3 カーネルのビルド方法について述べ、ビルドしたカーネルをqemuで動作させるまでの概要を説明します。
検証環境は Debian buster (4.19.0-6-amd64, ruby 2.5.5p157) および Gentoo (amd64, linux-4.19, ruby 2.4.6) です。
Debian Stretch / Ubuntu xenial であれば本稿を再現できると思いますが、検証していません。

###### ~~Debian stretch/buster ではARM用GCCの起動ができないエラーが発生し、動作確認ができていません。Ubuntu についても同様にgccが起動できないため、解決方法を探しています。exec が ENOENT を返しているように見えます。~~ 
######amd64環境でARM用GCCを起動するためには、クロスビルド環境向けのライブラリをインストールする必要があります。

```  shell-session
apt-get install libc6-dev-i386
```

Debian もしくは Ubuntu 、Gentoo の nomultilib 環境では以下のようなエラーが出てコンパイラが起動できない場合があります。
上記ライブラリがインストールされていない可能性がありますので、ご注意ください。

```
cibuild@c47d0951d9f9:~$ which arm-none-eabi-gcc 
/home/cibuild/gcc-arm-none-eabi-4_8-2014q3/bin/arm-none-eabi-gcc
cibuild@c47d0951d9f9:~$ arm-none-eabi-gcc --version
bash: /home/cibuild/gcc-arm-none-eabi-4_8-2014q3/bin/arm-none-eabi-gcc: No such file or directory
```

## 1. RTOSの特徴とTOPPERSの長所
豊富な先行文献があります。(以下略)

## 2. 環境構築

2016年の[こちらの記事](http://tecs22022.blog85.fc2.com/)[^1]が参考になります。
このブログの解説ではASP3カーネルのビルドにWindowsを用いることになっていますが、Linuxでも開発できます。今回ビルドする構成の概要に付いてはこちら[^2]やこちら[^3]を参考にしています。
TOPPERS/ASP3のビルドツールチェーンでは、rubyを用いてMakefileを生成するので、rubyやqemuをインストールしておきます。portageからQEMUをビルドする場合には QEMU_SOFTMMU_TARGETS の指定が必要です。debianの場合も qemu-system-arm を導入しておく必要があります。ARM環境をエミュレーションする場合、必須です。


```config:/etc/portage/make.conf
QEMU_SOFTMMU_TARGETS="x86_64 arm i386"
```

``` bash
emerge --quiet --jobs 2 --ask dev-lang/ruby
emerge --quiet --jobs 2 --ask app-emulation/qemu
```


先のブログにしたがって、lanchpad.netからARM用GCCコンパイラを導入します。

``` bash
mkdir -p ~/Dev/Toppers && cd ~/Dev/Toppers
target=gcc-arm-none-eabi-4_8-2014q3-20140805-linux.tar.bz2
dst="https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q3-update/+download/gcc-arm-none-eabi-4_8-2014q3-20140805-linux.tar.bz2 "
md5dst="https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q3-update/+download/gcc-arm-none-eabi-4_8-2014q3-20140805-linux.tar.bz2/+md5"
curl -sL $dst > $target
curl $md5dst | grep "`md5sum $target | cut -d \  -f 1`" && echo ok || { echo error!; exit 1;}
tar xvjf $target
echo export PATH=$PWD/gcc-arm-none-eabi-4_8-2014q3/bin:\$PATH >> ~/.bashrc
. ~/.bashrc
arm-none-eabi-gcc --version
```

## 3. ソースコードのダウンロード・展開

本家[^4]から最新の簡易版ソースコードをダウンロードしておきます。

```
wget https://www.toppers.jp/download.cgi/asp3_arm_gcc-20190320.tar.gz
md5sum asp3_arm_gcc-20190320.tar.gz | grep  8d2d1d5a10c39c93e8972789f2bc7202
tar xvzf asp3_arm_gcc-20190320.tar.gz
```

## 4. TOPPERS/ASP3をビルドする
doc/user.txt のビルド方法にしたがって、次の通りビルドを実施します。
(ビルドオプションについては 同ドキュメント に詳しい解説が載っています。目を通しておきましょう。)

```
cd asp3
mkdir OBJ && cd OBJ
ruby ../configure.rb -T ct11mpcore_gcc -O -DTOPPERS_USE_QEMU
make
```

問題なくビルドが完了します。エラーで停止した場合はPATHを確認しておきましょう。


## 5. QEMUで起動してみる
オブジェクトディレクトリの直下に asp という名前でカーネルが生成されています。
これをqemuで実行してみましょう。

```
$ ls -l asp
-rwxr-xr-x 1 ymash ymash 364227  9月 11 02:26 asp
$ qemu-system-arm -M realview-eb-mpcore -semihosting -m 128M -smp 1 -serial vc -kernel asp
```

View -> serial を選択すると、シリアルコンソールのログを読むことができます。

## 6. 遊ぶ
![scr1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494919/7d7539e8-da37-53e1-7b3b-040c85a0be39.png "QEMU でASP3カーネル")

シリアルコンソールを表示しておき r を押下すると、タスクが切り替わります。
何度も押下すると、3つのタスクが繰り返し切り替わることに気づきます。
このビルドではTECSプラットフォーム[^5]のサンプルアプリが起動しており、初期状態で3つのタスクが起動する構成になっているようです。

## 7. 終わりに
<br />本稿は<a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC-BY-4.0</a>に基づいて自由に利用頂けます。<a rel="license" href="http://creativecommons.org/licenses/by/4.0/">
<img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a>

[^1]: TECSジェネレータ開発ブログ　http://tecs22022.blog85.fc2.com/
[^2]: サンプルアプリ構成 http://blog-imgs-91.fc2.com/t/e/c/tecs22022/asp3-tecs-sample.png
[^3]: TECSとTOPPERSについて https://codezine.jp/article/detail/380
[^4]: ソースコード https://www.toppers.jp/asp3-e-download.html
[^5]: TECS本家  https://www.toppers.jp/tecs.html