mbed SDK ポーティング

このノートブックは、mbed SDK porting の翻訳版です。

新しいターゲットデバイスへの mbed SDK のポーティングは、以下の4つのステップからなります:

  1. ビルドシステムに新しいターゲットを追加する
  2. ターゲット用に CMSIS モジュールを追加する
  3. ターゲット用に mbed HAL API を実装する
  4. テストスイートで新しいターゲットを検証する

    mbed SDK(ツール+ライブラリ)のソースコードは、以下のレポジトリで公開されています: https://github.com/ARMmbed/mbed-os
    mbed SDK のポーティングを始める前に、まず mbed library internals に精通することをお勧めします。
    mbed SDK 自体の開発に関する議論(MCUやツールチェインの機能追加とサポート、ビルドとシステムのテスト、ハードウェア抽象化API等々)は、mbed-devel mailing list に参加してください。

コーディングスタイル

mbed SDK コーディングスタイルは、mbed SDK team's wiki ページ内で説明されています。詳細は、mbed SDK coding style を参照してください。

ビルドシステム

ユーザの観点からの mbed SDK のコマンドラインツールの概要は、mbed-tools handbook page を参照してください。
ビルドシステムに新しいターゲットを追加するには、以下の json ファイルに新しい Target を追加します: hal/targets.json
例えば、LPC1768 のターゲットは以下のようになっています:

    "LPC1768": {
        "inherits": ["LPCTarget"],
        "core": "Cortex-M3",
        "extra_labels": ["NXP", "LPC176X", "MBED_LPC1768"],
        "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "GCC_CR", "IAR"],
        "progen": {"target": "mbed-lpc1768"},
        "detect_code": ["1010"],
        "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"],
        "release_versions": ["2", "5"]
},


ビルド時に指定されるターゲットとツールチェインは TARGET_ 及び TOOLCHAIN_ "labels" のセットで定義されます。例えば以下のようになります:

Targets:
  * LPC1768 : ['TARGET_LPC1768', 'TARGET_M3', 'TARGET_LPC176X']
  * LPC11U24: ['TARGET_LPC11U24', 'TARGET_M0', 'TARGET_LPC11UXX']
  * KL25Z   : ['TARGET_KL25Z', 'TARGET_M0P']

Toolchains:
  * ARM    : ['TOOLCHAIN_ARM_STD', 'TOOLCHAIN_ARM']
  * uARM   : ['TOOLCHAIN_ARM_MICRO', 'TOOLCHAIN_ARM']
  * GCC_ARM: ['TOOLCHAIN_GCC_ARM', 'TOOLCHAIN_GCC']
  * IAR    : ['TOOLCHAIN_IAR']


ビルドシステムがコンパイルされるリソースをスキャンする時に、現在のビルドから全ての TARGET_TOOLCHAIN_ の "labels" 定義が含まれないディレクトリを除外します。

IDE

普段使い慣れているIDEを使用して、新しく追加されたターゲットの開発を行うことも可能です。スタートポイントとしては、以下の中から一つのプログラムを offline toolchains 用にエクスポートすることが可能です。

Import programmbed-src-program

Hello World program using the mbed library sources

CMSIS モジュール

個々のターゲットは、ベンダーディレクトリの配下にスタンドアローンの CMSIS ディレクトリを持ちます。例:

CMSIS ソース

mbed ターゲットとして使用される "cmsis" モジュール用には3種類のソースコードがあります。

ARM CMSIS-CORE モジュールは、Cortex-M コア固有のファイルが提供されます:

  • core_cmFunc.h
  • core_cmInstr.h
  • cortex_cm0.h / cortex_cm0plus.h / core_cm3.h / cortex_cm4.h

半導体ベンダーは、DEVICEで指定されるスタートアップ、システム初期化、周辺レジスタの構造体やアドレスを提供します:

  • startup_DEVICE.s
  • system_DEVICE.c
  • system_DEVICE.h
  • DEVICE.h

mbed SDK は、Cの標準ライブラリとして与えられる動的なベクタテーブルや memory model のコンフィグレーションを追加のファイルとして提供しなければなりません:

  • cmsis_nvic.c
  • cmsis_nvic.h
  • sys.cpp
  • TARGET.sct
  • cmsis.h

CMSIS ソースファイル

通常、半導体ベンダーは CMSIS-CORE と CMSIS デバイス依存ファイルの両方をソースパッケージとして提供しています。

mbed HAL

個々のターゲットは mbed HAL APU の実装が含まれたスタンドアローンのディレクトリを持ちます。例:

おそらく、新しいターゲットへのポーティングの開始時に最も重要なファイルは、device.h です。

device.h は、mbed ライブラリ内でペリフェラルの特定のセットを有効/無効に設定する全ての定義を含みます。

新しいターゲットへのポーティングを行う場合、これらの全ての定義を 0 に設定することで、全ての mbed ライブラリのコンパイルを行い、素早くテストを開始することが出来ます。

現在、最初のテストを開始する場合に最小構成の実装は以下になります:

このブロックの実装で、mbed hello world の様なシンプルなプログラムが実行可能になります:

#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}

以下は、潜在的なターゲット用の実装となる mbed ドライバ API の完全なリストです:

テスト

mbed SDK は、新しく追加されたターゲットを検証するためにテストシステムを提供しています。

コマンドラインインタフェースとテストシステムの構造を理解するために mbed-tools handbook page を参照することをお勧めします。

mbed SDK の検証時のテスト記述には、"MBED:" というプレフィックスが付きます。

ピンアウト

条件付きコンパイルの下で、新しいターゲットボードのピンアウトを追加するテストの多くのソースコードを編集する必要があります。

自動化

全てのテスト結果の文字列が明確に {success}/{failure} と表示され自動化されている訳ではありません。テストのいくつかはロジックアナライザなどで出力を検証するために、人間の介入のような追加的な計測を必要とします。

スモークテスト

[ 0] MBED: Basic は、最初の smoke test で、mbed SDK スイート内の他の全てのテストを実行するための基本項目になります。

#include "test_env.h"

int main() {
    notify_completion(true);
}

コマンドラインでのテスト実行例は以下です:

mbed> python workspace_tools\make.py -m LPC1768 -t ARM -s COM41 -d E:\ -p 0

>>> BUILD PROJECT: BASIC (LPC1768, ARM)
Compile: main.cpp
Compile: test_env.cpp
Link: basic
Elf2Bin: basic
Image: C:/Users/xxxx/mbed/build\test\LPC1768\ARM\MBED_A1\basic.bin
{success}
{end}

C/C++ 環境の初期化

  • MBED: Heap & Stack - ヒープとスタックの衝突検出を持つ単一領域メモリモデルの設定
  • MBED: C++ - 静的 C++ オブジェクトの初期化

Digital I/O と IRQ

このテストセットでは、互いに1対のピンを接続する必要があります:

  • MBED: DigitalInOut - デジタル I/O 機能の設定、方向と値
  • MBED: InterruptIn - GPIO 割り込みのトリガーとハンドリング

タイミングに関連する機能

このテストセットでは、時間のインターバルを検証するためにロジックアナライザを使用することが好ましいです。理想的には次のテストでは(マイクロ秒から数秒まで)広い時間間隔を越えた期間を変更し、繰り返されるべきです:

  • MBED: Time us - シンプルな us_ticker 初期化/読み込み機能
  • MBED: Ticker 2 - タイミングイベントの正しいトリガー

PWM

このテストセットでは、時間のインターバルを検証するためにロジックアナライザを使用することが好ましいです。理想的には次のテストでは(マイクロ秒から数秒まで)広い時間間隔を越えた期間を変更し、繰り返されるべきです:

  • MBED: PWM - PWM

I2C

I2C のテストでは、追加のペリフェラルに配線する事が必要になります:

SPI

SPI のテストでは、追加のペリフェラルに配線する事が必要になります:

UART

基本的な UART 機能は他の全てのテスト結果の通信手段として含まれていますが、以下のテストは他のいくつかの UART API のストレステストです:

  • MBED: Serial Echo at 115200 - ボーレートを 115200 に変更し、送信テスト
  • MBED: Serial InterruptMBED: Serial Interrupt 2 - シリアル tx/rx 割り込みハンドラ

ADC/DAC

このテストは、同じターゲット上のひとつの ADC ピンと DAC ピン間の接続に依存しています:

  • MBED: Analog

Port

ポート API のテストは、少なくともポートの2つのピンから、別のポートの2つのピンの接続が必要です:

  • MBED: PortInOut

RTC

  • MBED: RTC

Sleep

  • MBED: Sleep
  • MBED: Sleep Timeout

Semihosting

以下のテストは、mbed interface によって提供されているセミホスティング機能の確認のために使用されます:

  • MBED: semihost file system - ローカルファイルシステム
  • MBED: Semihost - mbed ユニーク ID
  • MBED: SW Reset - interface チップへのリセットの要求

Contributing

新しいターゲットの mbed SDK へのオフィシャルな追加に貢献するには:

  1. official mbed SDK repository への "pull request" を行い、以下を含めてください:
    • C/C++ ライブラリと Python ツールへの全ての変更
    • リファレンスターゲットボードの情報
  2. あなたの mbed.org アカウントでログイン後、我々の Apache Contribution Agreement にサインし、"pull request" の URL と共に プライベートメッセージを送って下さい。


Please log in to post comments.