[lang:ja] mbed OS 5に関する諸々

mbed OS 5にボードを対応させるにあたって知ったことなどをメモしておく。

mbed OS 5は、mbed 2.0(Classic)に極めて近い構造を持っている。
mbed OS 5のリポジトリは、GitHubでホストされている。 https://github.com/ARMmbed/mbed-os/
mbed OS 5で「mbed Enabled」であるには、パートナーであることが必須要件。 https://www.mbed.com/en/about-mbed/mbed-enabled/mbed-enabled-program-requirements/

パートナーでなくとも、問題を発見したり修正するにも、自分の手元で野良ビルドするにも、mbed OS 5のテクニカルな情報は有用だと思うのでメモしておきます。

targets.json

mbed OS 5のビルドシステムに参照される、もっとも大事なファイルはtargets.jsonとなりました。このファイルには、サポートするツールチェーン等のClassicの頃からあった情報に加えて、「mbed detect」コマンドでボードを識別するときに使われる

"detect_code": ["1010"]

や、mbed 2.0やmbed OS 5.0への対応状況を示す

"release_versions": ["2", "5"]

といった記述が存在します。

特に、

"features": ["BLE"],

"features": ["IPV4"],

といった、mbed OSの何らかの機能を利用するように指定したり、

"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "DEBUG_AWARENESS", "ERROR_PATTERN", "ETHERNET", "I2C", "I2CSLAVE", "INTERRUPTIN", "LOCALFILESYSTEM", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SEMIHOST", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"],

といった具合に、デバイスが持っている機能を記述したりするようになりました。

詳しくは、次のドキュメントに記載があります。 https://github.com/ARMmbed/mbed-os/blob/master/docs/mbed_targets.md

テスト

mbed OS 5よりmbed Enabledの要件に、メジャーなARMのコンパイラである、GCC ARM、ARM Compiler 5、IARの三種をサポートするということが必須要件として記載されています。mbed_settings.pyにコンパイラのパスを記載して、テストを行いましょう。

mbed CLIの詳細な説明は、次のページに記載されています。
https://github.com/ARMmbed/mbed-cli/blob/master/README.md

テストの手順は簡単です。まず、mbed newをして、開発環境を作ります。

C:¥mbed>mbed new test-app

次に、ディレクトリの中に移動をして、

C:¥mbed>cd test-app

このディレクトリの中にあるmbed-osディレクトリの中に追加したいターゲットを記述します。 開発を終えたら、

mbed test --compile -m TY51822R3 -t ARM 

で、テスト用のバイナリをビルドします。
さきほど記した様に、コンパイラはARMだけでなく、GCC_ARM、IARもサポートしていなければなりません。

次にターゲットのボードを開発ホストに接続し、

mbed detect 

で、ターゲットが検出できることも確認します。 検出できると、

[mbed] Detected LPC1768, port None, mounted E:
[mbed] Supported toolchains for LPC1768
+---------+-----------+-----------+-----------+-----------+-----------+
| Target  | mbed OS 2 | mbed OS 5 |    ARM    |  GCC_ARM  |    IAR    |
+---------+-----------+-----------+-----------+-----------+-----------+
| LPC1768 | Supported | Supported | Supported | Supported | Supported |
+---------+-----------+-----------+-----------+-----------+-----------+
Supported targets: 1
Supported toolchains: 3

このようなメッセージが表示されます。 最後に、テストを実行しましょう。次の例は、armccでビルドしたバイナリを使ったテストの実行です。

mbed test --run -m TY51822R3 -t ARM

このテストは、RTOSの機能テストで、約15分程度要します。コンパイラ三種ぶんですので、これを三回実行します。 全てのテストにパスをしたら、mbed-osリポジトリからforkしたコードにmbed-osディレクトリ以下に施した変更を反映させるなどして、プルリクエストを送ります。

プルリクエストを送るときには、15分×3回待って生成された、テストレポートをコメントに貼り付けておくと良いでしょう。
テストレポートは、コマンドプロンプトの「画面バッファーのサイズ」を幅300以上にしておくと快適にコピーできます。貼り付けるときにはGitHub Flavored Markdown(GFM)の「```」で括っておくと良いでしょう。

ソースコードの記述スタイルや、プルリクエストを送るときの依頼事項は、次のページに記載されています。
https://github.com/ARMmbed/mbed-os/blob/master/docs/COMMITTERS.md

mergeされたら

mergeされると、次にmbed newしたときには、あなたの変更が反映されたコードがダウンロードされるはずです。前までは得られなかったスピード感なので、gitと統合されたことによるメリットを感じられます。

ここで、mbed newして作ったディレクトリの中に、main.cppを作ってみましょう。

#include "mbed.h"
#include "rtos.h"

DigitalOut led1(LED1);
Serial pc(USBTX, USBRX);

// main() runs in its own thread in the OS
// (note the calls to Thread::wait below for delays)
int main() {
    pc.baud(115200);
    pc.printf("hello, mbed OS\n");
    while (true) {
        led1 = !led1;
        Thread::wait(500);
    }
}

こんな内容で、とりあえず作ってみました。
そこで、コンパイルすると、自分で書いたコードをビルドすることができます。

C:¥mbed¥test-app>mbed compile -m TY51822R3 -t ARM

コンパイルが終わると、次の様なメッセージが出力されます。

Link: test-app
Elf2Bin: test-app
+----------------------+-------+-------+------+
| Module               | .text | .data | .bss |
+----------------------+-------+-------+------+
| Misc                 | 13731 |    17 |  552 |
| features/FEATURE_BLE |  1022 |     0 |  344 |
| features/frameworks  |  4060 |   572 |  560 |
| hal/common           |  5138 |    36 |  120 |
| hal/targets          |  8392 |   138 |  783 |
| rtos/rtos            |   140 |     4 |    0 |
| rtos/rtx             |  6252 |    92 | 4988 |
| Subtotals            | 38735 |   859 | 7347 |
+----------------------+-------+-------+------+
Allocated Heap: unknown
Allocated Stack: unknown
Total Static RAM memory (data + bss): 8206 bytes
Total RAM memory (data + bss + heap + stack): 8206 bytes
Total Flash memory (text + data + misc): 39594 bytes
Image: .¥.build¥TY51822R3¥ARM¥test-app.hex

これを、ターゲットのmbedにコピーします。

C:¥mbed¥test-app>copy .¥.build¥TY51822R3¥ARM¥test-app.hex e:
        1 個のファイルをコピーしました。

ここで、ターゲットのリセットボタンを押すと、アプリケーションの実行が始まるはずです。

BLEのテストをしてみる

今回、僕はTY51822r3をmbed OS 5に対応させる作業をしているので、プロセッサが動くことを確認したのちにBLEが動くことも確認したいと思います。

まず、URIBeaconのサンプルをimportし、それからmbed-osを最新にします。(これまでのプロセスでプルリクを送ってmergeされたものにしました。)

C:¥mbed>mbed import https://developer.mbed.org/teams/mbed-os-examples/code/mbed-os-example-ble-URIBeacon/

C:¥mbed>cd mbed-os-example-ble-URIBeacon

C:¥mbed¥mbed-os-example-ble-URIBeacon>cd mbed-os

C:¥mbed¥mbed-os-example-ble-URIBeacon\mbed-os>mbed update master
[mbed] Updating library "mbed-os" to branch master
[mbed] Updating reference "mbed-os" -> "https://github.com/ARMmbed/mbed-os/#2776dd7dd3968a12870e7780e0cf189dd595bd70"

ここまでできたら、あとはビルドしてみます。

C:¥mbed¥mbed-os-example-ble-URIBeacon>mbed compile -m TY51822R3 -t ARM
Building project mbed-os-example-ble-URIBeacon (TY51822R3, ARM)

   (((中略)))

Link: mbed-os-example-ble-URIBeacon
Elf2Bin: mbed-os-example-ble-URIBeacon
+----------------------+-------+-------+------+
| Module               | .text | .data | .bss |
+----------------------+-------+-------+------+
| Misc                 | 21098 |    50 |  624 |
| features/FEATURE_BLE | 13380 |    28 |  512 |
| features/frameworks  |  4060 |   572 |  560 |
| hal/common           |  4192 |    36 |  120 |
| hal/targets          | 15278 |   214 | 1354 |
| rtos/rtos            |   188 |     4 |    0 |
| rtos/rtx             |  6650 |    92 | 4988 |
| Subtotals            | 64846 |   996 | 8158 |
+----------------------+-------+-------+------+
Allocated Heap: unknown
Allocated Stack: unknown
Total Static RAM memory (data + bss): 9154 bytes
Total RAM memory (data + bss + heap + stack): 9154 bytes
Total Flash memory (text + data + misc): 65842 bytes
Image: .¥.build¥TY51822R3¥ARM¥mbed-os-example-ble-URIBeacon.hex

C:¥mbed¥mbed-os-example-ble-URIBeacon>copy .¥.build¥TY51822R3¥ARM¥mbed-os-example-ble-URIBeacon.hex e:
        1 個のファイルをコピーしました。

あとは、ターゲットのリセットボタンを押すだけです。

いごきました!

exportのサポート

mbed CLIでIDEにexportするには、次の様にします。

C:¥mbed¥mbed-os-example-ble-URIBeacon>mbed export -i uvision5 -m ty51822r3

が、新規のボードはexportについても設定を記述しなければなりません。

まず、project_generator_definitionsの、project_generator_definitions/target/targets.pyに追記をしなければなりません。

    'ty51822r3': {
        'mcu':'mcu/nordic/nrf51822',
        'debugger': {
            'name': 'cmsis-dap',
            'interface': 'swd',
        }
    },

こんなコードを追記しました。

今回は、MCUであるnRF51822は既に登録されているので、YAMLを記載する必要はありませんでしたが、新しいMCUを追加したときにはproject_generator_definitionsのREADME.mdを読んでYAMLを作らなければならないと思います。

project_generator_definitionsは、forkしてclone、手元でtargets.pyを編集して、

C:¥GitHub¥project_generator_definitions>python setup.py install

などと、ローカル環境にインストールをします。

次に、exporterは、mbed-osのtargets.jsonも参照しているみたいです。 追加するボードのところに

"progen": {"target": "ty51822r3"},

こんな内容を記述しました。

最後に、exporterは、uV4と5、IAR向けのプロジェクトファイルの生成にテンプレートを必要としなくなりました。(mbed 2.0では必要でした。)しかし、GCC_ARM用のMakefileを生成するには、テンプレートが必要な様です。mbed-os¥tools¥exportに、テンプレートを用意しておきましょう。また、このディレクトリにある「gccarm.py」にプラットフォーム名の追記も必要です。


Please log in to post comments.