您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页Qualcomm手机开机全过程大揭密

Qualcomm手机开机全过程大揭密

来源:爱够旅游网

转自: http:///muxiang1988/article/details/6231923


 

 

三.Ui_task的深入分析
   
从大的方向来讲,ui_task只完成两件事,一件是必要的初始化工作(这个也是我们所关心的,即ui_task到底完成了哪些工作);另外一件事就是各种信号量的事件处理,这也是我们比较关心的,即ui_task到底将哪些事件转发给了上层App。搞清楚了上述两点,我们也就能大致把ui_task的承上启下的工作机理研究清楚。

    1.ui_Init;
   
初始化过程中,ui_task主要完成了如下几件事。
    a)
创建一个用于Kick Watchdog的定时器,这样WatchDog能够及时得到Kick,假如今后发现手机在ui_task里面自动重启,很有可能就是这个定时器的Timeout设置得过短而造成的;
    b)
注册通话相关的回调,主要是和紧急呼叫相关;
    c)
电话本初始化,之所以要进行这个工作,主要是加快开机之后AL层软件操作电话本的速度,但这样将有可能导致开机速度过慢,如果开机速度过慢,可以考虑进入待机界面之后,在后台开一个task去完成这项工作;
    d)
初始化Sound设备;
    e)
向底层服务任务wms_task注册wms回调,这个回调是在IWms组件里实现的。从这种角度来看,u帮我们把wms_taskIWMS组件联系起来了,但并没有去将AL层软件和IWMS联系起来,这个工作将是由AL层软件自己去完成。当然,注册回调的这个工作也是可以在AL层完成,之所以在这里完成,而不是在AL层完成,其主要目的是这个工作可以做到与AL层无关,即AL层不需要关心这个事情,但这个事情是短消息功能得于实现的必须步骤;
    f)
注册键盘消息回调;
   
通过这个回调,所有的按键消息都将经由底层的hs_task传到此回调函数里。然后回调函数将把所有的按键信息放到一个全局变量ui_key_buffer里面,接着发送一个UI_KEY_SIG信号给ui_task通知它去处理按键信息,至于ui_task如何处理按键消息的,后面的ui_handleSignals里会有详细描述。
    g)
初始化Lcd,这个工作不是LCD硬件设备的真正初始化,只是一些UI需要用到的LCD数据结构的初始化,和我们关系不大;

    [
]
   
硬件的初始化,全部都在hs_task里面完成,从这种角度来看的话,系统能跑到ui_task里面,表明所有的硬件设备的驱动都已经成功加载。
    h)
置开机标志ui_powerupTrue
    i)
注册IPC信号量UI_IPC_SIG,这个可以暂时不管;
    j)bridle_InitSWITable
的初始化,这个目标,暂时不知道,也可以先略过;
    k)
初始化资源文件,其主要工作就是在Rom里面建立资源文件的符号链表,这样就可以让系统找到这些资源文件了(资源文件是被编译在代码段的,假如不这样做的话,系统将找不到这些资源文件);
    l)Brew
运行环境AEE的初始化:AEE_Init,这个函数看不到代码,大家只需要知道,到了这一步,整个Brew也就Run起来了,在AEE初始化完成之后,它将自动启动一个Applet,即CoreStartApp,而CoreStartApp将把CoreApp启动起来;
    m)
到此为止,ui_task的初始化工作完成;

    [
注意]
    1)
从上述的ui_task的初始化工作可以看出,ui_task并没有完成手机AL层软件的基本功能的初始化,比如说Sim卡检测、网络初始化等,这些工作,应该是在CoreApp里完成的。
    2)
真正和手机功能相关的初始化工作,是在CoreApp里完成的,这个Applet的工作机理,后面也会有详细描述;
    2.ui_HandleSignals;
    ui_task
主要完成如下事件的处理。
    a)
看门狗喂食;
    b)TASK_STOP_SIG
信号,任务Stop,目前这个任务为空,没做任何事;
    c)TASK_OFFLINE_SIG
的处理,这几个任务都属于操作系统层面的事件,目前我们可以暂时不管;
    d)
处理关机信号:CoreAppHandleStopSig(),这个只是处理ui_task在关机前需要完成的任务,比如说发送一个消息给CoreApp让它关掉自己,然后将ui_task关闭;

   
系统的真正关机信号是由tmc来处理,当它发现需要关机时,调用tmc_powerdown_handler来完成相应的工作,在这里就是给所有的任务发送TASK_STOP_SIG的信号。
   
深层次的关机处理,不需要我们了解,也没必要去知道,我们只需要知道在ui_task里面把该关的关掉就Ok了。
   
关机是一个层层深入的过程,每一个App或者任务只需要负责将它们自己创建的资源释放掉就Ok了。而关机的导引线,显然是在CoreApp里截获到关机键之后发送出来的,事实上也是如此。
    e)
网络掉线时,发送掉线信号给CoreApp
   
其实这个信号完全可以在CoreApp里面,自己去注册,然后及时更新自己的网络状态,就不知有没有这种接口函数。
    f)
处理按键消息,其主要完成如下的工作:
    i.
打开背光;
    ii.
特理按键到虚键值的转换;
    iii.
按键声音的处理;
    iv.
将按键消息传送到AEE执行环境,由它去负责按键的派发;

    [
]
    1.
背光的打开是由ui默认完成的,那这样的话,假如我不想按键时有背光,是否可行?看来就得修改此处的代码;
    2.AEE
的按键派发机制如何?它能否保证处于显示最上层的App永远是可以得到KeyApp,即假如一个Applet将自身Hide,它是否依然可以得到Key,而其它的Applet是否就不可以得到了?很怕也像EMP一样出现焦点丢失的情况;
    g)
处理AEE_APP_SIG信号量,完成AEE的调度工作,这个任务是ui完成的最重要的一项工作,因为上层的App需要定时进行调度,目前看来,这个调度工作是由AEE_APP_SIG触发的,而AEE_APP_SIG这个信号量,则由操作系统层面的一个定时器定时发送的。现在大家只要了解,AEE_Dispatch会定时调用就Ok了,至于更详细的AEE调度机制,可以参考我的另外一篇《AEE运行机制深入分析与研究》;
    h)
处理AEE_SIO_SIG信号量,这个看不到代码,暂时略过不管;

    3.
结论
   
通过上述对于ui_task的分析,可以看出,ui_task真正和手机功能有关系的(即可能需要定制或者修改的地方),主要就是初始化资源文件和处理按键消息这两部分。至于其它部分,目前都不需要Amoi关心。手机真正功能的实现,比如说开机Logo的显示、Sim卡的检查、Pin码校验等,都是在CoreApp里面完成的。


因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务