第一篇 7月份答辩总结
1 Android启动代码放在那个目录?
Bootloader代码存放在bootable目录下;
内核启动代码在/kernel/arch/boot;
Android入口system/core/rootdir;
2 Adb remount有什么作用?
重新挂载文件系统system分区由只读为可读写。
3 Android.mk中如何控制编译的内核镜像版本是user版还是eng版?
添加LOCAL_MODULE_TAGS := user eng optional test
其中,
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
4 简单介绍设备驱动模型?设备与驱动哪一个先注册?驱动与设备有哪些匹配方式?
(1) 总线设备驱动模型其实现主要是基于kobject和sysfs等机制。sysfs将kobject层次关系表现出来,使得用户空间对这些层次关系可见。
kobject被嵌入于其他类型如bus,devices,drivers中,这些结构通过kobject连接起来,形成了一个树状结构。在内核中注册的每个kobject对象对应sysfs文件系统中的一个目录。struct kset可以看成在kobject上的扩展,它包含一个kobject的链表,可以方便地表示sysfs中目录与子目录的关系。目录中每个文件代表kobject的属性。Kobject层次关系如图1,
图1 Kobject层次关系
(2) 驱动模型程序开发主要是理解三个元素:总线、设备、驱动的关系。
在系统每注册一个设备的时,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时,会寻找与之匹配的设备,而匹配由总线完成。一个现实的Linux设备和驱动通常都需要挂接在一种总线上。设备与驱动的关联通过总线的match()方法进行匹配,驱动挂载总线时与所有设备进行匹配,设备挂载总线时与所有的驱动进行匹配,所以驱动和设备的挂载无先后之分。匹配成功后会通过调用驱动的probe()方法来初始化设备。
图2 bus、device与driver关系
5 当间隔很短时间(小于马达单次工作时间)连续触发两次马达震动,马达会怎样工作?
高通自带的马达设备属于timed_output类设备,马达驱动实现借助两个工作队列实现,一个开启马达震动,另一个关闭马达震动;当触发一个马达工作后,一方面取消上一个定时器hrtimer,开始新的定时器计时,另一方面调度马达工作队列开始使能震动,当定时器定时时间到了之后,调度关闭马达工作队列,关闭马达震动。
因此,当第一次触发马达开始震动后,在其还没有停止震动前再次触发马达震动,马达会以第二次传入的时间长度工作,直到时间到期,关闭马达。
第二篇 8月份答辩总结
1 光-距离传感器是如何休眠的?
Android在标准Linux睡眠唤醒的机制上改进为wake_lock唤醒锁机制、early_suspend预挂起机制和late_resume迟唤醒机制。
当Android启动一个应用程序的时候,它都可以申请一个wake_lock唤醒锁,每当申请成功之后都会在内核中注册一下,当应用程序在某种情况下释放wake_lock的时候,会注销之前所申请的wake_lock。特别要注意的是:只要是系统中有一个wake_lock的时候,系统此时都不能进行睡眠。但此时各个模块可以进行early_suspend。当系统中所有的wake_lock都被释放之后,系统就会进入真正的Linux kernel的深度睡眠步骤。
进入Kernel休眠后,主要分三个主要的步骤:(1)冻结用户态进程和内核态任务;(2)调用注册的设备的suspend的回调函数,其调用顺序是按照驱动加载时的注册顺序。(3)休眠核心设备和使CPU进入休眠态冻结进程是内核把进程列表中所有的进程的状态都设置为停止,并且保存下所有进程的上下文。
光-距离传感器设备就是上述第二步中回调对应的tmd2772中taos_suspend()函数的;首先挂起设备发生在深度休眠的的过程中,入口函数在dpm_suspend_start(),该函数会按照设备注册的顺序反过来遍历dpm_list链表,分prepare()和suspend()两步完成对设备的挂起动作。
驱动中taos_suspend()函数调用enable_irq_wake()使得该设备可以中断唤醒。
2 我们的手机中哪些用到了陀螺仪的功能?陀螺仪应该布置在手机中什么位置?
(1)常用到陀螺仪功能有:
GPS的惯性导航;
手机翻转时屏幕翻转;
照相时防抖动;
个性功能里面的甩动手机切歌;
晃动清除内存等;
(2)陀螺仪一般位于手机前1/3部分中部,从而较好地得到较准确的传感器值,也可以避免在边缘容易损坏。
3 为什么SensorManger与SensorService使用Binder进行通信?
Linux系统中,是以进程为单位分配与管理资源,出于保护机制,进程之间不能直接访问另外一个进程资源。进程之间为了相互协作,需要进行通信,常用的IPC有管道、共享内存、信号和socket等。但是Binder相比以上通信方式,具有快速、开销低、安全等优点。
Binder通信基于C/S架构,本质是将服务端进程映射到客户端进程中,代码框架如图所示,
图3 Binder框架
此时SensorManger与SensorService分别对应Client与Server端,SensorService运行在独立进程中,其中SensorManager负责管理创建的SensorService客户端。SensorManger与SensorService需要跨进程通信,因此使用了Binder通信机制。
4 几个应用同时使用光传感器,当当前应用改变光Sensor的采样频率时,其它应用会不会改变?
写了两个简单apk进行测试,假设分别命名为LightNormal与LightFast,工作频率分别是Normal与Fastest。操作如下,
(1)
分屏后首先打开LightNormal,其工作在Normal模式,此时再打开LightFast,则两个应用都工作在Fastest模式;
(2)
首先打开LightFast,其工作在Fastest模式,再打开LightNormal,则两个应用都工作在Normal模式;
结论是,假设有两种不同的app分别需要设置光传感器的采样数据频率时,两种app获取到的数据采样频率会随着当前应用改变而改变,即两种app一起工作时获取频率始终是一样的。
上面的工作逻辑是有问题的,经咨询李翠霞师姐,正确的逻辑是:
假设多个应用同时工作,底层应该始终按照最高的采样频率上报数据,因此如果当前应用的采样频率设置高于其它,而且其它应用不经过抽取获取数据,则其它应用的采样频率会被设为其中最高的。
5 Batch模式中,如果Timeout时间未到,但又需要将事件上报,怎么操作?batch模式允许休眠,是让ADSP休眠还是什么休眠?
调用flush()将强行把FIFO中数据立即上报,该操作是同步的,对应传感器收到META_DATA_FLUSH_COMPLETE事件,如果FIFO为空,flush()返回0 。
Batch的优势在于低功耗,之所以支持低功耗,就是其ADSP继续监听收集传感器事件的同事,支持让SOC去休眠。直到timeout到期或者调用了flush(),唤醒SOC。
6 当物体接近距离传感器的距离大于high门限后,再次低于high后再次接近大于high会不会产生中断?
当物体物体接近距离传感器的距离大于high门限后,触发中断,在中断下半部
taos_prox_threshold_set()中会将门限重新设置为low,因此只有在两者之间距离小于low的情况下才会再次触发中断。