WEB开发网
开发学院手机开发Android 开发 Android GSM 驱动模块详细分析 阅读

Android GSM 驱动模块详细分析

 2010-03-01 16:07:00 来源:WEB开发网   
核心提示:首先看第一个任务,也就是RIL_startEventLoop函数,Android GSM 驱动模块详细分析(2),RIL_startEventLoop在ril.cpp中实现,它的主要目的是通过pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL)建立一个dispa

首先看第一个任务,也就是RIL_startEventLoop函数。RIL_startEventLoop在ril.cpp中实现,它的主要目的是通过pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL)建立一个dispatch线程,入口点在eventLoop. 而eventLoop中,会调ril_event.cpp中的ril_event_loop()函数,建立起消息(event)队列机制。

我们来仔细看看这一消息队列的机制,这些代码都在ril_event.cpp中。

void ril_event_init();

void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param);

void ril_event_add(struct ril_event * ev);

void ril_timer_add(struct ril_event * ev, struct timeval * tv);

void ril_event_del(struct ril_event * ev);

void ril_event_loop();

struct ril_event {

struct ril_event *next;

struct ril_event *prev;

int fd;

int index;

bool persist;

struct timeval timeout;

ril_event_cb func;

void *param;

};

每个ril_event结构,与一个fd句柄绑定(可以是文件,socket,管道等),并且带一个func指针去执行指定的操作。

具体流程是: ril_event_init完成后,通过ril_event_set来配置一新ril_event,并通过ril_event_add加入队列之中(实际通常用rilEventAddWakeup来添加),add会把队列里所有ril_event的fd,放入一个fd集合readFds中。这样 ril_event_loop能通过一个多路复用I/O的机制(select)来等待这些fd,如果任何一个fd有数据写入,则进入分析流程 processTimeouts(),processReadReadies(&rfds, n),firePending()。后文会详细分析这些流程。

另外我们可以看到,在进入ril_event_loop之前,已经挂入了一s_wakeupfd_event,通过pipe的机制实现的,这个event的目的是可以在一些情况下,能内部唤醒ril_event_loop的多路复用阻塞,比如一些带timeout 的命令timeout到期的时候。

至此第一个任务分析完毕,这样便建立起了基于event队列的消息循环,稍后便可以接受上层发来的的请求了(上层请求的event对象建立,在第三个任务中)。

接下来看第二个任务,这个任务的入口是RIL_Init, RIL_Init首先通过参数获取硬件接口的设备文件或模拟硬件接口的socket.

上一页  1 2 3 4 5 6 7  下一页

Tags:Android GSM 驱动

编辑录入:coldstar [复制链接] [打 印]
赞助商链接