Copyright 2017-2023 Moddable Tech, Inc.
改訂: 2023年6月28日
最小限のMCUでJavaScriptを使用するには、非常に軽量なランタイムが必要です。ランタイムを小さく保つ明確な方法の1つは、実行されるアプリケーションに必要な機能のみを含めることです。例えば、現代のLinux、macOS、またはWindowsのディストリビューションには、ユーザーが接続する可能性のあるさまざまなディスプレイをサポートするためのドライバが含まれていますが、効率的なMCUディストリビューションには、デバイスの内蔵ディスプレイをサポートするための単一のディスプレイドライバのみが含まれています。その結果、各デバイス構成(MCU + ディスプレイ + ネットワーク機能など)は独自のものとなります。
無数のハードウェア構成とそれをサポートするソフトウェアフレームワークは可能ですが、実際にはいくつかの構成が一般的に使用されています。例えば、Moddable ZeroはESP8266 Wi-FiモジュールとILI9341ディスプレイコントローラー、QVGAディスプレイ、およびXPT2046抵抗膜式タッチスクリーンコントローラーを組み合わせています。マニフェストはファームウェアに含めるモジュールを定義します。マニフェストには、これらのモジュールをどのようにインスタンス化するか、その構成、またはJavaScriptのグローバル変数にどのように表示されるかについての指示は含まれていません。
いくつかのデプロイメントでは、設定とインスタンス化がアプリケーションによって行われます。しかし、多くの場合、特定のハードウェア構成に対するこれらのタスクをアプリケーション間で共有することは便利です。これは、サンプルコードの場合に当てはまり、できるだけシンプルで焦点を絞ったものにする必要があり、デフォルトの設定を受け入れることができるデバイスアプリケーションの初期バージョンにも当てはまります。
設定とインスタンス化は、1つ以上のセットアップモジュールで実装される場合があります。セットアップモジュールは、setup/
で始まるモジュールが指定されていることで識別されます。すべてのセットアップモジュールはメインモジュールの前に実行され、メインモジュールが必要とする環境を準備します。例えば、Moddable Zeroには2つの主要なセットアップモジュールがあります。setup/network
モジュールはWi-Fi接続を確立し、IPアドレスを取得し、リアルタイムクロックを設定します。setup/piu
モジュールはディスプレイとタッチドライバをインスタンス化し、それらをグローバル変数screen
にバインドします。
通常、アプリケーションはセットアップモジュールを明示的にマニフェストに含める必要はありません。必要なマニフェストによって含まれるためです。例えば、example/manifest_network.json
マニフェストにはsetup/network
が含まれ、example/manifest_piu.json
マニフェストにはsetup/piu
が含まれています。
セットアップの実装は簡単です。モジュールは実行するための単一の関数をエクスポートします。この関数は起動時に呼び出されます。複数のセットアップモジュールがある場合、それらが呼び出される順序は保証されません。
セットアップ関数は、セットアップが完了したときに呼び出す done
関数という単一の引数を受け取ります。done
関数は、ネットワーク接続の確立などの非同期操作を実行するために使用されます。
export default function (done) {
setupOperation();
done();
}
RAMの使用を最小限に抑え、起動時間を短縮するために、メインモジュールおよび任意のセットアップモジュールはプリロードする必要があります。
- セットアップモジュールのアイデアは、Arduinoアプリケーションモデルのセットアップ関数に緩やかに基づいています。
- シミュレータは、メインモジュールを実行する前に画面のグローバル変数を初期化するなど、セットアップの作業を暗黙的に実行します。
- セットアップモジュールは、最初の(メインの)仮想マシンでのみ実行されます。例えば、ワーカーを使用する場合、セットアップモジュールはワーカー内では実行されません。
- ホストによって提供されるセットアップモジュールを削除することが有用な場合があります。例えば、デフォルトの
setup/network
モジュールを置き換えて、アプリケーションスクリプトがWi-Fi接続を自分で管理できるようにする場合です。これは、マニフェストの"~"
オプションを使用して実現されます。
"modules": {
"~": [
"$(MODDABLE)/build/devices/esp32/setup/network"
]
}