もうそろそろMbed OS 6

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/caa2acba-44e1-e207-a8c2-0d402fd53537.png)昔は「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オンラインコンパイラ](https://os.mbed.com/docs/mbed-os/v5.15/quick-start/online-with-the-online-compiler.html)が用意されています。また、オフラインでテストやデバッグもできる[Mbed CLI](https://os.mbed.com/docs/mbed-os/v5.15/quick-start/offline-with-mbed-cli.html)や[Mbed Studio](https://os.mbed.com/studio/)も用意されています。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/f383b0c0-424e-657e-4df4-434ab48b0b20.png)

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

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

実際に[Mbed OS 5.15.3](https://github.com/ARMmbed/mbed-os/releases/tag/mbed-os-5.15.3)と[6.0.0-rc1](https://github.com/ARMmbed/mbed-os/releases/tag/mbed-os-6.0.0-rc1)を比べてみました。

## 軽量化？
[mbed-os-example-blinky](https://github.com/ARMmbed/mbed-os-example-blinky)をMbed CLI(GCC)でコンパイルして、差を見てみました。プラットフォームはMbed OSで標準的な[FRDM-K64F](https://os.mbed.com/platforms/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](https://github.com/ARMmbed/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](https://os.mbed.com/platforms/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で無くなっているプラットフォームは以下になります。

* [SDP_K1](https://os.mbed.com/platforms/SDP_K1/)
* [GD32-E103VB](https://os.mbed.com/platforms/GD32-E103VB/)
* [Nordic nRF51-DK](https://os.mbed.com/platforms/Nordic-nRF51-DK/)
* [Switch Science mbed TY51822r3](https://os.mbed.com/platforms/Switch-Science-mbed-TY51822r3/)
* [u-blox EVK-NINA-B1](https://os.mbed.com/platforms/u-blox-EVK-NINA-B1/)
* [SDT51822B](https://os.mbed.com/platforms/SDT51822B/)
* [u-blox C027](https://os.mbed.com/platforms/u-blox-C027/)
* [EA LPC4088 Display Module](https://os.mbed.com/platforms/EA-LPC4088-Display-Module/)
* [FRDM-KW24D512](https://os.mbed.com/platforms/FRDM-KW24D512/)
* [FRDM-KL82Z](https://os.mbed.com/platforms/FRDM-KL82Z/)
* [LPCXpresso55S69](https://os.mbed.com/platforms/LPCXpresso55S69/)
* [HANI-IOT](https://os.mbed.com/platforms/HANI-IOT/)
* [EFM32 Wonder Gecko](https://os.mbed.com/platforms/EFM32-Wonder-Gecko/)
* [EFM32 Leopard Gecko](https://os.mbed.com/platforms/EFM32-Leopard-Gecko/)
* [EFM32 Pearl Gecko](https://os.mbed.com/platforms/EFM32-Pearl-Gecko/)
* [NUCLEO_F410RB](https://os.mbed.com/platforms/ST-Nucleo-F410RB/)
* [B96B-F446VE](https://os.mbed.com/platforms/ST-B96B-F446VE/)
* [u-blox EVK-ODIN-W2](https://os.mbed.com/platforms/ublox-EVK-ODIN-W2/)
* [u-blox C030-U201 IoT Starter Kit](https://os.mbed.com/platforms/ublox-C030-U201/)
* [u-blox C030-N211 IoT Starter Kit](https://os.mbed.com/platforms/ublox-C030-N211/)
* [u-blox C030-R412M LTE CatM1/NB1 and 2G](https://os.mbed.com/platforms/ublox-C030-R412M/)
* [Avnet Silica ST Sensor Node](https://os.mbed.com/platforms/Silica-Sensor-Node/)
* [AdBun-M066](https://os.mbed.com/platforms/TMPM066/)
* [AdBun-M3H6](https://os.mbed.com/platforms/TMPM3H6/)
* [AdBun-M3HQ](https://os.mbed.com/platforms/TMPM3HQ/)

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

# あとがき
まだここでは書けませんが、わくわくするような情報もあるので、Mbed OSは今後期待ですね。
[著書](https://amzn.to/2yMmVu2)のMbed OS 6版も執筆中なので、さらに情報を纏めてリリースしたいと思います。