mbed OS 5 の CLI 開発環境を Linux 上に構築する


いつの間にか [mbed OS 5](https://developer.mbed.org/blog/entry/Introducing-mbed-OS-5/) が出ていた。mbed OS 5 は、いわゆる今までの mbed (OS2やClassicとよばれていたバージョン) と、mbed OS 3(yottaとよばれていたバージョン)をくっつけて、2 + 3 = 5 らしい。

![](https://developer.mbed.org/media/uploads/dirons/xcodeline-merge.png.pagespeed.ic.EE5LLXdn9C.png)

いままでの mbed OS2 の良さ、オンラインコンパイラやライブラリの資産はほぼそのまま使え、また mbed OS3 の様々な新機能や CLI からの開発などが取り入れられ、RTOS をベースとした OS となった。

というわけで、CLI からも開発が出来るようになったので、Linux (Ubuntu　16.04) 上で環境構築をしたのでメモ。

なお、MacOS や Windows での環境構築はこちら。

- [mbed CLIをWindowsで使ってみる（環境構築編）](https://developer.mbed.org/users/ytsuboi/notebook/ja-setup-mbed-cli-on-windows/)
- [mbed CLI (コマンドライン・インタフェース)を Mac OS X で使ってみる](https://developer.mbed.org/users/okano/notebook/setup-mbed-cli-on-mac-os-x-JP/)



## mbed デバイスの自動認識

mbed のプログラム書き込みは、マスストレージとして認識されたUSBドライブに、プログラムの .hex や .bin ファイルを書き込むことで行われる。そのため mbed を差したときに USB ドライブとして自動認識される必要がある。

自動でマウント出来るよう

```
sudo apt-get install usbmount
```

で usbmount を入れる。あとは mbed のデバイスをUSBに差し、適当にUSBマスストレージとして認識されているかを確認する。

1. lsusb で usb デバイスとしてそもそも認識されてるか
2. dmesg でカーネル側にどう認識されたか
3. df で適当な場所に認識されてるか

あたりを確認しておく。うまく認識されると、

```
$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
...
/dev/sdc            1032         8      1024   1% /media/usb0
```

と適当に /media/usbN に自動マウントされる。

ただ初期設定だと、/media/usbN が root:root で 755 でマウントされ、一般ユーザでは書き込み権限が無いため、適当に ``` /etc/usbmount/usbmount.conf``` の FS_MOUNTOPTIONS の行を変更する。

```
FS_MOUNTOPTIONS="-fstype=vfat,umask=0000"
```

本来はちゃんとUSB機器書き込み用の group 作ってその gid を割り当てして、その group に必要なユーザを所属させグループのみパーミションを立てた方が良いと思う。



## python のインストール

python 2.7 系と python のパッケージ管理システムの pip が必要。

```
sudo apt-get install python2.7 python-pip
```

でも良いが、pyenv を使い 2.7 系を入れた。

- https://github.com/yyuu/pyenv

続いて mbed-cli を pip で入れる。

```
pip install mbed-cli
```

## 組み込み用 ARM GCC と mercurial のインストール

gcc はコンパイルに、mercurial は developer.mbed.org からのレポジトリのチェックアウトに必要。

```
sudo apt-get install gcc-arm-none-eabi mercurial
```

# サンプルを import

```
mbed import https://developer.mbed.org/teams/mbed-os-examples/code/mbed-os-example-blinky
cd mbed-os-example-blinky
```

で blinky、いわゆる Lチカのレポジトリを import する。そのディレクトリに入り、mbed detect でボードが何に対応しているかを調べる。

今回は STMicro の NUCLEO_L476RG を差したので、以下のような出力になる。

```
$  mbed detect
[mbed] Auto-installing missing Python modules...

[mbed] Detected NUCLEO_L476RG, port /dev/ttyACM0, mounted /media/usb0
[mbed] Supported toolchains for NUCLEO_L476RG
+---------------+-----------+-----------+-----------+-----------+-----------+
| Target        | mbed OS 2 | mbed OS 5 |    ARM    |  GCC_ARM  |    IAR    |
+---------------+-----------+-----------+-----------+-----------+-----------+
| NUCLEO_L476RG | Supported | Supported | Supported | Supported | Supported |
+---------------+-----------+-----------+-----------+-----------+-----------+
Supported targets: 1
Supported toolchains: 3
```

mbed toolchain でコンパイラの設定をする。Linux 環境では ARM GCC しか使わないので、-G でグローバルにセットする。

```
$ mbed toolchain -G GCC_ARM
[mbed] ARM_GCC now set as global toolchain
````

続いてターゲットとなるデバイスの設定。detect で選べるなら自動で選択してくれてもいいじゃんかよ、と思いつつ手動で設定。

```
$ mbed target NUCLEO_L476RG
```

いよいよコンパイル。

```
$ mbed compile 
...
Link: mbed-os-example-blinky
Elf2Bin: mbed-os-example-blinky
+-----------+-------+-------+------+
| Module    | .text | .data | .bss |
+-----------+-------+-------+------+
| Subtotals | 44366 |  2316 | 8412 |
+-----------+-------+-------+------+
Allocated Heap: unknown
Allocated Stack: unknown
Total Static RAM memory (data + bss): 10728 bytes
Total RAM memory (data + bss + heap + stack): 10728 bytes
Total Flash memory (text + data + misc): 46682 bytes
Image: ./.build/NUCLEO_L476RG/GCC_ARM/mbed-os-example-blinky.bin
```

Lチカのソースで46KB･･･。

あとは cp でコピーするとちゃんとLチカする。

```
$ cp .build/NUCLEO_L476RG/GCC_ARM/mbed-os-example-blinky.bin /media/usb0
 ```
 
# 使ってみての雑感

いままではオンラインIDE上でしかほぼほぼ開発出来なかった mbed が、CLI から開発出来るようになったのはCLI大好きっ子にとっては嬉しい。

しかしながら CLI ツールチェインの出来は正直イマイチで、 Web 関係のツールチェインに慣れてる身としては使いにくいところが多々あり(なんで mbed new するだけで毎回 260M 以上もある mbed-os のソースコードをカレントディレクトリ以下に落としてくるんでしょうか！！)、その辺が今後は整備されて行くんだろうなーと期待してる。

また mbed OS2 のころは不透明だったツールチェインも、[mbed-os の github レポジトリ上に置かれている](https://github.com/ARMmbed/mbed-os)ため、使いにくいところは OSS ぽく、いろいろな人が改善しコントリビュートし易くなっているしね。