欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    mtk 面试的几个主要问题.docx

    • 资源ID:1468750       资源大小:21.71KB        全文页数:11页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    mtk 面试的几个主要问题.docx

    3.2分析这是窗口建立过程的一个通用处理结构,这里简洁说明一下,每个函数的详细实现和功能请阅读代码。EntryNewScreen初始化建立一个窗口须要的变量和过程,并退出上一个窗口,清除按键处理函数等;SetParcntHandler很重要,设置当前父窗口全局变量的MENUlD,用来定位到当前是在哪一个窗口,后面依据他来在菜单树中查找到高亮的菜单项的MENUID,找到菜单项的MENUID后,通过mmi_frm_get_hi1ite_hd1r(U16menu_id)可以找到菜单项对应的高ghtSoftkeyFunction(GoBackHistory,KEY_EVENT_UP)等函数设置这个窗口要响应哪些按键事务,并设置好相应的处理函数。3. 3高亮函数触发过程RegisterHighlightHand1er把ExecuteCurrHiliteHandler注册成一个通用的高亮处理函数,事实上是给MMI_list_highlight_handler函数指针赋值°触发则须要调用MMIist_highlight_handler«由于MTK平台支持各种菜单形式,比如纯文本的菜单、带CHECKBoX的、带RADIO的、带一个图片的、带两个图片的、两行的。我们现在只对一种标准菜单进行分析,其他形式的分析方法相同。if(flagWGUI_I.IST_MENU_DISAB1.E_VO1._KEY)register_fixed_list_keys_exO;elsercgistcr_fixed_list_keys();来注册按键事务处理函数,其实现过程很简洁:voidregister_fixed_list_keys(void)/*/+1.ocalVariables*/*f三/不*/*CodeBt)dy*/*/SetKeyHandler(fixed_list_goto_previous_itern,KEY_UP_ARROW,KEY_EVENT_DOWN);SetKeyHandler(fixed_list_goto_next_item,KEY_DOlfN_ARRoKKEYEVENT_DOWN);SetKeyHand1er(fixed_1ist_goto_previous_item,KEY_VO1._UP,KEY_EVENUX)WN);SetKeyHandler(fixed_list_goto_next_item,KEY_VO1._DOWN,KEY_EVENT_DOWN);关于如何实现按键事务的响应、按键的处理逻辑,又姑一个专题了。大致包括键盘中断、去抖、键盘映射、检测、进程通信、应用部分按键处理机制等,有机会再写出文档。4相关学问点说明:4. 1初始化相关高亮的一些全局变量会在InitEVentSo里进行初始化,在event,c文件里。这个函数在开机过程中的一个调用栈关系如下:InitEvcnts();InitEvcntHandlersBeforcPowcrOn();voidMMI_task(oslEntryType*entry_param)InitEventsO:还会在InitFramcwork()中被调用,而InitFramCWork()会由于开机的状态不同,如USB开机、闹钟开机等,调用流程也不尽相同。详细的可参见我的另一篇应用开机流程的文档。4.2菜单结构及查找4.2.1菜单数数组示意constCUSTOM_MENUmtk_nCustMenus=l,0,18,0,16,2,10933,11062,(U16*)n0rderMenuItem0,2,0,3,1,0,1,26218,26085,(U16*)n0rderMenuItem_l,3,2,0,1,0,1,555,0,(U16*)0,5,2,0,1,0,1,26173,0,(U16*)0),0,0,0,0,0,0,0,0,(U16*)0)r0,0,0,0,0,0,0,0,(U16*)0),0,0,0,0,0,0,0,0,(U16*)0,。4,2,0,1,0,1,552,0,(U16*)0,0,0,0,0,0,0,0,0,(U16*)0t0,0,0,0,0,0,0,0,(U16*)0f0,0,0,0,0,0,0,0,(U16*)0,CUSTO1.MENUneUStMenUSMAXJ4ENUTEMS;4.2.2通过父窗口MENUID及高亮INDEX找到高亮窗口MENUIDU16GetSeqItemId_Ext(U16parent-iternid,U16index)/*/*1.ocaIVariables*/*/U8i=0,idx=O;U16item_id=0;U8chiId_count=(U8)nCustMcnusparent_itCm_idT.nNumoCMcnu11em;2I三三三三三三三三三三三三三W*/*CodeBody*/*/#ifdefDEVAPP_RESOURCEif(parent_item_id=MENU_ID_DEVAPP_START)KeturnDevAppGetSeqItemId_Ext(parent_item_id,index):#Cndiffor(i=0;ichild_count;i+)item_id=nCustMenusparent_item_id-l.nOrderMenuItemldi:ifrm_tcst_menu_itcm_hide(itcm-id)*theitemisnothidden*/if(idx=index)(break:elseidx+;MM1.TRACE(MMI_R_TRC_G2_GUI,MM1.RESGEN_A1.1._VENUJn)E,parent_item_id);returnitem.id;4.2.3通过高亮窗口MENUID找到对应的高亮函数FuncPtrmmi_frm_get_hiIite_hd1r(U16menu_id)/*/*1.ocalVartables*/*/U32index;f*mmmm/不*/*CodeBt)dy*/*/*Firstlysearchthedynamictablc*/if(mmi_frm_binary_search(U32)menukid,(mmi_frm_pair_data_struet*)mmi_frmint_hi1ite_hdlr_table,(U32)mmi_frm_int_hilite_hd1r_count,index)returnmmi_fnn_int_hi1ite_hdlr_tableindex,hilite-hdlr;AAndthensearchtheconstanttable.TheconstanttableiSgenerantedbyresgen.*/elseif(mmi_frm_binary_search(U32)mcnu_id,(mmi_frm_pair_data_struct*)const_hi1itejd1r_tab1e,(U32)ARRAY_CoUMT(mmifrm_const_hi1ite_hd1Jtable),indcx)returnmmi_frm_const_hi1ite_hd1r_tab1eindex.hilite_hd1r;else(returnNU1.1.;3MTK内存管理1内存管理。平台不供应动态安排内存的方式:应用程序须要运用动态安排内存时,可以采纳以下几种方式:与系统其他模块共享内存,典型的是运用MED模块的内存:定义一个静态数组,交给系统adm托管,然后调用kal_adm_allocxkal_admJree等内存操作函数实现动态内存安排:定义一个静态数组,应用自己实现基于此数组的安排和管理,也就是实现自己的内存管理模块。2内存安排机制在MTK的资料中,介绍了它的内存管理机制,有3种:ADM、Controlbuffer、SystemMemoryc>后两个是系统运用的,与上层应用无关。但是我对kal_system_alIoc也做了初步分析。sys_mem_ptr,其估计应当指向的是SystemJIem.Pool,debugmempIr,其估计应当指向的是dcbug_Mem_Poo1.经过初步分析,kal_system_alIoc就是从SystemMcmPool做箍洁的加法操作,SySJnem_IefJsize就是SystemJIem.Pool还剩下多少。kal_systeni_alloc从SySJnCm_pIr起先来计算要取的内存。ctrl_buf是通过kal_system_alIoc的内存,然后再通过NU_Create_Partition_Pool创建POo1.O系统的一些taskStaCk.等也都是通过kal_system_alloc来安排的。也就是说,Controlbuffer、SystemMemory用的都是System_Mcni_Poo1的空间。而System_Mem_Pool可以查到,是在custom_configmem函数中配置。ADM就完全没有运用操作系统供应的内存管理算法,是平台自创了一套。开发者,可以自己开拓一个POO1.,自己在这个池用ADV供应的内存管理API完成内存的动态管理。详细的安排算法,就没有再细看,跟一些通用的内存安排算法应当一样。但是在以前调试一个问题的时候,应当是可以断定,ADV在每一个allocnode前后都加了GAP调试区,来推断是否被overwrite0至于系统中,究竟是用了多少块内存用于ADM,各块内存又是让哪些应用在共享,开发者可能更清晰。在系统中是否建立了对内存动态安排的监控机制,比如杳询内存泄漏、动态内存运用效率等等。3少于2K运用get_ctrl_buffere大于2K运用adnget_ctrl_buffer是在系统定义的一块区域申请空间。这段空间被分为好多块均等大小。似乎有以下几种方式:2个1K*24个O.5K*46个0.25K*8.申请的话,按首适应尊法。这就是你所说的小块内存管理。adm主要是你自己定义的一块全局数组比如400K.你可以运用它的adm相关函数去动态申请释放这100K大小的区域,维护也靠你自己。4任孑务管理任务管理。系统任务采纳静态创建方式,静态配置任务优先级、栈大小、任务全局唯一ID等:不供应动态创建Task的方式;任务内部以及任务之间的通信通过内部事务队列和外部事务队列完成pplication_Initialize中的mainp函数,负责任务的创建。我们在代码中见不到任务创建的函数,只须要维护任务初始化参数数据结构。对于系统的那些task信息,都保存在sys_comp_config_lbl变量中,我们看不到。但是MTK供应应客户的custom_comp_config_tbl,客户是可以修改的,在这里用户可以定义自己的task。关于任务,须要关切数据结构COmPlaSkjlandICJStrUCto关于comptaskhandler_struct成员的执行依次,应当是:comp_init_func在系统还未schedule即在Application_Initialize中完成,然后taskschedule后执行comp_entry_func<>comp_cfg_funccomp_reset_funcxcomp_end_func我认为无太多意义。5事务檄制事务机制。'F台事务机制采纳注册一回调"机制,把须要处理的各个按键、触摸屏等通过系统函数注册,当有事务发生时系统调用所注册的监听者。6定畤器消息摧制MTK定时器消息机制分析1.数据结构(1).StHCk_timeJStrUCI定时器类型的信息结构(其主要作用似乎是用以装载待发送的定时器消息数据)(2).TIMERTAB1.E定时器队列节点结构(其由主要元素mmi_frin_timer_type结构及链表指针两个元素组成)(3).event_scheduler队列信息结构(4).mmi_frm_timer_type定时器信息结构2.1.4定时器初始化(1).步骤创建MMITask-设置MMlTask初始化函数-在该函数中调用1.4InitTimer(2).作用初始化定时器队列并设置基本定时器1,23.发送定时器消息(1).步骤StartTimer-1.4StartTimer(2).两种类型的定时器MTK中有两种类型的定时器a.NO_A1.IGNMENT非队列式的,即要求马上执行的定时器,时间到了就自动被reset.b.A1.IGNMENT队列式的,即可以通过队列操作,有肯定的延时容忍的定时器.y其基本执行流程:执行定时器一超时?一保存timerid,eventidtimerstopIInoevent?END;IYNlc.除了触摸屏和手写,其他状况下的定时器一般都是队列式的.(3).1.4StartTimer的作用推断将要发送的定时器ID,依据是否是队列类型传递给不同的队列结构(event_shedulerl/event_sheduler2);(4).TimerExpiry这是作为参数传递给1.4StartTimcr的回调函数,由于MTK做了肯定的封装,因此其内部详细回调触发过程无法得知,但依据揣测,应当是在定时时间一到,以中断的方式发出消息(VSG_IDjnMER.EXPIRY),并将其写到MMI的循环队列.该函数可能是在1.4CalIBackTimer中调用的,UCallBackTimer的作用如下:a.重置当前定时器信息结构(mmi_frm_timer_type);b.执行定时器到点后的执行函数(TimerEXPiry);c.讲Timer消息写到MMI循环队列中.4.与StartTimer对应的StopTimer(1).详细实现通过调用1.4StopT加er操作.(2).作用:找出指定要停止的定时器11)在队列中的位置,然后运用evshed_cancel_event将指定定时器节点从队列中删除.5.定时器消息的处理(1).步骤创建MMlTask-设置MMITask入口函数-调用EvshedMMITimerHandler(2).evshed加。JhandlCr()-处理详细的定时器事务6.小结简洁分析MTK定时器消息事务,由于只是简洁的分析,谬误定然甚多,忘包涵包涵并不吝指正.

    注意事项

    本文(mtk 面试的几个主要问题.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开