Help us understand the problem. What is going on with this article?

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away