いつの間にか mbed OS 5 が出ていた。mbed OS 5 は、いわゆる今までの mbed (OS2やClassicとよばれていたバージョン) と、mbed OS 3(yottaとよばれていたバージョン)をくっつけて、2 + 3 = 5 らしい。
いままでの mbed OS2 の良さ、オンラインコンパイラやライブラリの資産はほぼそのまま使え、また mbed OS3 の様々な新機能や CLI からの開発などが取り入れられ、RTOS をベースとした OS となった。
というわけで、CLI からも開発が出来るようになったので、Linux (Ubuntu 16.04) 上で環境構築をしたのでメモ。
なお、MacOS や Windows での環境構築はこちら。
mbed デバイスの自動認識
mbed のプログラム書き込みは、マスストレージとして認識されたUSBドライブに、プログラムの .hex や .bin ファイルを書き込むことで行われる。そのため mbed を差したときに USB ドライブとして自動認識される必要がある。
自動でマウント出来るよう
sudo apt-get install usbmount
で usbmount を入れる。あとは mbed のデバイスをUSBに差し、適当にUSBマスストレージとして認識されているかを確認する。
- lsusb で usb デバイスとしてそもそも認識されてるか
- dmesg でカーネル側にどう認識されたか
- 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 系を入れた。
続いて 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 レポジトリ上に置かれているため、使いにくいところは OSS ぽく、いろいろな人が改善しコントリビュートし易くなっているしね。