mbed オフラインの開発環境

[mbed](https://www.mbed.com/) は、ネットワーク環境とブラウザさえあればどこでもオンラインでコンパイラが使える環境を提供していますが、オフライン（ネットワーク接続がない環境）で使いたいというケースもあります。ここでは、オフライン環境の使い方を紹介します。

# オフラインの環境を使うには

mbed では以下のようなオフラインビルド環境をサポートしています。

* mbed SDK (mbed classic) のビルドツール
* オンラインIDEからのプロジェクトファイルエクスポート
+ mbed CLI (mbed command-line tool)

ここでは、mbed OS 5 と共にリリースされた [mbed CLI](https://github.com/ARMmbed/mbed-cli) を中心に説明します。

mbed SDK のビルドツールは[こちら](https://developer.mbed.org/handbook/mbed-SDK-porting)（[日本語版](https://developer.mbed.org/users/MACRUM/notebook/mbed-sdk-porting-jp/)）を、オンラインIDEからのプロジェクトファイルエクスポートは[こちら](https://developer.mbed.org/handbook/Exporting-to-offline-toolchains)を参照して下さい。

# mbed CLI とは

mbed CLI は、mbed OS 5 開発用のツールとして提供され、プログラムのインポート及びエクスポート、複数のツールチェインを使ったビルドを簡単に行うことができます。

* リポジトリのバージョンコントロール
* 依存関係の解決
* コードのパブリッシュ
* リモートホストされたリポジトリからのアップデート（GitHub, GitLab 及び mbed.org）
* ARM mbed ビルドシステムの呼び出し
* インポート及びエクスポート機能

https://github.com/ARMmbed/mbed-cli

mbed CLI を使えば、クラウド側のプログラムを全てローカル環境にコピーして作業を行うことが出来ます。自分が作成したコードは手元に保存され、クラウド側にアップロードする必要はありません。これは、ネットワークに接続されていない場合や、企業内での開発ルールやプロジェクト管理ポリシーなどで、社外にソースコードを置きたくない場合に有効です。

# 準備

## mbed CLI と関連ツールのインストール

インストール方法は以下の動画を参照して下さい。

[![](http://img.youtube.com/vi/cM0dFoTuU14/0.jpg)](https://www.youtube.com/watch?v=cM0dFoTuU14)

* Python のインストール: https://www.python.org/downloads/
* Git のインストール: https://git-scm.com/download
* Mercurial のインストール: https://www.mercurial-scm.org/
* GCC のインストール: https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update
* mbed CLI のインストール: ```pip install mbed-cli```

細かい設定とか更に分かりやすい説明は、こちらをご覧下さい。

* [mbed CLI (コマンドライン・インタフェース)を Mac OS X で使ってみる](https://developer.mbed.org/users/okano/notebook/setup-mbed-cli-on-mac-os-x-JP/)
* [[lang:ja] mbed CLIをWindowsで使ってみる（環境構築編）](https://developer.mbed.org/users/ytsuboi/notebook/ja-setup-mbed-cli-on-windows/)
* [mbed OS 5 の CLI 開発環境を Linux 上に構築する](http://qiita.com/hotchpotch/items/4d87c13b97d236db5b4f)

# GitHub と mercurial のリポジトリからのインポートとビルド

mbed CLI は、git または mercurial のリポジトリからコードをインポートすることができます。```import``` コマンドとともにリポジトリの URL を指定します。

## mercurial リポジトリ

```
$ mbed import https://developer.mbed.org/teams/mbed-os-examples/code/mbed-os-example-blinky
```
## GitHub リポジトリ

```
$ mbed import https://github.com/ARMmbed/mbed-os-example-blinky
```
mbed OS のライブラリ本体は、リポジトリからリンクされているコードがインポートされます。 もし、リポジトリを手動で ```git clone``` した場合は mbed OS ライブラリのソースコードは含まれていないので、```deploy``` コマンドを使ってライブラリのコードを追加します。

```
$ mbed deploy
```
使用される mbed OS ライブラリは、リポジトリが更新された時のバージョンになり、必ずしもライブラリの最新バージョンではないかもしれません。mbed OS ライブラリを最新のバージョンに置き換えたい場合は、以下のようなコマンドを実行します。

```
$ cd mbed-os
$ mbed sync
$ mbed update latest --clean
$ cd ..
```
これで、最新バージョンのライブラリを使うことが出来ます。

ARM mbed チームが提供しているサンプルコードのリポジトリは、ライブラリのバージョンがこまめにアップデートされていますが、ユーザが公開しているプログラムは上記したような手順が必要になる場合があります。

ビルドを行うには、```compile``` コマンドを使用します。ここでは、ターゲットボードに FRDM-K64F、ツールチェインに gcc を使ってみます。ターゲットとツールチェインの名称は、使用するボードを接続した状態で mbed detect コマンドを実行して確認できます。

```
$ mbed compile -m K64F -t GCC_ARM
```
他にも、```toolchain``` や ```target``` コマンドを使ってビルド時のオプションを省略することも出来ます。

## developer.mbed.org で公開されている mbed 2.0 (classic) プログラムのインポートとビルド

mbed CLI は mbed OS 5 だけではなく、mbed 2.0 のコードでもビルドする事が出来ます。既存のプログラムを変更せずにそのまま使うことが出来ます。

```
$ mbed import https://developer.mbed.org/teams/mbed/code/mbed_blinky/
$ cd mbed_blinky
$ mbed compile -m K64F -t GCC_ARM
```
自分だけで使用するプライベートなリポジトリもインポートすることが可能です。その場合は、リポジトリにアクセス可能なユーザ名とパスワードを入力してインポートを行います。

# 新規にプログラムを作る

既存のリポジトリからコードをインポートせずに、新規プログラムをローカル環境で作成することが出来ます（mbed OS ライブラリは、自動でインポートされます）。[developer.mbed.org](developer.mbed.org) のアカウントを持っていなくても利用可能です。

## mbed OS 5 の場合

```new``` コマンドで新規のプロジェクトを作成できます。

```
$ mbed new mytest1
$ cd mytest1
```
実行用の ```main()``` 関数がないので、このまま ```compile``` するとリンクエラーが発生します。フォルダ内にソースファイルを作成し（ファイル名は任意）、```main()``` 関数を記述して下さい。

```cpp:main.cpp
#include "mbed.h"
 
DigitalOut led1(LED1);
Serial pc(USBTX, USBRX);
 
int main()
{
    pc.printf("Hello, mbed world\n");
    while (1) {
        led1 = !led1;
        Thread::wait(500);
    }
}
```

## mbed 2.0 の場合

同じように、mbed ライブラリ（mbed 2.0）を使用したプログラムを作成することも可能です。この場合は、```--mbedlib``` オプションを指定します。

```
$ mbed new mytest2 --mbedlib
$ cd mytest2
```

「mbed OS 5 の場合」と同様に、フォルダ内に ```main()``` 関数を含んだソースファイルを作成します。

```cpp:main.cpp
#include "mbed.h"
 
DigitalOut led1(LED1);
Serial pc(USBTX, USBRX);
 
int main()
{
    pc.printf("Hello, mbed world\n");
    while (1) {
        led1 = !led1;
        wait_ms(500);
    }
}
```
mbed CLI の使い方はこちらの動画も参照して下さい。
[![](http://img.youtube.com/vi/PI1Kq9RSN_Y/0.jpg)](https://www.youtube.com/watch?v=PI1Kq9RSN_Y)

# デバッグしてみる

mbed CLI を使用したオフライン環境でデバッグする方法を説明します。

オンライン環境の場合は、オンラインIDEから「エクスポート」を選んで各種 IDE 用のプロジェクトを選択し、生成されたプロジェクトファイルダウンロードして使っていました。
mbed CLI を使ったオフラインの環境では、```export``` コマンドで直接 IDE のプロジェクトファイルを生成することが出来ます。

## Eclipse と pyOCD でデバッグする （Windows, Mac, Linux）

この場合は、mbed CLI でデバッグ情報付きのイメージファイルを生成して、Eclipse CDT と [```pyOCD```](https://github.com/mbedmicro/pyOCD) の組み合わせでデバッグを行うのが簡単です。Eclipse CDT でデバッグだけを行う場合は、mbed CLI で ```export``` を行う必要もありません。

ツールのセットアップは、以下の Notebook の「最初の準備」の部分を参照して下さい。 https://developer.mbed.org/users/MACRUM/notebook/debugging-with-eclipse-and-pyocd-ja/

デバッグを行うためのイメージの作成は、```--profile debug``` を付加してビルドします。

```
$ mbed compile -m K64F -t GCC_ARM --profile debug
```
デバッグの設定は、メニューから [Run] - [Debug Confugurations...] を選択し、新規に ```GDB PyOCD Debugging``` のコンフィグレーションを作成します。以下のように、```C/C++ Application:``` の部分に mbed CLI で生成した ```.elf``` ファイルをフルパスで指定します。

![](https://developer.mbed.org/media/uploads/MACRUM/debug-config-pyocd.png)

ターゲットボードとホストマシンをUSBケーブルで接続します。[Apply] ボタンで設定を更新し、[Debug] ボタンを押してデバッグを始めます。 
![](https://developer.mbed.org/media/uploads/MACRUM/xdebug-pyocd.png.pagespeed.ic.pZwxLv864i.png)

## MDK-ARM でデバッグする（Windows ホスト環境のみ）

MDK-ARM でデバッグを行うには、uVision 用のプロジェクトファイルを生成します。

```
$ mbed export -i uvision -m K64F
```
```projectfiles\uvision_K64F``` フォルダ配下に .uvision ファイルが生成されるので、ダブルクリックして uVision を起動します。

## EWARM でデバッグする（Windows ホスト環境のみ）

EWARM でデバッグを行うには、IAR Embedded Workbech 用のプロジェクトファイルを生成します。

```
$ mbed export -i iar -m K64F
```
```projectfiles\uvision_K64F``` フォルダ配下に .ewwファイルが生成されるので、ダブルクリックして IAR Embedded Workbench IDE を起動します。