Mbed OS 2のサポートがいつ終わっても良いようにローカル環境を構築する方法【改訂版】

この記事は、[こちら](https://qiita.com/toyowata/items/a89f63957b12bfbc8a81)の改訂版です。

## はじめに

最初のバージョンのMbed OS 5 がリリースされてから約3年が経ちました。Mbed OS 5 では、四半期ごとに比較的大きな機能を追加するFeature releaseと、二週間ごとに新しいボードの追加やバグフィックスが含まれるPatch releaseを行っています。

https://os.mbed.com/docs/mbed-os/v5.12/introduction/how-we-release-arm-mbed-os.html

一方で、Mbed OS 2 (Mbed classic)は既にメンテナンスリリースが終了しています。

主要なライブラリやサンプルコードはMbed OS 5 への移行がほぼ終了していますが、個人での開発や古いソフトウェア資産の継続利用の目的で、Mbed OS 2 を使い続けなければならないケースもあるかもしれません。

ここでは、オンラインコンパイラではなくローカルPCにMbed OS 2のビルド環境を構築し、Mbed 開発サイトの状態になるべく依存しない閉じた環境での運用方法を説明します。古いプロジェクトもローカル環境で保守することが出来ます。

Mbed対応ボードは、スイッチサイエンス製のmbed LPC1114FN28を使用します。

## 事前準備
Mbed 2のビルド環境は、python 2のみサポートされているので、python 3との共存も考えてpyenvを導入します。インストール方法は解説記事が色々とありますので、そちらを参考にしてください。python のバージョンは、2.7.15を使用しました。

pyenv導入後は、（python 2なので）virtualenvをインストールし、初期化します。virtualenvが見つからない場合は、pathを通してから実行します。

```
pip install virtualenv
python -m virtualenv .venv2
.venv2\Script\activate
```
必要なモジュールをインストールします。

```
pip install mbed-cli==1.10.1 pyelftools==0.29 jsonschema==3.2.0
```

GNU Arm Embedded Toolchainをインストールします（Mbed 2の場合は、gcc-arm-none-eabi-6-2017-q2-updateが推奨されています）。

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

Mercurial SCMをインストールします。
https://www.mercurial-scm.org/downloads

Git SCMをインストールします。
https://git-scm.com/downloads

## プロジェクトの作成
プロジェクトディレクトリを作成し、移動します。

```
mkdir myprog
cd myprog
```

以下のコマンドで、ビルド用のツールをtoolsディレクトリにダウンロードします。

```
hg clone https://os.mbed.com/users/mbed_official/code/mbed-sdk-tools/ tools
```

必要なモジュールをインストールします。

```
pip install -r .\tools\requirements.txt
```

以下のリンクをクリックして、Mbed 2ライブラリ（プリビルドアーカイブ）をダウンロードします。
https://dl.dropboxusercontent.com/s/p3pygps0uqfc5hq/mbed-e95d10626187.zip

zipファイルを展開し、先ほどのプロジェクトディレクトリにコピーします。

動作確認用に以下のようなmain.cpp を作成し、プロジェクトディレクトリに保存します。

```cpp
#include "mbed.h"

DigitalOut led(LED1);

int main()
{
    printf("hello, Mbed.\n");
    while (1) {
        led = !led;
        wait(0.5);
    }
}
```


この時点で、プロジェクトディレクトリは以下のような構成になっています。

```
    ディレクトリ: D:\work\myprog


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/04/04     10:50                mbed-e95d10626187
d-----       2020/04/04     10:45                tools
-a----       2020/04/04     10:52            160 main.cpp
```

`mbed compile` コマンドでコンパイルします。`-m`でターゲットボード、`-t`でツールチェインを指定します。

```
mbed compile -m lpc1114 -t gcc_arm

[mbed] Working path "D:\work\myprog" (program)
Using targets from D:\work\myprog\mbed-e95d10626187\targets.json
[Error] @,: Compiler version mismatch: Have 9.2.1; expected version >= 6.0.0 and < 7.0.0
Building project myprog (LPC1114, GCC_ARM)
Scan: myprog
Compile [100.0%]: main.cpp
Link: myprog
Elf2Bin: myprog
| Module                           |         .text |     .data |      .bss |
|----------------------------------|---------------|-----------|-----------|
| BUILD\LPC1114                    |     235(+235) |     4(+4) |   16(+16) |
| [fill]                           |     210(+210) |     0(+0) |   12(+12) |
| [lib]\c_nano.a                   |   5166(+5166) | 100(+100) |   21(+21) |
| [lib]\gcc.a                      |   1696(+1696) |     0(+0) |     0(+0) |
| [lib]\mbed.a                     |   2937(+2937) |     4(+4) | 183(+183) |
| [lib]\misc                       |     220(+220) |   12(+12) |   28(+28) |
| mbed-e95d10626187\TARGET_LPC1114 |   4161(+4161) | 264(+264) |   32(+32) |
| Subtotals                        | 14625(+14625) | 384(+384) | 292(+292) |
Total Static RAM memory (data + bss): 676(+676) bytes
Total Flash memory (text + data): 15009(+15009) bytes

Image: .\BUILD\LPC1114\GCC_ARM\myprog.bin
```
最後に表示されたイメージファイルをターゲットボードに書き込みます。

```
copy .\BUILD\LPC1114\GCC_ARM\myprog.bin e:
```

ターゲットにバイナリを直接書き込みたい場合には、ターゲットボードを接続した状態で`-f`オプションをつけます。

```
mbed compile -m lpc1114 -t gcc_arm -f
```

## Mbed 2ライブラリのソースからビルドする場合

先ほどの手順と同様にプロジェクトディレクトリを作成して、ビルドツールをダウンロードします。

```
mkdir myprog_source
cd myprog_source
hg clone https://os.mbed.com/users/mbed_official/code/mbed-sdk-tools/ tools
```

GitHubに公開されているMbed 2ライブラリのソースコードをダウンロードします。

```
git clone https://github.com/ARMmbed/mbed-dev
```

先ほどの手順と同じようにmain.cpp を作成し、プロジェクトディレクトリに保存します。
この時点で、プロジェクトディレクトリは以下のような構成になっています。

```
    ディレクトリ: D:\work\myprog_source


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/04/04     11:07                mbed-dev
d-----       2020/04/04     11:06                tools
-a----       2020/04/04     10:52            160 main.cpp
```

コンパイル手順は先ほどのコマンド同じです。ターゲットにバイナリを直接書き込みたい場合には、ターゲットボードを接続した状態で`-f`オプションをつけます。

```
mbed compile -m lpc1114 -t gcc_arm -f
```

## オンラインIDE上の古いプロジェクトをローカル環境で使用する方法

オンラインIDEのプログラムワークスペースから使用したいプロジェクトを選び、右クリックします。ポップアップメニューから、[プログラムのエクスポート]を選択します。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75582/12ea1b23-d157-9498-56f7-6bd2dc706790.png">

Export Programダイアログが表示されるので、Export ToolchainからZIP Archiveを選択し、[Export]ボタンを押します（Export Targetは何を選択しても構いません）。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75582/d073955b-99ba-47da-c8a6-9210c960a4bd.png">

ダウンロードされたZIPアーカイブを展開します。この中から**以下を除外したファイル**を全てローカル環境のプロジェクトディレクトリにコピーしてください。

```
mbed（ディレクトリ）
mbed.bld
```

以下の例を参考にしてください（水色で選択されたファイルをローカル環境に構築したプロジェクトディレクトリにコピーします）。

![BME280_LCD 2020_04_04 12_37_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75582/b28dd5be-96ac-fc7e-ded3-ba1a8fc32d30.png)

コンパイルの手順は先ほどと同じです。


以上です。