[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.