《mtk 面试的几个主要问题.docx》由会员分享,可在线阅读,更多相关《mtk 面试的几个主要问题.docx(11页珍藏版)》请在第壹文秘上搜索。
1、3.2分析这是窗口建立过程的一个通用处理结构,这里简洁说明一下,每个函数的详细实现和功能请阅读代码。EntryNewScreen初始化建立一个窗口须要的变量和过程,并退出上一个窗口,清除按键处理函数等;SetParcntHandler很重要,设置当前父窗口全局变量的MENUlD,用来定位到当前是在哪一个窗口,后面依据他来在菜单树中查找到高亮的菜单项的MENUID,找到菜单项的MENUID后,通过mmi_frm_get_hi1ite_hd1r(U16menu_id)可以找到菜单项对应的高ghtSoftkeyFunction(GoBackHistory,KEY_EVENT_UP)等函数设置这个窗口
2、要响应哪些按键事务,并设置好相应的处理函数。3. 3高亮函数触发过程RegisterHighlightHand1er把ExecuteCurrHiliteHandler注册成一个通用的高亮处理函数,事实上是给MMI_list_highlight_handler函数指针赋值触发则须要调用MMIist_highlight_handler由于MTK平台支持各种菜单形式,比如纯文本的菜单、带CHECKBoX的、带RADIO的、带一个图片的、带两个图片的、两行的。我们现在只对一种标准菜单进行分析,其他形式的分析方法相同。if(flagWGUI_I.IST_MENU_DISAB1.E_VO1._KEY)re
3、gister_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);S
4、etKeyHand1er(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文件里。这个函数在开机过程中的一个调用栈关系如下:Init
5、Evcnts();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,2
6、6218,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.
7、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)KeturnDevAppGetSeqItemI
8、d_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找到对应的高
9、亮函数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_tabl
10、eindex,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(return
11、NU1.1.;3MTK内存管理1内存管理。平台不供应动态安排内存的方式:应用程序须要运用动态安排内存时,可以采纳以下几种方式:与系统其他模块共享内存,典型的是运用MED模块的内存:定义一个静态数组,交给系统adm托管,然后调用kal_adm_allocxkal_admJree等内存操作函数实现动态内存安排:定义一个静态数组,应用自己实现基于此数组的安排和管理,也就是实现自己的内存管理模块。2内存安排机制在MTK的资料中,介绍了它的内存管理机制,有3种:ADM、Controlbuffer、SystemMemoryc后两个是系统运用的,与上层应用无关。但是我对kal_system_alIoc也做了
12、初步分析。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_sy
13、stem_alloc来安排的。也就是说,Controlbuffer、SystemMemory用的都是System_Mcni_Poo1的空间。而System_Mem_Pool可以查到,是在custom_configmem函数中配置。ADM就完全没有运用操作系统供应的内存管理算法,是平台自创了一套。开发者,可以自己开拓一个POO1.,自己在这个池用ADV供应的内存管理API完成内存的动态管理。详细的安排算法,就没有再细看,跟一些通用的内存安排算法应当一样。但是在以前调试一个问题的时候,应当是可以断定,ADV在每一个allocnode前后都加了GAP调试区,来推断是否被overwrite0至于系统中
14、,究竟是用了多少块内存用于ADM,各块内存又是让哪些应用在共享,开发者可能更清晰。在系统中是否建立了对内存动态安排的监控机制,比如杳询内存泄漏、动态内存运用效率等等。3少于2K运用get_ctrl_buffere大于2K运用adnget_ctrl_buffer是在系统定义的一块区域申请空间。这段空间被分为好多块均等大小。似乎有以下几种方式:2个1K*24个O.5K*46个0.25K*8.申请的话,按首适应尊法。这就是你所说的小块内存管理。adm主要是你自己定义的一块全局数组比如400K.你可以运用它的adm相关函数去动态申请释放这100K大小的区域,维护也靠你自己。4任孑务管理任务管理。系统任
15、务采纳静态创建方式,静态配置任务优先级、栈大小、任务全局唯一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_funccomp_cfg_funccomp_reset_f