CHRE架构简介

一、CHRE定义与用途

CHRE全称为Context Hub Runtime Environment,是Google提供的在低功耗处理器上运行应用程序而实现的一个通用软件平台。CHRE具有简单、标准化、嵌入式支持友好的特点,应用在需要始终在线运行或需要频繁上下文交互,并且算力要求不高的场景,广泛运用在Android系统开发,为传感器、蓝牙、Wifi、音频等模块提供了友好的API支持。

二、CHRE架构总览

82056518e0efcc8981eb8cd20fc65137.png

图 1. CHRE 框架架构

从上层至底层,CHRE提供了APP与底层硬件直接交互的能力。APP申请ACCESS_CONTEXT_HUB权限后,可以通过ContextHubManager与Contexthub Hal交互;Contexthub Hal与CHRE底层通过Socket通信与FastRpc交互,达到控制Nanoapp(使用CHRE API运行在CHRE环境的应用)的效果。通过层层调用最终实现APP与底层硬件的通信。

1.代码目录介绍

  • ContextHubManager

位于core/java/android/hardware/location目录,提供APP调用的API

  • ContextHub Hal

位于system/chre/host/hal_generic目录,有承上启下的作用

  • CHRE

位于system/chre目录,CHRE的核心代码

0eb5d7f406227b3bd80872ef99c33dbe.png

图 2. CHRE 代码目录

Apps: 公共 Nanoapp 源代码,包括展示如何使用 CHRE API 的示例 Nanoapp,以及用于验证 API 功能的测试 Nanoapp

Build: CHRE的编译Makefile文件

Chpp: Context Hub Peripheral Protocol, Context Hub外围设备协议源代码

Chre api: CHRE暴露的Api接口,隶属于CHRE Framework部分,提供了Nanoapp/Sensor/Wlan 等模块的官方定义API接口

Core: CHRE框架核心代码,包含了Nanoapp事件处理的核心代码,适用于各个平台

Doc: 开发文档

External: Chre依赖的外围代码。如Kiss_fft

Host:支持 CHRE 实现但在应用程序处理器(“主机”)上运行的参考代码,例如 Context Hub HAL

Pal: Platform Abstraction Layer (PAL),平台抽象层

Platform:CHRE在特定平台上的实现相关代码

三、AP与CHRE间通信

1.App与Framework通信

b75ee35bbdaff669788be7a2763dc48d.png

图 3. ContextHubManager类图

AP通过ContextHubManager与CHRE之间通信,具体通信接口如下:

getContextHubInfo:通过Handle获取指定的ContextHub信息

loadNanoApp:在指定Handle的ContextHub加载指定的Nanoapp

unloadNanoApp:卸载指定的Nanoapp

getNanoAppInstanceInfo:获取Nanoapp实例的信息

findNanoAppOnHub:在系统上查找指定的Nanoapp

sendMessage: 向指定的Nanoapp发送信息

getContextHubs: 查询可用的ContextHub对象

createClient:在指定的ContextHub创建service的Client, 并注册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的Callback。具体流程如下图:

f78671e7f46050dac887a1da1534f7f2.png

图 5. APP调用流程

2.Framework到Hal通信

e8da818d3f76290a16766a5b0fac533a.png

图 6. Contexthub Hal

Contexthub Hal层代码存放在system/chre/host/hal_generic。以V1_2为例,在V1_2/service.cc的main函数中,将Contexthub Hal注册为服务; 开放Hal层的能力到Framework层。

b82c5b457fef5fa6a97a03540072bfd8.png

图 7. 初始化拿取Hal层实例

在ContextHubSerivce构造时, 就会通过getContextHubWrapper拿到Hal的服务handle, 并通过handle初始化ContextHubClientManager及ContextHubTransactionManager,这两个类中与Hal的通信均通过调用此handle实现。如loadNanoAppOnHub:

eb1735e9c9a19e5dc4d05aeccfb9e857.png

图 8. loadNanoapp 示例

3.Hal与CHRE通信

9f66992698c57c46361183832f46607c.png

图 9. Hal与CHRE通信

以LoadNanoAPP为例,Hal层注册成为Socket的Client,CHRE Deamon注册成为Serivce,最后通过Fastrpc deamon与CHRE进行通信,将事件下发到CHRE。

通过上文的分析,可以得知CHRE框架有稳定的通路提供到APP,与底层的Nanoapp进行通信。

四、 CHRE NanoApp运行机制

1. NanoApp实现

单个NanoApp必须实现nanoappStart()nanoappHandleEvent()和nanoappEnd()接口, 并完成NanoAPP声明。以Sensor模块(system/chre/apps/sensor_world/sensor_world.cc)为例:

  • NanoAPP声明:

2cbce2b26cfccdbd4d00bcec42042aaa.png

传入名称、id、版本号、权限参数完成声明。

  • NanoappStart实现

90358dbce5362abe707d2f2c226b07aa.png

主要完成资源的申请、Sensor的初始化动作。

  • nanoappHandleEvent实现

f8fd676c5f875eee409595ea74f2d316.png

处理其他APP发送的事件,对于Sensor模块,完成了数据接收处理,以及Sensor打开、关闭、采样率配置、及Timer事件处理。

  • NanoappEnd实现

877a61e17f232518a4d46280a08b68cf.png

NanoApp生命周期结束时的处理。

2.NanoApp初始化与事件处理

128fffceb04d6250755184404c02f506.png

这里以Freertos上为例。Freertos init的时候,创建了一个Task执行chreThreadEntry函数,函数中调用到了EventLoopManagerSingleton的初始化,并且将StaticNanoApp加载。做完上述操作后,这个Task会循环执行Event处理函数,将事件队列中的事件取出并派发到相对应的Nanoapp,并由NanoApp的HandleEvent进行事件处理。相关细节见EventLoop::run()。

五、总结

本文介绍了CHRE的基本流程,包括AP端与CHRE的通信流程、CHRE运行机制、Nanoapp实现等内容,可以为学习和调试CHRE提供参考。

六、参考资料

1.https://source.android.google.cn/devices/contexthub 《上下文中心运行时环境 (CHRE)》

0c564c1635473fa370f466d4599d7827.gif

长按关注内核工匠微信

Linux内核黑科技| 技术文章 | 精选教程

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

内核工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值