CHRE アーキテクチャの紹介

1.CHREの定義と使い方

CHRE の正式名称は Context Hub Runtime Environment です。これは、低電力プロセッサでアプリケーションを実行するために Google が提供する汎用ソフトウェア プラットフォームです。CHRE には、シンプルさ、標準化、および組み込みサポートの使いやすさという特徴があります. 常にオンラインである必要があるか、頻繁なコンテキスト対話と低い計算能力要件を必要とするアプリケーションの Android システム開発で広く使用されています. モジュールはフレンドリーな API サポートを提供します.

2. CHRE アーキテクチャの概要

82056518e0efcc8981eb8cd20fc65137.png

図 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 のコア コード

0eb5d7f406227b3bd80872ef99c33dbe.png

図 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. アプリがフレームワークと通信する

b75ee35bbdaff669788be7a2763dc48d.png

図 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 と対話できます。

cfcd2fe53c1b66bbcdfb227da753a2fb.png

図 4. ClientCallback コールバック関数

APP が CreateClient を介して Client と Callback を登録すると、Nanoapp のステータス変更の Callback を取得できます。NanoApp によって送信されたメッセージ、および Aborted/Loaded/Unloaded/Enabled/Disabled のコールバックを含みます。具体的なプロセスは次のとおりです。

f78671e7f46050dac887a1da1534f7f2.png

図 5. APP 呼び出しプロセス

2.Hal通信の仕組み

e8da818d3f76290a16766a5b0fac533a.png

図 6. Contexthub ホール

Contexthub Hal レイヤー コードは、system/cher/host/hal_generic に格納されます。V1_2 を例にとると、V1_2/service.cc の main 関数で、Contexthub Hal をサービスとして登録し、Hal 層の機能を Framework 層に開放します。

b82c5b457fef5fa6a97a03540072bfd8.png

図 7. Hal レイヤー インスタンスの初期化とフェッチ

ContextHubSerivce が構築されると、getContextHubWrapper を通じて Hal のサービス ハンドルが取得され、そのハンドルを通じて ContextHubClientManager と ContextHubTransactionManager が初期化され、このハンドルを呼び出すことで、この 2 つのクラスでの Hal との通信が実現されます。loadNanoAppOnHub など:

eb1735e9c9a19e5dc4d05aeccfb9e857.png

図 8. loadNanoapp の例

3. Hal が CHRE と通信する

9f66992698c57c46361183832f46607c.png

図 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 ステートメント:

2cbce2b26cfccdbd4d00bcec42042aaa.png

名前、ID、バージョン番号、および許可パラメーターを渡して、ステートメントを完成させます。

  • NanoappStart の実装

90358dbce5362abe707d2f2c226b07aa.png

主にリソースの適用とセンサーの初期化を完了します。

  • nanoappHandleEvent の実装

f8fd676c5f875eee409595ea74f2d316.png

他の APP から送信されたイベントを処理します。センサー モジュールの場合は、データ受信プロセス、センサーの開閉、サンプリング レートの設定、およびタイマー イベントの処理を完了します。

  • NanoappEnd の実装

877a61e17f232518a4d46280a08b68cf.png

NanoApp ライフ サイクルの終了時の処理。

2. NanoApp の初期化とイベント処理

128fffceb04d6250755184404c02f506.png

ここでは、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)」

0c564c1635473fa370f466d4599d7827.gif

長押しでカーネル職人のWeChatをフォロー

Linux Kernel Black テクノロジー | 技術記事 | 注目のチュートリアル

おすすめ

転載: blog.csdn.net/feelabclihu/article/details/128681454