チュートリアル: リアルタイム対応アプリケーションを構築する
重要
これは Azure Sphere (レガシ) のドキュメントです。 Azure Sphere (レガシ) は 2027 年 9 月 27 日に 再提供されておりユーザーは現時点で Azure Sphere (統合) に移行する必要があります。 TOC の上にある Version セレクターを使用して、Azure Sphere (統合) のドキュメントを表示します。
このチュートリアルでは、Azure Sphere デバイスでリアルタイム コア用のサンプル アプリケーションを構築する方法について説明します。 リアルタイム対応アプリケーションの基本情報については、「 Azure Sphere アプリケーションの概要 」を参照してください。
このチュートリアルでは、次の作業を行う方法について説明します。
- サンプル アプリケーションをダウンロードする
- GNU Arm ツールチェーンをインストールする
- 出力を表示するようにハードウェアを設定する
- 開発とデバッグを有効にする
- ターミナル エミュレーターを起動して出力を表示する
- リアルタイム対応アプリケーションのビルド、実行、デバッグ
重要
以下の手順は、Seeed Studios の MT3620 開発キットなど、MT3620 参照ボード設計 (RBD) ハードウェアに準拠したハードウェアを使用していることを前提としています。 別の Azure Sphere ハードウェアを使っている場合は、製造元のドキュメントを参照して、UART が公開されているかどうか、およびそれにアクセスする方法を確認してください。 異なる方法で出力を表示するようにハードウェアを設定し、異なる UART を使うようにサンプル コードおよび app_manifest.json ファイルの "Uart" フィールドを更新することが、必要になる場合があります。
前提条件
- Windows または Linux の場合は 用に CMake と Ninja をインストールします。
- Visual Studio Code For Windows または Linux の場合は をインストールします。
- Windows または Linux の場合は 用に CMake と Ninja をインストールします。
- Azure Sphere SDK for Windows または Linux 用の をインストールする
- テナントを選択してデバイスを要求する
- ネットワークを構成し、デバイス OS を更新する
サンプル アプリケーションのダウンロード
HelloWorld アプリケーションは次のようにダウンロードできます。
- ブラウザーを Microsoft Samples Browser をポイントします。
- 検索ボックスに「Azure Sphere」と入力します。
- 検索結果から Azure Sphere - Hello World を選択します。
- [ZIP ダウンロード] を選択。
- ダウンロードしたファイルを開き、ローカル ディレクトリに展開します。
GNU Arm 埋め込みツールチェーンをインストールします
arm 開発者向け Web サイトから ダウンロード GNU Arm Embedded Toolchain をインストールできます。 または、 vcpkg artifacts を使用して、開発環境を自動的にインストールして構成できます。
- Visual Studio 2022: Visual Studio 2022 を使用している場合は、 Arm 開発者向け Web サイトから GNU Arm Embedded Toolchain (arm-none-eabi) をインストール。
- Visual Studio 2019: ツールチェーンは、Visual Studio 2019 の Visual Studio 用 Azure Sphere 拡張機能と共に自動的にインストールされます。 Visual Studio 2019 を使用している場合は、「 出力を表示するためのハードウェアのセットアップ」に進みます。 ただし、GNU Arm Embedded Toolchain を手動でインストールした場合、Visual Studio ではインストールしたバージョンが使用されます。
ツールチェーンをインストールするには、 Arm 開発者向け Web サイトで、ARM Cortex-M4 プロセッサのコンパイラを含む GNU Arm Embedded Toolchain (arm-none-eabi) を見つけます。 指示に従って、OS プラットフォームのコンパイラをダウンロードしてインストールします。
既定では、Visual Studio Code はツールチェーンを検索し、インストールしたバージョンを見つける必要があります。 ツールチェーンに関連するビルドの問題が発生した場合は、次のようにパスを入力します。
- File>Preferences>Settings>Extensions>Azure Sphere を選択します。
- Azure Sphere: Arm Gnu Path 設定に GNU Arm Embedded Toolchain のインストール パスを入力します。
ツールチェーンをインストールするには、 Arm 開発者向け Web サイトで、ARM Cortex-M4 プロセッサのコンパイラを含む GNU Arm Embedded Toolchain (arm-none-eabi) を見つけます。 指示に従って、OS プラットフォームのコンパイラをダウンロードしてインストールします。
出力を表示するようにハードウェアを設定する
現在、各リアルタイム コアでは TX 専用の UART がサポートされています。 RTApps は、この UART を使用してデバイスからログ出力を送信します。 アプリケーションの開発とデバッグの際には、一般に、出力を読み取って表示する手段が必要となります。 HelloWorld_RTApp_MT3620_BareMetal サンプルは、アプリケーションがどのように UART に書き込むかを示しています。
FTDI Friend などの USB-to-シリアル アダプターを使用して、リアルタイム コア上の UART をコンピューターの USB ポートに接続します。 また、出力を表示するには、 ターミナル エミュレーター 115200-8-N-1 ターミナル設定 (115200 bps、8 ビット、パリティ ビットなし、1 ストップ ビット) でシリアル接続を確立する必要があります。
RTApp からの出力を表示するようにハードウェアを設定するには、次の手順に従います。 ピンの場所を決定するには、ハードウェア製造元のドキュメントを参照する必要があります。 Seeed Studios の MT3620 開発キットなど、MT3620 参照ボード設計 (RDB) ハードウェアに準拠しているハードウェアを使用している場合、RDB インターフェイス ヘッダーを確認すると、ピンの場所を決定するのに役立ちます。
- USB シリアル変換アダプターの GND をお使いの開発キットの GND に接続します。 MT3620 RDB ハードウェアでは、GND はヘッダー3、ピン 2 です。
- USB シリアル変換アダプターの RX をお使いの開発キットの IOM4-0 TX に接続します。 MT3620 RDB ハードウェアでは、IOM4-0 TX はヘッダー3、ピン 6 です。
- USB からシリアルへのアダプターを開発用コンピューター上の空き USB ポートに接続し、シリアル デバイスが接続されているポートを決定します。 Windows でデバイス マネージャーを起動し、View>Devices by container を選択し、"USB UART" を探します。 たとえば、FT232R USB UART は FTDI フレンド アダプターを示します。
- ターミナル エミュレーター プログラムを起動し、アダプターで使用される COM ポートに 115200-8-N-1 ターミナルを開きます。 ポートと速度を指定する方法については、ターミナル エミュレーターのドキュメントを参照してください。
出力を表示するようにハードウェアを設定する
現在、各リアルタイム コアでは TX 専用の UART がサポートされています。 RTApps は、この UART を使用してデバイスからログ出力を送信します。 アプリケーションの開発とデバッグの際には、一般に、出力を読み取って表示する手段が必要となります。 HelloWorld_RTApp_MT3620_BareMetal サンプルは、アプリケーションがどのように UART に書き込むかを示しています。
FTDI Friend などの USB-to-シリアル アダプターを使用して、リアルタイム コア上の UART をコンピューターの USB ポートに接続します。 また、出力を表示するには、 ターミナル エミュレーター 115200-8-N-1 ターミナル設定 (115200 bps、8 ビット、パリティ ビットなし、1 ストップ ビット) でシリアル接続を確立する必要があります。
RTApp からの出力を表示するようにハードウェアを設定するには、次の手順に従います。 ピンの場所を決定するには、ハードウェア製造元のドキュメントを参照する必要があります。 Seeed Studios の MT3620 開発キットなど、MT3620 参照ボード設計 (RDB) ハードウェアに準拠しているハードウェアを使用している場合、RDB インターフェイス ヘッダーを確認すると、ピンの場所を決定するのに役立ちます。
USB シリアル変換アダプターの GND をお使いの開発キットの GND に接続します。 MT3620 RDB ハードウェアでは、GND はヘッダー3、ピン 2 です。
USB シリアル変換アダプターの RX をお使いの開発キットの IOM4-0 TX に接続します。 MT3620 RDB ハードウェアでは、IOM4-0 TX はヘッダー3、ピン 6 です。
USB からシリアルへのアダプターを開発用コンピューター上の空き USB ポートに接続し、シリアル デバイスが接続されているポートを決定します。
Windows でデバイス マネージャーを起動し、View>Devices by container を選択し、"USB UART" を探します。 たとえば、FT232R USB UART は FTDI フレンド アダプターを示します。
Linux では、次のコマンドを入力します。
dmesg | grep ttyUSB
ポートには ttyUSBn という名前を付ける必要があります。この n はポート番号です。
dmesg
コマンドが複数の USB ポートを一覧表示する場合、通常は最後に接続されたポートに接続されているポートが接続済みとして報告されます。 たとえば、次の例では、ttyUSB4 を使用します。
~$ dmesg | grep ttyUSB [ 144.564350] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB0 [ 144.564768] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB1 [ 144.565118] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB2 [ 144.565593] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB3 [ 144.570429] usb 1-1.1.3: FTDI USB Serial Device converter now attached to ttyUSB4 [ 254.171871] ftdi_sio ttyUSB1: FTDI USB Serial Device converter now disconnected from ttyUSB1
ターミナル エミュレーター プログラムを起動し、アダプターで使用される COM ポートに 115200-8-N-1 ターミナルを開きます。 ポートと速度を指定する方法については、ターミナル エミュレーターのドキュメントを参照してください。
開発とデバッグを有効にする
Azure Sphere デバイスでサンプル アプリケーションをビルドしたり、Azure Sphere デバイス用の新しいアプリケーションを開発したりするには、その前に、開発とデバッグを有効にする必要があります。 既定では、Azure Sphere デバイスは "ロックされています"。つまり、開発中のアプリケーションを PC から読み込むことはできず、アプリケーションのデバッグは許可されません。 デバッグ用にデバイスを準備すると、この制限がなくなり、デバッグに必要なソフトウェアが読み込まれ、「デバイス機能と通信」で説明されているように、デバイスの機能がロック解除されます。
リアルタイム コアでデバッグするには、 azsphere device enable-development コマンドを使用します。 このコマンドは、デバッグのために PC からのアプリケーションを受け入れるようにデバイスを構成し、クラウド アプリケーションの更新を許可しない開発デバイス グループにデバイスを割り当てます。 アプリケーションの開発およびデバッグ中は、クラウド アプリケーション更新によって開発中のアプリケーションが上書きされないように、デバイスをこのグループに残しておく必要があります。
Windows では、デバッグ サーバーとコアの種類ごとに必要なドライバーをデバイスに読み込む --enable-rt-core-debugging
パラメーターを追加する必要があります。
まだログインしていない場合は、Azure Sphere にログインします。
azsphere login
管理者特権で PowerShell または Windows コマンド プロンプトを使用して、コマンド ライン インターフェイスを開きます。
--enable-rt-core-debugging
パラメーターには、デバッガー用の USB ドライバーがインストールされるため、管理者特権が必要です。次のコマンドを入力します。
azsphere device enable-development --enable-rt-core-debugging
管理者特権はもう必要ないので、コマンドが完了したらウィンドウを閉じます。 ベスト プラクティスとして、常に、タスクを実行できる最も低い特権を使用する必要があります。
azsphere device enable-development コマンドが失敗した場合は、 Azure Sphere の問題のトラブルシューティングを参照してください。
Visual Studio を使用して HelloWorld RTApp アプリケーションをビルドして実行する
Visual Studio を起動します。 [ローカル フォルダーを開く] を選択し、ダウンロードしたAzure_Sphere___Hello_World.zip ファイルを抽出したフォルダーに移動し、HelloWorld_RTApp_MT3620_Baremetal フォルダーを選択します。
MT3620 RDB を使用していない場合は、 app_manifest.json ファイルとサンプル コードを更新して 、適切な UART (ISU1 など) を指定します。
CMake の生成が自動的に始まらない場合は、CMakeLists.txt ファイルを選択します。
Visual Studio の出力 ウィンドウで、CMake の出力に
CMake generation started.
メッセージが表示されます。CMake generation finished.
Build>Build All を選択します。 メニューが表示されない場合は、ソリューション エクスプローラーを開き、CMakeLists.txt ファイルを右クリックし、Build を選択します。 HelloWorld_RTApp_MT3620_Baremetal アプリケーションの出力場所が Output ウィンドウに表示されます。
スタートアップ項目の選択メニューで、HelloWorld_RTApp_MT3620_Baremetal (RTCore)を選択します。
F5 キーを押して、アプリケーションを配置します。
接続されているターミナル エミュレーターに、HelloWorld_RTApp_MT3620_Baremetal プログラムからの出力が表示されます。 プログラムでは、1 秒間隔で次の単語が送信されます。
Tick
Tock
デバッガーを使用してブレークポイントを設定し、変数を検査して、その他のデバッグ タスクを試みます。
Visual Studio Code を使用して HelloWorld RTApp アプリケーションをビルドして実行する
Visual Studio Code で、ダウンロードしたAzure_Sphere___Hello_World.zip ファイルを抽出したフォルダー内のHelloWorld_RTApp_MT3620_BareMetal フォルダーを開きます。 キットを選択するように求めるメッセージが表示されたら、[キットを使用しない] を選択します。
MT3620 RDB ハードウェアを使用していない場合は、app_manifest.json ファイルとサンプル コードを更新して、正しい UART (たとえば、ISU1) を指定します。
F5 キーを押してデバッガーを開始します。 プロジェクトがまだビルドされていない場合、またはファイルが変更され、リビルドが必要な場合は、デバッグを開始する前に、Visual Studio Code によってプロジェクトがビルドされます。
Azure Sphere の出力ウィンドウに、"Deploying image..."\(画像のデプロイ中...\) に続いて SDK とコンパイラへのパスが表示されます。
接続されているターミナル エミュレーターに、HelloWorld_RTApp_MT3620_Baremetal プログラムからの出力が表示されます。 プログラムでは、1 秒間隔で次の単語が送信されます。
Tick
Tock
ブレークポイントの設定、変数の確認、その他のデバッグ タスクの試行には Visual Studio Code のデバッグ機能を使用します。
トラブルシューティング
OpenOCD で接続が行われる前にこのアプリケーションが実行を始めることがあります。 結果として、コードの最初の方に設定されているブレークポイントを逃すことがあります。 これを回避する簡単な方法は、OpenOCD で接続が行われるまでアプリの開始を遅らせることです。
アプリケーション エントリ ポイント RTCoreMain の先頭に次のコードを挿入します。 これにより、変数
f
が true に設定されるまでアプリケーションがwhile
ループに入り、そこに残ります。volatile bool f = false; while (!f) { // empty. }
F5 キーを押してアプリケーションをデバッグ (F5) で起動し、実行を中断します。
Locals デバッグ ウィンドウで、
f
の値を 0 から 1 に変更します。通常どおりにコードをステップ実行します。
サンプルをビルドする
PowerShell、Windows コマンド プロンプト、または Linux コマンド シェルを使用して、コマンド ライン インターフェイスを開きます。 プロジェクトビルドディレクトリに移動します。
プロジェクト ビルド ディレクトリから、コマンド プロンプトで、次のパラメーターを指定して CMake を実行します。
cmake --preset <preset-name> <source-path>
--preset <preset-name>
CMakePresets.jsonで定義されているビルド構成プリセット名。
--build <cmake-path>
CMake キャッシュを含むバイナリ ディレクトリ。 たとえば、Azure Sphere サンプルで CMake を実行すると、ビルド コマンドが
cmake --build out/ARM-Debug
されます。<source-path>
サンプル アプリケーションのソース ファイルを含むディレクトリのパス。 この例では、Azure Sphere サンプル リポジトリが AzSphere というディレクトリにダウンロードされています。
CMake パラメーターはスペースで区切られます。 行継続文字 (Windows コマンド ラインの場合は ^、Linux コマンド ラインの場合は \、PowerShell の場合は ' ) は読みやすくするために使用できますが、必須ではありません。
次の例は、RTApp の CMake コマンドを示しています。 示されている場合は、 <file-path> をシステム上の GNU Arm Embedded Toolchain のインストール パスに置き換えます。
Ninja を実行してアプリケーションをビルドし、イメージ パッケージ ファイルを作成します。
ninja -C out/ARM-Debug
Ninja は、結果のアプリケーション ファイルと .imagepackage ファイルを指定されたディレクトリに配置します。
次のコマンドを使用して、CMake から Ninja を呼び出すこともできます。
cmake --build out/<binary-dir>
<binary-dir>
CMake キャッシュを含むバイナリ ディレクトリに設定します。 たとえば、Azure Sphere サンプルで CMake を実行すると、ビルド コマンドがcmake --build out/ARM-Debug
されます。
特に CMake コマンドを変更した後にトラブルシューティングを行う場合は、ビルド全体を削除してから、やり直してください。
サンプルを実行する
デバイスに既にデプロイされているアプリケーションをすべて削除します。
azsphere device sideload delete
プロジェクト ディレクトリからコマンド プロンプトで、ninja によって作成されたイメージ パッケージを読み込みます。
azsphere device sideload deploy --image-package <path-to-imagepackage>
イメージのコンポーネント ID を取得します。
azsphere image-package show --image-package <path-to-imagepackage>
このコマンドは、イメージ パッケージのすべてのメタデータを返します。 アプリケーションのコンポーネント ID は、イメージの種類 Application の Identity セクションに表示されます。 次に例を示します。
Image package metadata: Section: Identity Image Type: Application Component ID: <component id> Image ID: <image id>
次のコマンドを使用して、アプリケーションの停止、開始、状態の取得を行うことができます。
azsphere device app stop --component-id <component id>
azsphere device app start --component-id <component id>
azsphere device app show-status --component-id <component id>
サンプルをデバッグする
アプリケーションが実行されている場合は停止します。
azsphere device app stop --component-id <component id>
デバッグのためにアプリケーションを再開します。
azsphere device app start --component-id <component id>
このコマンドは、アプリケーションが実行中のコアを返します。
<component id> App state : running Core : Real-time 0
アプリケーションのビルドに使用された、Openocd フォルダー内の sysroot に移動します。 sysroot は、Azure Sphere SDK インストール フォルダーにインストールされます。 たとえば、Windows では、フォルダーは既定で
C:\Program Files (x86)\Microsoft Azure Sphere SDK\Sysroots\*sysroot*\tools\openocd
にインストールされ、Linux では/opt/azurespheresdk/Sysroots/*sysroot*/tools/sysroots/x86_64-pokysdk-linux
にインストールされます。次の例に示すように
openocd
を実行します。 この例は、アプリがコア 0 で実行されていると想定されています。 アプリがコア 1 で実行されている場合は、"targets io0" を "targets io1" に置き換えます。アプリケーション .out ファイルが含まれているフォルダーに移動し、GNU Arm Embedded ツールチェーンの一部である
arm-none-eabi-gdb
を開始します。Windows コマンド プロンプト
"C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin\arm-none-eabi-gdb" HelloWorld_RTApp_MT3620_BareMetal.out
Windows PowerShell
& "C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin\arm-none-eabi-gdb" HelloWorld_RTApp_MT3620_BareMetal.out
OpenOCD サーバーにより、4444 上に GDB サーバー インターフェイスが提供されます。 デバッグのターゲットを設定します。
target remote :4444
これで、gdb コマンドを実行できるようになりました。
接続されているターミナル エミュレーターに、アプリケーションからの出力が表示されます。
パートナー アプリを使用する
アプリケーションを Azure Sphere デバイスに読み込むと、Azure Sphere のデプロイ ツールでは、既定で既存のアプリケーションがすべて削除されます。 相互に通信するアプリケーションを開発するときにこの問題が発生しないようにするには、アプリケーションを パートナーとしてマークする必要があります。 いずれかのアプリケーションをデプロイしても、そのパートナーは削除されません。 詳細については、「アプリケーションをパートナーとしてマークする」をご覧ください。
次のステップ
- Azure Sphere で Azure RTOS を実行する方法について説明します
- リアルタイム対応コアのその他のサンプルを確認します。
- Azure Sphere アプリケーションの詳細を確認する