sensor 架构在整体设计中的应用

作者: admin 分类: 最新资讯 发布时间: 2022-09-05 09:31

轻云软件库9月5日消息,这些设备有几个相似的特点,数据量少,实时性强,结构相对简单。

2.整体架构首先,从整体来看,Sensor的架构可以用下图来说明。

有些方法把SensorService归为框架的一部分,但这里把它分成单独的一层,以突出服务的重要性。

传感器的整体逻辑非常清晰,有一个控制流(蓝色向下箭头)和一个数据流(红色向上箭头)。控制主要包括切换传感器和设置传感器的采样频率,数据流是数据从驱动到应用的全过程。

3.初始化

在系统初始化过程中,会对SensorService和HAL层(硬件抽象层)进行初始化。SensorService连接框架和HAL,通过动态链接加载HAL层模块(HAL层以共享文件的形式存在)。

//动态链接匹配

硬件_获取_模块(传感器_硬件_模块_ID,

(硬件模块常量* *)& amp;mSensorModule);//服务

struct sensors_module_t my_hal = {

常见:{

id:传感器_硬件_模块_ID,

},

获取传感器列表:…,

};//哈尔

总之,总结这个过程的目的是,通过动态链接,服务可以调用HAL层的功能,方便将控制权转移给HAL层,从HAL获取数据。这个动作完成后,服务调用my_hal中的open函数。HAL可以在open动作中完成初始化,比如检测系统中存在的传感器,保存每个传感器的信息,维护所有传感器的列表。

HAL初始化后,服务可以调用get_sensors_list来获取系统支持的所有传感器。一些物理传感器合并后,其他传感器可以虚拟化,服务也会处理虚拟传感器。这部分暂且不介绍。

总之,与HAL建立联系(动态链接),初始化HAL(打开),获取传感器信息(get_sensors_list)。

4.控制流

控制,一个是开关,一个是频率。Android默认支持四种采样频率。

名字

频率

传感器_延迟_最快

设备的最大采样频率

传感器_延迟_游戏

50赫兹

传感器_延迟_用户界面

30HZ

传感器_延迟_正常

5HZ

除了这四个频率,用户还可以指定一个特定的频率。控制过程如下。

从控制APP注册监听器开始,熟悉面向对象编程的童鞋应该猜到这是一种观察者设计模式,事实上也确实如此。注册侦听器的直接操作是enable和setDelay (unregisterListener对应于disable操作)。服务和APP不在同一个进程中执行,框架传递的控制需要通过进程通信传递给服务。使用了Binder(Binder几乎贯穿了Android系统的每个模块,后面会介绍)。服务是唯一的,可以有无限的app,服务就是为他们服务的。这样设计的原因很明显——保证单一控制:硬件是唯一的(比如某个加速度传感器),它的控制也应该是唯一的,所以不应该是每个APP单独控制。比如enable操作,如果一个APP已经打开了设备,那么你只需要将引用计数增加1,并不会真正触发被驱动的操作;禁用操作。如果引用计数大于1,说明目前除了APP还有其他用户,所以不会触发驾驶操作。

它与服务HAL层属于同一个进程。Service调用HAL层的函数,HAL找到对应的文件节点,根据不同的用途写入不同的值来触发驱动操作。根据驱动得到的命令,最终实现读写设置寄存器的控制流程。

总之,应用程序启动控制流,逐层传递,最后读写寄存器。

5.数据流

数据由硬件产生并最终应用,流程图如下。

驱动程序负责收集数据(中断或轮询模式)并通过输入子系统报告数据(有些制造商选择使用IIO)。HAL层使用poll监控输入节点,数据到达时poll返回,然后读取数据。服务部分有一个线程,可以理解为一个循环,不断轮询poll HAL层的数据。服务收到数据后会做一些处理(比如计算虚拟传感器的数据),然后通过socket将数据发送给APP进程。在应用程序收到数据后,它会遍历当前注册的侦听器,并通知它们观察者模式已经完成。

数据流和控制流一样,仍然是对应多个app的服务,服务会向多个app发送数据。

说到这里,有一个地方需要优化。目前,收到数据后,Service会通知所有注册了监听器的app。这个过程不是没有代价的。除了正常的代码执行,它还涉及进程通信。如果在APP中加入感兴趣的传感器类型列表(位图也可以),只有列表中传感器的数据会通知APP进程,效率会高很多。

6.在各个层面介绍形象。总之,整个传感器的软件架构就像是用水泵抽水灌溉。服务扮演的是电机的角色,不断产生抽水的动力,输送到目的地(APP)。司机扮演的是水泵的角色,负责做好抽水和抽水的必要准备。HAL就像是连接电机和水泵的管道。

驱动程序在逻辑上可以分为三个部分,如下图所示。部分支持自身功能,i2c读写,中断或轮询处理。第二部分是sysfs文件节点,接受HAL层传下来的操作,通过i2c读写完成任务。第三部分是输入子系统(注意是Linux内核的输入子系统,不是Android的输入系统),负责数据上报。

总之,驱动的任务就是正常工作,完成控制操作,产生数据。

HAL层的作用是屏蔽硬件差异,传递控制和数据。

传感器本身就是一个线程(Thread是它的父类),循环执行threadLoop(Android机制)。这个函数一方面负责轮询数据,另一方面负责数据的后处理和发送。

说到框架,问题很简单,简单的函数调用(最多jni)。

本文只解释了整个框架,并没有列出详细的代码。希望给全球介绍一下。

博客到底浅,你只能在代码上看到真知。如果你有什么问题或者想介绍下一篇博客的哪一部分,请问题请再评论区留言。

标签云