mbed

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

More than 1 year has passed since last update.

いつの間にか 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マスストレージとして認識されているかを確認する。


  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 系を入れた。

続いて 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 ぽく、いろいろな人が改善しコントリビュートし易くなっているしね。