もうそろそろMbed OS 6


頻繁に拡張、改善、リリースが繰り返されているMbed OSが5から6へとバージョンアップされます。
Githubのリポジトリを見てみると6/1時点でmbed-os-6.0.0-rc1までリリースされているので、正式リリースはそろそろだと思います。

Mbed OSとは

そもそもMbed OS(Mbed)とは、Arm Cortex-Mマイコン向け(一部、Cortex-Aも)のソフトウェアプラットフォーム、開発ツール/サービスを指します。

昔は「Rapid prototyping tool」となっていたと思いますが、今は「Rapid IoT device development」と称されています。

ソフトウェアプラットフォームは、さまざまなライブラリを含むリアルタイムOSとなっていて、マイコンのペリフェラル(GPIO、UART、I2C、SPI等)やOSの機能を簡単に扱えるAPIがサポートされています。Mbed OSに対応したボードであれば、CPUベンダーやボードの違いをほとんど意識することなくプログラミングすることができます。
また、Mbed OSはIoT向けに特化され、Wi-FiやBluetooth、LTE、LPWA等の通信ライブラリやセキュリティ通信を含むプロトコルスタックがサポートされています。
開発ツールとしては、手軽にプログラミングできる環境として、ブラウザ上で動作するMbedオンラインコンパイラが用意されています。また、オフラインでテストやデバッグもできるMbed CLIMbed Studioも用意されています。

Mbed OS 5の現状

Mbed OS 5は、5.15.3までリリースされています。一般向けに5.1がリリースされてから、おおよそ3ヵ月おきにメジャーバージョンが上がり、機能追加やバグフィックス、対応プラットフォームの追加が行われてきました。対応プラットフォームの数も111となっています。そのため、ソフトウェアが肥大化している感じがします。

Mbed OS 6の変更点

Mbed OS 6の変更点は以下のようになっていると思います。

  • 軽量化
  • APIとプラットフォームの整理
  • サポートするコンパイラのバージョンアップ
    • Arm Compiler 5 -> 6
    • GCC ARM 6 -> 9
  • ベアメタルプロファイルの正式サポート
  • 対応プラットフォーム以外の追加が楽になった

実際にMbed OS 5.15.36.0.0-rc1を比べてみました。

軽量化?

mbed-os-example-blinkyをMbed CLI(GCC)でコンパイルして、差を見てみました。プラットフォームはMbed OSで標準的なFRDM-K64Fを指定してます。

Mbed OS 5.15.3

> mbed compile -t GCC_ARM -m K64F

| Module           |         .text |       .data |        .bss |
|------------------|---------------|-------------|-------------|
| [fill]           |     103(+103) |       0(+0) | 2317(+2317) |
| [lib]\c.a        | 22945(+22945) | 2472(+2472) |     89(+89) |
| [lib]\gcc.a      |   3168(+3168) |       0(+0) |       0(+0) |
| [lib]\misc       |     224(+224) |       4(+4) |     28(+28) |
| [lib]\nosys.a    |       32(+32) |       0(+0) |       0(+0) |
| main.o           |       48(+48) |       0(+0) |       0(+0) |
| mbed-os\drivers  |     194(+194) |       0(+0) |       0(+0) |
| mbed-os\hal      |   1719(+1719) |       8(+8) |   131(+131) |
| mbed-os\platform |   6147(+6147) |   260(+260) |   221(+221) |
| mbed-os\rtos     |   8217(+8217) |   168(+168) | 5972(+5972) |
| mbed-os\targets  |   9317(+9317) |     36(+36) |   386(+386) |
| Subtotals        | 52114(+52114) | 2948(+2948) | 9144(+9144) |
Total Static RAM memory (data + bss): 12092(+12092) bytes
Total Flash memory (text + data): 55062(+55062) bytes

Mbed OS 6.0.0-rc1

> mbed compile -t GCC_ARM -m K64F

| Module           |         .text |       .data |        .bss |
|------------------|---------------|-------------|-------------|
| [fill]           |       99(+99) |       0(+0) | 2181(+2181) |
| [lib]\c.a        | 11528(+11528) | 2472(+2472) |     89(+89) |
| [lib]\gcc.a      |     832(+832) |       0(+0) |       0(+0) |
| [lib]\misc       |     224(+224) |       4(+4) |     28(+28) |
| [lib]\nosys.a    |       32(+32) |       0(+0) |       0(+0) |
| main.o           |       48(+48) |       0(+0) |       0(+0) |
| mbed-os\drivers  |     206(+206) |       0(+0) |       0(+0) |
| mbed-os\hal      |   1719(+1719) |       8(+8) |   131(+131) |
| mbed-os\platform |   7497(+7497) |   260(+260) |   357(+357) |
| mbed-os\rtos     |   8401(+8401) |   168(+168) | 5972(+5972) |
| mbed-os\targets  |   9317(+9317) |     36(+36) |   386(+386) |
| Subtotals        | 39903(+39903) | 2948(+2948) | 9144(+9144) |
Total Static RAM memory (data + bss): 12092(+12092) bytes
Total Flash memory (text + data): 42851(+42851) bytes

Static RAMは双方 約12KBと変わりませんが、Flashは10KB以上減ってますね。ここら辺が軽量化の結果でしょうか。主に[lib]\c.a(C標準ライブラリ)で使用しているサイズが減ってます。

ベアメタル版のmbed-os-example-blinky-baremetalでも見てみました。

> mbed compile -t GCC_ARM -m K64F

| Module           |         .text |     .data |        .bss |
|------------------|---------------|-----------|-------------|
| [fill]           |       66(+66) |     0(+0) | 2328(+2328) |
| [lib]\c_nano.a   |   4485(+4485) | 100(+100) |     12(+12) |
| [lib]\gcc.a      |     832(+832) |     0(+0) |       0(+0) |
| [lib]\misc       |     224(+224) |     0(+0) |     28(+28) |
| [lib]\nosys.a    |       48(+48) |     0(+0) |       0(+0) |
| main.o           |     140(+140) |     0(+0) |       4(+4) |
| mbed-os\drivers  |     136(+136) |     0(+0) |       0(+0) |
| mbed-os\hal      |   1719(+1719) |     8(+8) |   131(+131) |
| mbed-os\platform |   6445(+6445) |     4(+4) |   239(+239) |
| mbed-os\targets  |   9317(+9317) |   36(+36) |   386(+386) |
| Subtotals        | 23412(+23412) | 148(+148) | 3128(+3128) |
Total Static RAM memory (data + bss): 3276(+3276) bytes
Total Flash memory (text + data): 23560(+23560) bytes

RTOSが無くなっているのとC標準ライブラリは軽量のものを使用するようになっています。

ちなみにLPC1114FN28でもコンパイルしてみました。

> mbed compile -t GCC_ARM -m LPC1114

| Module           |         .text |     .data |      .bss |
|------------------|---------------|-----------|-----------|
| [fill]           |     206(+206) |     0(+0) |   11(+11) |
| [lib]\c_nano.a   |   2532(+2532) | 100(+100) |   12(+12) |
| [lib]\gcc.a      |     964(+964) |     0(+0) |     0(+0) |
| [lib]\misc       |     216(+216) |     0(+0) |   28(+28) |
| [lib]\nosys.a    |       16(+16) |     0(+0) |     0(+0) |
| main.o           |     136(+136) |     0(+0) |   16(+16) |
| mbed-os\drivers  |       84(+84) |     0(+0) |     0(+0) |
| mbed-os\hal      |   1616(+1616) |     4(+4) |   67(+67) |
| mbed-os\platform |   4736(+4736) |     4(+4) | 298(+298) |
| mbed-os\targets  |   1698(+1698) |     4(+4) |   16(+16) |
| Subtotals        | 12204(+12204) | 112(+112) | 448(+448) |
Total Static RAM memory (data + bss): 560(+560) bytes
Total Flash memory (text + data): 12316(+12316) bytes

ベアメタルプロファイルだとここら辺のマイコンを手軽に扱うのがちょうどいい気がします。

プラットフォームの整理?

コードの差分からサポートされなくなったプラットフォームを調べてみました。Mbed 5.13.3と比べてMbed 6.0.0-rcで無くなっているプラットフォームは以下になります。

FlashやRAMが少ないマイコンやCortex-M0が厳しくなってきた感じですかね。
(コードから調べた限りなので、正式な情報ではありません)

あとがき

まだここでは書けませんが、わくわくするような情報もあるので、Mbed OSは今後期待ですね。
著書のMbed OS 6版も執筆中なので、さらに情報を纏めてリリースしたいと思います。