完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
` 上一节课我们对SensorManager做了一个简单地分析,它主要是对上层的应用提供Sensor的所有服务,对下他要连接Sensorservice。那么这一期我们对Sensorservice做一个简单地分析,下面我们来看一下Sensorservice的一个初始化过程. 首先我们要确定Sensorservice是在我们SystemServer初始化的时候就会首先调用nativeinit的方法把Sensorservice给初始化,在Sensorservice初始化的时候,他会将自己添加到我们的ServiceManager中,这样我们的SensorManager才能够从我们的ServiceManager中得到我们的Sensorservice。当我们Sensorservice初始化的时候首先会创建一个SensorDevice的对象,这个对象是我们service和Hal层对接的一个对象,在这个对象中会有一些相关的方法,去和我们的Hal层进行对接,通过SensorDevice可以得到我们Sensor Hal层的一个操作函数集,当我们拿到函数集以后,就可以对Hal层进行一个初始化,当我们SensorDevice拿到一个Hal层操作集之后,他就会通过函数集的一些方法,得到我们系统支持sensor的个数,以及sensor的操作接口。这样的话我们就可以通过service就可以对我们Hal层中的sensor来进行操作了。那么我们的SensorService就会调用sensorlist的函数,将我们本地所支持的sensor的个数以及种类,添加到我们Sensorservice中的sensorlist中。这样我们就可以拿到系统所有的sensor。当我们拿到这些sensorlist之后呢,我们会根据系统的一些反馈来创建我们虚拟的sensor,这个创建虚拟sensor是这样的,首先如果说我们系统支持G sensor,那么他会模拟出角度sensor和其他的sensor,如果我们系统支持陀螺仪,不支持G sensor的话,那么他会使用陀螺仪来模拟出一个G sensor,这个模拟的精度肯定不如实际的精确。那么当我们把所有的sensor注册完成之后,就会等待我们SensorManager的链接,然后去启动线程,分发从底层传上来的数据。下面我们来看一下SensorService初始化的一个大概框架图 首先是SystemServer创建了我们的SensorServer,他在被创建的过程中继承了一个servermanager,一个类似于他的类,这样的类初始化的时候会把自己添加到我们的ServerManager中,途中三个绿色的方框就是我们SensorServer的节点,这个里面还有一个serverList,然后当我们SensorServer初始化的时候,还会将我们的SensorHal层给挂上,此时还会动态的load本系统所添加的sensor的库,因为我们这个底层Hal层,对server这层所提供的只有一个库,这个接口都是标准的,我们只需要生成一个库,然后就可以对上层来做支撑,而我们这个libsensor.so库,他下边有一个Sensor_opts,也就是我们sensor的一个函数操作集,这个函数操作集连着我们驱动中的Sensor设备,而我们sensor驱动设备就会连着我们实体的sensor。当我们SensorServer初始化完成之后,我们的SensorManager就会通过我们的ServerManager来得到我们的SensorServer这个服务。他有联系的服务包括我们的SystemServer、ServerManager、SensorManager、以及我们底层的Hal。下面我么再来看一下SensorService的大概结构 我们的SensorService继承了我们的BinderService,以及我们的BnSensorServer以及Thread。当我们SensorService初始化的时候,会调用我们BinderService的方法,自动的将我们本身添加到serviceManger中,这样的话我们的SensorManager才能够通过ServiceManager得到我们的SensorService,那么下面我们再来分析一下SensorService的一个初始化过程:首先在它里面会调用一个SensorDevice的一个类,这个类里面会实例化一个对象,当这个对象初始化的时候,他首先会去动态的load我们Hal层的库,load的方法就是hw_get_module(),通过这个方法我们就能得到我们系统默认的sensor的库,而这个库就是提供我们底层操作函数集的库,然后我们会得到一系列的sensor的结构,最终我们会在这里有一个sensor_module_methods,然后拿到一个open_sensors,当我们SensorDevice初始化的时候会调用我们的open_sensors,这个open_sensors就会返回我们Hal层对sensor具体操作的函数,也就是Poll()、close()、activate()、setDelay()这四个函数,而他们又会返回给我们的mSensorDevice。当我们调用SensorDevice对象中的一些方法,比如getsensorlist的时候,他就会通过这个mSensorDevice的方法,来将我们底层支持sensor的个数返回给我们的SensorService,然后SensorService将我们底层所支持的sensor保存到我们mSensorList中,这样我们的SensorService就能拿到底层所有的物理sensor,然后如果说我们支持陀螺仪,但是我们上面不支持一些g sensor,那么我们会通过sensor的一些具体的类型,添加我们虚拟的sensor,并且将虚拟sensor添加到我们mVirtualSensorList中,这样的话我们的SensorService就完成了一个初始化,在初始化的时候还会启动我们的threadLoop,那么剩下的SensorService的工作就是用来监听我们的sensorManger对我们SensorService的链接情况。如果说每一个sensorManger链接了我们的SensorService,这个时候我们首先会通过SensorService所提供的方法来创建一对无连接的套接字,这样我们的SensorManger和我们的SensorService建立了连接,可以使用这对套接字来进行通讯,数据交互,然后在这里还有一个threadLoop方法,他继承的是Thread,他调用我们mSensorDevice中的Poll()方法,将我们底层sensor的一个数据,不断地获取,获取完之后,再通过我们的sendEvents发送给我们的sensorManger,然后他再向上发送,传递给我们的APP,这样我们的APP就能够拿到我们底层的一个数据,然后见这些数据做处理去完成自己的应用,这就是我们SensorService一个大概的结构。 ` |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
芯灵思SinlinxA33开发板Linux内核workqueue(附实测代码)
11891 浏览 0 评论
芯灵思SinlinxA33开发板Linux内核 tasklet 机制(附实测代码)
12551 浏览 0 评论
芯灵思Sinlinx A33开发板 Linux内核等待队列poll ---阻塞与非阻塞
34827 浏览 0 评论
芯灵思Sinlinx A33开发板Linux中断编程 3-应用程序
34760 浏览 0 评论
38840 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:14 , Processed in 1.178204 second(s), Total 67, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号