qcril_thread_view

上传人:飞*** 文档编号:48671371 上传时间:2018-07-19 格式:PPT 页数:77 大小:1,015.29KB
返回 下载 相关 举报
qcril_thread_view_第1页
第1页 / 共77页
qcril_thread_view_第2页
第2页 / 共77页
qcril_thread_view_第3页
第3页 / 共77页
qcril_thread_view_第4页
第4页 / 共77页
qcril_thread_view_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《qcril_thread_view》由会员分享,可在线阅读,更多相关《qcril_thread_view(77页珍藏版)》请在金锄头文库上搜索。

1、1Thread in RILDModem RIL Dai ErxinCopyright Indication2Department Copyrightyy.mm.dd2Google RIL Vs QC RIL RILD从vendor角度分为两部分,一部分是谷歌提供 的RIL框架它用于和上层Framework进行通信。另 一部分是Vendor RIL(QCRIL),谷歌RIL会加载这个 RIL.很显然这两部分都有各自的设计。但是RILD运 行时这两部分是作为一个整体来运转的。3Department Copyrightyy.mm.dd3How many thread in RILD rild ma

2、in core_init cmd-%d(%d) e.g. cmd-20(288) (多个) event qmi_cb QCRIL (多个) DS command queue for DSI DS command queue for QDI ipc_receiver resumer_def coex_opener 上述只是RILD中拥有的线程类型。运行时,线程实例的数 量可能会远多于上面的数量。4Department Copyrightyy.mm.dd4RILD thread 这个线程就是RILD的主线程 main(), 它会调用 RIL_Init()来进行qcril的后续初始化.后面的其他线

3、程都是由这个线程直接或间接创建,这个线程完 成上述工作后会一直睡眠. 这个线程名称在log中只 应该出现在初始化阶段,后续系统运行中不应出现 “rild“线程的log除非rild crash后又重起. “rild“线程创建“event“线程后会等待“event“线程真 正启动. event线程启动后在进入for循环之前会通 知“rild“线程继续运行同时并等待rild线程运行完毕. 直到收到“rild“通知后继续运行进入for循环.5Department Copyrightyy.mm.dd5RILD thread Related codesRild.c (hardwarerilrild) in

4、t main(int argc, char *argv)RIL_startEventLoop(); pthread_create( 创建enventLoop线程. qcril将这个 线程命名成“main“,详见后面对“main“ thread介绍.rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char *)dlsym(dlHandle, “RIL_Init“);/调用 qcril.c:RIL_Init()在此函数中将这个线程命名成“rild“done:while(1) / sleep(UINT32_M

5、AX) seems to return immediately on bionic sleep(0x00ffffff); 6Department Copyrightyy.mm.dd6RILD thread Related codesQcril.c (vendorqcomproprietaryqcrilqcril_qmi) const RIL_RadioFunctions *RIL_Init( const struct RIL_Env *env, int argc, char *argv)qmi_ril_set_thread_name( pthread_self(), QMI_RIL_QMI_R

6、ILD_THREAD_NAME);/ 设设置线线 程名为为“rild“7Department Copyrightyy.mm.dd7RILD thread Related codes/ Initialize the event thread */qcril_event_init();/创建“event“线程. * qcril_event_init() begin. Qcril_event.c (vendorqcomproprietaryqcrilqcril_qmi) void qcril_event_init( void )qcril_event.started = 0;ret = pthrea

7、d_create(/线程函数qcril_event_main()qmi_ril_set_thread_name(qcril_event.tid, QMI_RIL_EVENT_THREAD_NAME);/设置线程名为 “event“8Department Copyrightyy.mm.dd8RILD thread Related codeswhile (qcril_event.started = 0) /主线程“rild“等待“event“线程启动.pthread_cond_wait( * qcril_event_init() end.9Department Copyrightyy.mm.dd9

8、RILD thread Related codes / Start event thread qcril_event_start(); * qcril_event_start() begin Qcril_event.c (vendorqcomproprietaryqcrilqcril_qmi) void qcril_event_start( void )qcril_event.started = 2;pthread_cond_broadcast(/通知 “event“线程继续运行. /* qcril_event_start() */ * qcril_event_start() end10Dep

9、artment Copyrightyy.mm.dd10RILD thread Related codes/ start bootup if applicableqmi_ril_initiate_bootup(); /RIL_init() end.qmi_ril_initiate_bootup();给“main” thread设置timed callback qcril.c:qmi_ril_bootup_perform_core_or_start_polling(), “main“thread会调用 qmi_ril_bootup_perform_core_or_start_polling(),

10、注意: 设置是在“rild“线程. 而执行是在“main“线程. 注意: 此时“main”线程已经由“rild”线程创建完成了. 11Department Copyrightyy.mm.dd11RILD thread Related codesQcril.c (vendorqcomproprietaryqcrilqcril_qmi) void qmi_ril_initiate_bootup(void)qcril_setup_timed_callback(qmi_ril_bootup_perform_core_or_start_polling, NULL, NULL ); /NULL表示立即执行

11、 / qmi_ril_initiate_bootup 是 提供一种机制。他可以让其他线程设置一个函数以及调用这个函数的时间 当时间 到了后, enventLoop线程也就是“”线程,会调用这个函数。所以 一定是在“”线程执行12Department Copyrightyy.mm.dd12 thread “main“ thread 就是Rild的eventLoop()线程. 该线程 由rild线程创建. qcril将这个线程命名为“main“. 关 注如下几点: 1.会调用”rild”线程qmi_ril_initiate_bootup();给“main” thread设置timed callba

12、ck - 11qcril.c:qmi_ril_bootup_perform_core_or_start_polling() 2.Step 1 创建“qmi_cb“线程. 3.Step 1中如果qmi初始化不成功则创建“core_init“线程. 4.Framework下发的request会在这个线程调用 onRequest_rid()onRequest()13Department Copyrightyy.mm.dd13 thread Rild.c (hardwarerilrild) int main(int argc, char *argv)RIL_startEventLoop(); pthr

13、ead_create(eventLoop, NULL); 创建 enventLoop线程. qcril将这个线程命名成“main“.14Department Copyrightyy.mm.dd14 thread Ril.cpp (hardwarerillibril) static void * eventLoop(void *param) / Only returns on errorril_event_loop(); /while loop.ALOGE (“error in event_loop_base errno:%d“, errno);/ kill self to restart on

14、 errorkill(0, SIGKILL);return NULL; 15Department Copyrightyy.mm.dd15 thread void ril_event_loop()for (;) / Check for timeoutsprocessTimeouts();/ Check for read-readyprocessReadReadies(/ Fire awayfirePending(); 16Department Copyrightyy.mm.dd16 thread Qcril.c (vendorqcomproprietaryqcrilqcril_qmi) /“main” thread ril_event_loop()调用的第一个 qcril函数就是下面的函数,在”rild”线程设置的 - 11 void qmi_ril_bootup_perform_core_or_start_polling(void * params)。qmi_ril_main_thread_id = pthread_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号