Azure RTOS のリアルタイム センサー アプリケーションをデプロイして室内環境を監視する方法

完了

微生物学の実験室は、新しい顧客の一連の実験を行うためのものです。 実験を行うには、実験室の温度、湿度、および気圧が非常に安定している必要があります。 十分に調査した後、顧客のニーズを満たす新しい環境センサーが見つかりました。 しかし、新しいセンサーはタイミングが非常に重要であり、Azure Sphere リアルタイム コアのいずれかにデプロイする必要があることがわかりました。

このユニットでは、新しい温度、湿度、気圧センサーをサポートするために、リアルタイム アプリケーションを Azure Sphere にデプロイする方法について学習します。

Azure Sphere のアーキテクチャ

Azure Sphere マイクロコントローラー ユニット (MCU) には、開発者がアクセスできる 3 つのコア (Linux カーネルを実行する 1 つの Cortex-A7 と、ベアメタル コードを実行できる 2 つの Cortex-M4 コア)、または Azure RTOS や FreeRTOS などのリアルタイム オペレーティング システムがあります。

Cortex-A7 Linux カーネルで実行されている高レベル アプリケーションは、ネットワーク接続の確立、セキュリティのネゴシエート、デバイスの状態の更新、リアルタイム コア アプリケーションとの通信、IoT Hub などのクラウド ゲートウェイへのテレメトリ メッセージの送信など、時間的制約がそれほどないタスクに使用されます。

Azure Sphere architecture.

RTOS (リアルタイム オペレーティング システム) とは

操作の全体的な正確さが、論理的な正確さだけでなく実行された時点にも依存する場合、システムはリアルタイムであると言われます。Wikipedia 記事へのリンク

リアルタイム オペレーティング システムは、アプリケーション用にサービスの提供とプロセッサ リソースの管理を行うシステム ソフトウェアです。 これらのリソースとして、プロセッサ サイクル、メモリ、周辺機器、割り込みなどがあります。 リアルタイム オペレーティング システムの主な目的は、組み込み型ソフトウェアで実行する必要があるさまざまな作業に処理時間を配分することです。

これには通常、ソフトウェアを "タスク" または "スレッド" と一般に呼ばれる断片に分割し、スレッドごとに専用の仮想マイクロプロセッサを提供する実行時環境を作成すること ("マルチスレッド処理") が含まれます。 基本的に、仮想マイクロプロセッサは、レジスタ セット、プログラム カウンター、スタック メモリ領域、スタック ポインターなどのマイクロプロセッサ リソースの仮想セットで構成されます。 スレッドに物理的なマイクロプロセッサ リソースが使用されるのはその実行中だけですが、各スレッドにはこれらのリソースの内容のコピーが、専用のプライベート リソースであるかのように、それ専用に保持されています (スレッドの "コンテキスト")。

Azure RTOS の概要

Azure RTOS は、Microsoft から提供されるリアルタイム オペレーティング システムです。 Azure RTOS は、リソースが制限されたデバイスに信頼性の高い超高速パフォーマンスを提供する、ThreadX と呼ばれる小規模ながら強力なオペレーティング システムを含む、組み込み開発スイートです。 Azure RTOS スイートには、GUI 設計ツールやライブラリなどの他のコンポーネントが含まれています。 このユニットでは、Azure RTOS ThreadX を使用します。

Azure RTOS ThreadX は、特に深く組み込まれたアプリケーション向けに設計された高度なリアルタイム オペレーティング システム (RTOS) です。 リアルタイム マルチスレッド処理、スレッド間の通信と同期、メモリ管理など、さまざまな利点があります。 Azure RTOS ThreadX には、ピコカーネル アーキテクチャ、優先しきい値、イベント チェーン、豊富なシステム サービスのセットを含む、高度な機能が多数用意されています。

リアルタイム アプリケーションをビルドしてデプロイする理由

Cortex M4 リアルタイム コアでコードを実行する理由には、次のようなものがあります。

  1. 既存の Cortex M4 コードを Azure Sphere に移行しようとしている。
  2. アプリケーションで正確な、または決定論的なタイミングを必要としており、Cortex-A7 Linux カーネル コアではそれを保証できない (他のサービスで完了する必要がある)。
  3. Azure Sphere 上のすべてのメモリと処理リソースを活用するために、アプリケーションを複数のコアで実行することでメリットが得られる可能性がある。

詳細については、「リアルタイム オペレーティング システム」の「概要とそれを使用する理由」のガイドを参照してください。

コア間通信

セキュリティ上の理由から、リアルタイム コアで実行されているアプリケーションからは、どのネットワーク リソースにもアクセスできません。 ただし、セキュリティで保護されたメールボックスのメカニズムをアプリケーションで使用すると、他のコアで実行されているアプリケーションと通信できます。 また、コア間で渡されるデータの形式を表す共通の理解またはコントラクトも必要です。 可能であれば、C の int、float、enum、文字などの基本型を使用してデータ メッセージの形式を記述します。 オブジェクトの配列を渡すなど、ニーズがもっと複雑な場合は、シリアル化のスキームを実装する必要があります。

次の構造体は、このユニットで使用されているコア間コントラクトを宣言しています。 このコントラクトは IntercoreContract ディレクトリにあります。

typedef enum
{
    LP_IC_UNKNOWN,
    LP_IC_HEARTBEAT,
    LP_IC_ENVIRONMENT_SENSOR,
    LP_IC_SAMPLE_RATE
} LP_INTER_CORE_CMD;

typedef struct
{
    LP_INTER_CORE_CMD cmd;
    float temperature;
    float pressure;
    float humidity;
    int sample_rate;
} LP_INTER_CORE_BLOCK;

ソリューションのアーキテクチャ

Inter-core communications architecture.

ソリューションのアーキテクチャは次のとおりです。

  1. Azure RTOS のリアルタイム環境センサー スレッドは 2 秒ごとに実行されます。 そのスレッドで最新の環境温度、湿度、および気圧のデータがメモリに格納されます。
  2. 高レベルのテレメトリ ストリーミング アプリからリアルタイム コアに対して、最新の環境データが要求されます。
  3. Azure RTOS のリアルタイム環境サービス スレッドが最新の環境データを使用して応答します。
  4. 高レベル アプリケーションでその環境データが JSON としてシリアル化され、テレメトリ メッセージが IoT Hub に送信されます。
  5. デバイスによって IoT Hub に送信されたテレメトリ メッセージが Azure IoT Explorer によってサブスクライブされ、テレメトリが表示されます。
  6. また、プロパティを設定することによって、室内の目標温度を設定することもできます。 そのプロパティは、IoT Hub デバイス ツイン メッセージを使用してデバイスに設定されます。
  7. その後、Azure Sphere によって、目標温度を満たすように HVAC 動作モードが設定されます。

リアルタイム コアのセキュリティと通信

高レベル アプリケーションと同様に、リアルタイム アプリケーションは既定でセキュリティ保護されており、アプリケーションに必要なすべてのリソースを宣言する必要があります。 これには、周辺機器へのアクセス、リアルタイム コアで通信できるアプリケーションが含まれます。 通信するには、複数のコアで実行されるアプリケーションが、対応するコンポーネント ID を使用して構成されている必要があります。

リアルタイムのコア間の機能

通信するには、複数のコアで実行されるアプリケーションが、対応するコンポーネント ID を使用して構成されている必要があります。

高レベル アプリケーションのコンポーネント ID は、app_manifest.json ファイルにあります。

{
  "SchemaVersion": 1,
  "Name": "AzureSphereIoTCentral",
  "ComponentId": "25025d2c-66da-4448-bae1-ac26fcdd3627",
  ...
}

リアルタイムの app_manifest.json ファイルの AllowedApplicationConnections プロパティは、Azure Sphere 高レベル アプリケーションのコンポーネント ID に設定されます。

{
    ...
    "AllowedApplicationConnections": [ "25025d2c-66da-4448-bae1-ac26fcdd3627" ]
    ...
}