1.CHREの定義と使い方
CHRE の正式名称は Context Hub Runtime Environment です。これは、低電力プロセッサでアプリケーションを実行するために Google が提供する汎用ソフトウェア プラットフォームです。CHRE には、シンプルさ、標準化、および組み込みサポートの使いやすさという特徴があります. 常にオンラインである必要があるか、頻繁なコンテキスト対話と低い計算能力要件を必要とするアプリケーションの Android システム開発で広く使用されています. モジュールはフレンドリーな API サポートを提供します.
2. CHRE アーキテクチャの概要
図 1. CHRE フレームワークのアーキテクチャ
上位層から最下位層まで、CHRE は APP が基盤となるハードウェアと直接対話する機能を提供します。APP が ACCESS_CONTEXT_HUB パーミッションを申請した後、ContextHubManager を介して Contexthub Hal と対話できます; Contexthub Hal と CHRE の最下層は、ソケット通信を介して FastRpc と対話し、Nanoapp (CHRE API を使用して実行されるアプリケーション) を制御する効果を達成します。 CHRE環境)。APP と基盤となるハードウェア間の通信は、レイヤーごとの呼び出しによって最終的に実現されます。
1.コードディレクトリの紹介
ContextHubManager
core/java/android/hardware/location ディレクトリにあり、APP によって呼び出される API を提供します
ContextHub ハル
system/cher/host/hal_generic ディレクトリにあり、前と次の間のリンクとして機能します。
クレ
system/cher ディレクトリにあり、CHRE のコア コード
図 2. CHRE コード ディレクトリ
アプリ: CHRE API の使用方法を示すサンプル Nanoapps を含む公開 Nanoapp ソース コード、および API 機能を検証するための Nanoapps のテスト
ビルド: CHRE の Makefile をコンパイル
Chpp: Context Hub Peripheral Protocol、Context Hub Peripheral Protocol ソース コード
Chre api: CHRE フレームワーク部分に属する CHRE によって公開される Api インターフェイスは、Nanoapp/Sensor/Wlan などのモジュールの公式に定義された API インターフェイスを提供します。
コア: Nanoapp イベント処理のコア コードを含む CHRE フレームワークのコア コードで、すべてのプラットフォームに適用できます。
Doc: 開発ドキュメント
外部: Chre が依存する周辺コード。Kiss_fftなど
ホスト: CHRE 実装をサポートするが、Context Hub HAL などのアプリケーション プロセッサ (「ホスト」) 上で実行される参照コード
Pal: プラットフォーム抽象化レイヤー (PAL)、プラットフォーム抽象化レイヤー
プラットフォーム: 特定のプラットフォームでの CHRE の実装関連コード
3. AP と CHRE 間の通信
1. アプリがフレームワークと通信する
図 3. ContextHubManager クラス図
AP は ContextHubManager を介して CHRE と通信します。具体的な通信インターフェイスは次のとおりです。
getContextHubInfo: 指定された ContextHub 情報をハンドルを介して取得します
loadNanoApp: 指定されたハンドルの ContextHub に指定された Nanoapp をロードします
unloadNanoApp: 指定された Nanoapp をアンロードします
getNanoAppInstanceInfo: Nanoapp インスタンス情報を取得する
findNanoAppOnHub: システムで指定された Nanoapp を検索します。
sendMessage: 指定された Nanoapp にメッセージを送信します
getContextHubs: 利用可能な ContextHub オブジェクトのクエリ
createClient: 指定した ContextHub にサービスのクライアントを作成し、Callback を登録する
ContextHubManager は API 呼び出しのみを提供し、関数関数の特定の実装は引き続き ContextHubService にあります。APP は、getContextHubInfo/getContextHubs を介して ContextHubs 情報を取得し、loadNanoApp/unloadNanoApp/findNanoAppOnHub を介して Nanoapp と対話できます。
図 4. ClientCallback コールバック関数
APP が CreateClient を介して Client と Callback を登録すると、Nanoapp のステータス変更の Callback を取得できます。NanoApp によって送信されたメッセージ、および Aborted/Loaded/Unloaded/Enabled/Disabled のコールバックを含みます。具体的なプロセスは次のとおりです。
図 5. APP 呼び出しプロセス
2.Hal通信の仕組み
図 6. Contexthub ホール
Contexthub Hal レイヤー コードは、system/cher/host/hal_generic に格納されます。V1_2 を例にとると、V1_2/service.cc の main 関数で、Contexthub Hal をサービスとして登録し、Hal 層の機能を Framework 層に開放します。
図 7. Hal レイヤー インスタンスの初期化とフェッチ
ContextHubSerivce が構築されると、getContextHubWrapper を通じて Hal のサービス ハンドルが取得され、そのハンドルを通じて ContextHubClientManager と ContextHubTransactionManager が初期化され、このハンドルを呼び出すことで、この 2 つのクラスでの Hal との通信が実現されます。loadNanoAppOnHub など:
図 8. loadNanoapp の例
3. Hal が CHRE と通信する
図 9. Hal が CHRE と通信する
LoadNanoAPP を例にとると、Hal 層は Socket Client として登録し、CHRE デーモンは Service として登録し、最終的に Fastrpc デーモンを介して CHRE と通信し、イベントを CHRE に送信します。
上記の分析を通じて、CHRE フレームワークには、APP に提供し、基盤となる Nanoapp と通信するための安定したチャネルがあることがわかります。
4. CHRE NanoApp の動作メカニズム
1. NanoApp の実装
単一の NanoApp は、nanoappStart() nanoappHandleEvent() および nanoappEnd() インターフェースを実装し、NanoAPP ステートメントを完了する必要があります。例としてセンサー モジュール (system/chre/apps/sensor_world/sensor_world.cc) を取り上げます。
NanoAPP ステートメント:
名前、ID、バージョン番号、および許可パラメーターを渡して、ステートメントを完成させます。
NanoappStart の実装
主にリソースの適用とセンサーの初期化を完了します。
nanoappHandleEvent の実装
他の APP から送信されたイベントを処理します。センサー モジュールの場合は、データ受信プロセス、センサーの開閉、サンプリング レートの設定、およびタイマー イベントの処理を完了します。
NanoappEnd の実装
NanoApp ライフ サイクルの終了時の処理。
2. NanoApp の初期化とイベント処理
ここでは、Freertos を例に取ります。Freertos が init になると、chreThreadEntry 関数を実行するタスクが作成されます。これにより、EventLoopManagerSingleton の初期化が呼び出され、StaticNanoApp がロードされます。上記の操作が完了すると、Task はイベント処理関数をループで実行し、イベント キュー内のイベントを取り出して対応する Nanoapp にディスパッチし、NanoApp の HandleEvent がイベントを処理します。詳細については、EventLoop::run() を参照してください。
V. まとめ
この記事では、AP と CHRE 間の通信プロセス、CHRE の動作メカニズム、Nanoapp の実装など、CHRE の基本プロセスを紹介します。CHRE の学習とデバッグの参考になります。
6.参考文献
1. https://source.android.google.cn/devices/contexthub 「コンテキスト センター ランタイム環境 (CHRE)」
長押しでカーネル職人のWeChatをフォロー
Linux Kernel Black テクノロジー | 技術記事 | 注目のチュートリアル