MTK入门相关知识总结_第1页
MTK入门相关知识总结_第2页
MTK入门相关知识总结_第3页
MTK入门相关知识总结_第4页
MTK入门相关知识总结_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MTK编译过程1.1. 编写目的本文编写的目的主要是为了从整体上理解MTK的编译过程,以便能够较快的处理编译中遇到的问题,同时为以后可能的优化编译过程供应参考。1.2. 简介MTK的编译过程主要是在windows命令行下通过MakeFile文件来执行相应的perl脚本或c程序,将资源包生成c源程序,并与相应模块的c程序生成.o,.lib或.obj的中间代码,最终生成在手机上使用的.bin文件和在模拟器上使用的mmiresource.dll资源文件。1.3. 编译命令命 令说 明Clean清除全部的目标文件、库文件和日志文件New清除并重新编译全部的文件;主要完成工作 :gsm2.mak cle

2、anall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite updateUpdate重新编译资源文件,生成相应的目标文件;主要完成的工作:gsm2.mak cleanlog cleanbin mcddll_update codegen resgen cksysdrv remakeRemake仅仅编译依靠修改过的文件生成的模块;主要完成的工作:gsm2.mak mcp_check cleanlog cleanbin genverno libs $(BIN_FILE) done1.4. 编译相关的文件编译用到

3、的文件主要放在make文件夹中。各个文件的简要说明如下:文件名说 明Gsm2.mak编译过程中主要执行的make文件,这个文件从命令行获得编译参数,做出相应的处理。它定义了各个参数的执行过程,包括:new、remake、update等。以及调用其它perl或c程序生成目标文件。Option.mak定义了编译环境中用到的工具及相关的名目,依据大的编译开关定义了小的编译和链接选项,编译中包含文件和生成文件的路径,定义trace的头文件路径,全局的编译开关,用户的一些编译选项,最后定义了编译路径和名目。XXX.lisXXX模块的.c文件XXX.pthXXX模块的.c文件存放的路径XXX.defXXX

4、模块用到的编译开关,当XXX模块引用其它模块中在编译开关下定义的变量、函数或宏时,就需要将这个编译开关加进来。XXX.incXXX模块用到的头文件路径,需要将XXX模块引用的头文件及,头文件引用的头文件的路径均要包含进来。XXX_GPRS.mak定义了需要编译的模块列表、编译中包含文件和生成文件的路径,定义trace的头文件路径,全局的编译开关,用户的一些编译选项,最后定义了编译路径和名目。Comp.mak编译和集成模块源文件,编译生成库文件。构建目标代码依靠列表,设置每个模块的编译路径及编译选项,设置生成目标lib的路径,设置生成obj的路径buildinfo.tmp包含了在Gsm2.mak

5、和Option.mak中用到的项目和平台名称compbld.tmp包含了编译每个模块时的编译信息。MT6218B.log记录了Gsm2.mak文件编译过程MT6218Br名目包括了每个模块依靠的头文件MT6218Bo名目包含全部生成的obj文件和lib文件。1.5. 编译指令1、new 功能:全新开头构建整个工程的ARM版,包括图片、声音、字符串等资源都要重做。在构建工程过程中,清除全部的目标文件,库文件,日志文件等。New指令还会自动创建必要的名目、移除临时文件和中间脚本、更新日志文件。过程简要说明:new-cleanall-sysgen-ckscatter-mmi_feature_chec

6、k-asngen-codegen-asnregen-operator_check_lit-$(BTLD_BIN_FILE)-update。依靠指令:new依靠的其他指令最多,其中包括cleanall,sysgen,ckscatter,mmi_feature_check,asngen,codegen,asnregen,operator_check_lite,update.用途:new指令是最彻底也是耗时最长的一个动作,一般得到一个新的MTK发布版本后由项目负责人要做一次。使用示例:C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs new

7、。2、update功能:update是重新更新整个工程的ARM版,该动作会扫描工程中文件和库的依靠关系,若依靠关系有变化会建立新的依靠关系,随后依据新的依靠关系重新编译链接有改动的部分。Update指令不依靠cleanall指令,所以它不会删除目标文件和库文件,也不会去更新日志文件和创建目标名目,这一点和remake相像,这也是为什么执行时间比new短的缘由。过程简要说明:update-cleanlog-cleanbin-mcddll_update-codegen-resgen-cksydrv-remake。依靠指令:cleanlog,cleanbin,mcddll_updata,codege

8、n,resgen,cksydrv,remake。用途:update是耗时较长的一个指令,一般在增加或删除一些驱动或应用情况下使用。使用示例:C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs update。3、remake功能: remake是重新编译整个工程的ARM版,该动作只是简洁的重新编译链接有改动的部分。它不检查依靠关系.不扫描资源,只扫描代码的转变,有转变的重编,资源和无转变的代码不编。 过程简要说明:remake-mcp_check-cleanlog-cleanbin-genverno-libs-$(BTLD_BIN_FIK

9、E)-cmmgen-done。依靠指令:mcp_check,cleanlog,cleanbin,genverno,libs,$(BIN_FIKE),cmmgen,done。其中最重要的两个指令是libs,$(BIN_FIKE)。Libs调用编译器和连接器将各个模块名目下的C文件编译连接为独立的库。$(BIN_FIKE)是将各个模块编译连接的库和mtk_lib名目下的库一起连接起来得到一个映像文件,然后使用ADS的工具fromelf将映像文件生成以变量BIN_FILE命名的二进制文件,该文件可以下载到硬件板上运行。用途:remake是耗时最短的一个动作,也是最常用的动作。使用示例:C: BIRD

10、25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs remake。4、clean功能:清除全部的目标文件,临时文件,库文件,可执行文件,更新日志文件。还可以用于某个模块相关的清除工作。过程简要说明:check build root、target folder、comp、lib、comp log folder-clean bin folder、elf、lis、htm、log files、tst database files、obj,lib files。依靠指令:cleanlog,cleanbin,cleanmod,cleancodegen等。用途:作为

11、其它命令所依靠的指令,还有就是清除工程或者指定模块对象的类库。使用示例:C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs clean,C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs clean Init。5、其他命令介绍new_modis:是全新构建整个工程的PC模拟版,其调用VC的编译器和链接器得到一个可以在windows上运行的PC模拟版。MMI应用软件工程师可以在没有硬件板的情况下在PC上检查和调试自己写好的应用。codegen_modis:产生modis需要的tra

12、ce文件的datebase。 gen_modis:产生vc工程文件。 remake_modis:重新编译整个工程的PC版。 Codegen:创建TST数据库。它依靠的指令有:cleancodegen,asngen,umts_gen,codegen,asnregen,cleanbin,mcddll_update,done。Cleancodegen:删除codegen.lis。Resgen:生成MMI资源。它依靠的指令有:code_generate,cleancodegen,asngen,codegen,asnregen,cleanbin,mcddll_update,done。Cmmgen:生成C

13、MM文件。 Sysgen:生成内存映射文件,并放在CUSTOMER文件夹里面。Emigen:生成flash_opt.h,custom_EMI.h,custom_EMI.c和custom_switchclock.c文件。Emiclean:清除EMI设置。Mmi_feature_check:依据MMI_features.h和MMI_features_switch.h中宏定义的不同来产生info.log文件。Operator_check:检查customer的宏是否被修改,如果修改产生相应log文件。Fota:生成FOTA二进制文件。Bootloader:生成bootloader二进制文件。Cksc

14、atter:检查scatter文件Mmi_obj_check:检查运行时间值,e.g,联合体元素的大小等。Med_mem_check:检查media memory。该指令依靠gencustominfo gen_infolog nvram_auto_gen。Dummy_data_check:检查虚拟数据。Viewlog:查看日志文件。Cksysdrv:检查系统驱动是否为满。Genverno:生成verno.c/h。Mcddll_update:生成和更新tst mcddll.dll文件。Gen_bl_verno:生成bootloader版本号。Del_fota:删除fota二进制文件和elf,li

15、s,sym,htm.*.log文件。实践:一,要手动修改flash类型时:(1)没有打开USB_DOWNLOADemiclean - emigen - r(2)打开了USB_DOWNLOADemiclean - emigen - bootloader - c,r custom init drv - raction = new (codegen, resgen, clean, update) (default) = update or u (scan, compile, link) = slim_update (scan, compile, link without generating mcd

16、dll) = remake or r (compile, link) = clean or c (clean) = cci or clean_codegen (clean codegen intermedia files)= resgen (resgen) = c,u (clean then update) = c,r (clean then remake) = codegen (codegen) = slim_codegen (codegen without generating mcddll) = update_mcddll (codegen and generate mcddll) =

17、slim_mcddll (generate mcddll without codegen)= viewlog (open edit to view build log) = emigen (emigen) = emiclean (emiclean) = check_dep (check dependency module(s) after source(s)/header(s) changed) = remake_dep (check_dep, remake) = update_dep (check_dep, update)Example: make gsm new (MT6205B EVB

18、new) make gprs codegen (MT6218B EVB codegen) make mt6219 gprs update (MT6219 EVB update) make firefly17_demo gprs new make milan_demo gprs c,u init custom make mt6219 gprs r init custom drv make mt6229 gprs check_dep init/include/init.h make mt6229 gprs remake_dep make/init/init.lis make mt6229 gprs

19、 update_dep init/src/init.c1.6. 常见编译错误1、mtk_resgenerator.exe不能正常运行。可能是ResGenerator文件夹中的某些文件有错误。一个缘由是在ResGenerator文件夹中缺少temp.rgb这个文件,并且不能自动生成。2、240X320屏的Font_res.c文件的错误,由于打开了中文字体的编译开关,只需要将mmi_featurespluto.h文件中_MMI_LANG_SM_CHINESE_的编译开关关闭即可。3、消失以下错误,plutommi/mmi/FunAndGames/FunAndGamesSrc/Game.c, lin

20、e 349: Error: C2455E: array 0 found plutommi/mmi/FunAndGames/FunAndGamesSrc/Game.c, line 350: Error: C2455E: array 0 found由于默认的240X320屏幕打开的关于游戏的编译开关下没有游戏,所以需要打开mmi_featurespluto.h文件中的_MMI_GAME_VSMJ_240x320_编译开关。4、现象:mmiresource模块生成错误:plutommi/Customer/custresource/custimgmapext.c, line 31: Error: C2

21、456E: undeclared name, inventing extern int MAX_IMAGE_IDSplutommi/Customer/custresource/custimgmapext.c, line 31: Serious error: C2958E: illegal in constant expression: non constant MAX_IMAGE_IDSplutommi/Customer/custresource/custimgmapext.c: 0 warnings, 1 error, 1 serious error缘由:转变了屏幕大小后,128X160名目

22、下的图片资源有问题。解决方法:更换128X160名目下的图片资源,重新编译此模块。5、现象:Free clusters are NOT enough . Check ckSysDrv.log for detail !Tools/make.exe: * cksysdrv Error 1解决方法:删除掉/custom/system/CCDH26_05C_BB名目下的custom_EMI.c、custom_EMI.h、flash_opt.h三个文件。6、现象:在新加模块的.c文件中引用一个b.h,产生b.h中的aaa变量没有定义的错误,简略错误如下:缘由:没有包含定义aaa变量的头文件a.h。解决方

23、法:在include b.h之前include a.h7、现象:plutommi/Customer/custresource/CustImgDataHW.h, line 19361: Serious error: C2934E: duplicate definition of _CUSTOMER_IMAGES_EMPTYIMAGE_BMP缘由:解决方法:删掉CustImgDataHW.h这个文件重新编译8、现象:在链接bin文件时,消失以下错误:Error: L6218E: Undefined symbol custom_setAdvEMI (referred from bootarm.obj

24、).缘由:custominfo.pl文件没有修改,默认只打开CCDH26_05C_GPRS.mak一个文件,并不打开其它定义编译开关的文件,导致custom模块中的有些文件没有编译,所以一些变量在最后链接时显示未定义。解决方法:修改custominfo.pl文件。8、现象:编译某个模块,消失错误:Error: L6218E: Error: C2933E: type disagreement for mmi_phb_info_entry_list缘由:调用mmi_phb_info_entry_list函数时传递的参数不正确,或者是函数mmi_phb_info_entry_list在调用时还未定义

25、。解决方法:修改custominfo.pl文件。9、现象:编译时消失字符串未定义的错误,enum_list.h:2046: error: STR_ENTERTAINMENT_EXPLAIN_WOMANKNOWLEDGE undeclareere (not in a function)缘由:可能是编译开关没打开,或者是正在使用excel表,readexcel.c中没有添加相关的头文件。还有一种可能是在使用这个字符串ID的模块的make底下的.inc文件中没有将定义这个字符串的头文件路径加上。还要注意防止头文件引用的宏定义是不是重复。MTK快速调试定位的几种方法在debug调试时你也许常常发现有思

26、路如何改,但就苦于找不到要改的地方。所以快速的定位代码是至关重要。在debug时,最重要的是能够精确快速的定位代码,一般常用的有如下几种方式1.在模拟器中使用断点模拟器中断跟踪断点设置函数:/ 触屏相关 wgui_touch_screen.cwgui_general_pen_down_hdlr / 触摸屏按下函数wgui_general_pen_move_hdlr / 触摸屏移动函数wgui_general_pen_down_hdlr / 触摸屏松开函数wgui_general_pen_repeat_hdlr / 重复wgui_general_pen_abort_hdlr / 放弃操作在win

27、gui.c 此函数中setup_UI_wrappers有相关全局变量的初始赋值和定义EntryNewScreen / 进入一个新的screen都会调用的函数ExecuteCurrKeyHandler / 执行按键的函数ExecuteCurrHiliteHandlerExecuteCurrHiliteHandler_Ext / 执行当前高亮的函数ExecuteCurrProtocolHandler /执行当前协议栈的函数execute_softkey_function /执行softkey的函数UI_fill_rectangle / 填充一个矩形框UI_draw_vertical_line /

28、画一条垂直线UI_draw_horizontal_line / 画一条水平线UI_draw_dotted_horizontal_line /水平虚线UI_draw_dotted_vertical_line / 垂直虚线UI_print_text / 画一个字符串UI_print_bordered_text / 画一个有边色字符串UI_print_text_n / 画一个有n个字符的字符串UI_print_bordered_text_n / 画一个有n个字符的带边框色字符串UI_print_bordered_character /画一个的带边框色字符UI_print_character /画一个

29、字符gdi_image_draw /从绘图大事开头跟踪的函数_show_image / 画一个gif_show_transparent_image /画有设透明色的图片_show_animation_frame / 画设置祯数的图片gdi_layer_blt_previous / 同一个layer刷新某一区域的函数gdi_layer_blt_ext / 几个layer叠加显示时刷新某一区域的函数UI_BLT_double_buffer /刷新一块区域UI_set_font /设置字体3。在模拟器中设置变量值转变的断点4。搜寻菜单ID 如MAIN_MENU_ENTERTAINMENT_MENU_

30、ID5。搜寻字符串ID如MAIN_MENU_MENU_TEXT6。搜寻图片ID 如MAIN_MENU_PHONEBOOK_ICON7. 超级终端调试:8.Catcher调试2.MMI绘制设置断点 跟踪屏幕每一处字串绘制:设置断点UI_move_text_cursor:gui_move_text_cursor =UI_move_text_cursor图标测量:设置断点_measure_image:gui_measure_image = _measure_image图标显示:设置断点_show_image:gui_show_image = _show_image水平线和垂直线的绘制:设置断点UI_

31、draw_vertical_line和UI_draw_horizontal_linegui_draw_vertical_line = UI_draw_vertical_line;gui_draw_horizontal_line = UI_draw_horizontal_line;字串测量、坐标位置、打印:设置断点UI_print_text、UI_measure_string 、 UI_move_text_cursorgui_measure_string = UI_measure_stringgui_move_text_cursor =UI_move_text_cursorgui_print_t

32、ext =UI_print_text绘制图片的函数:gdi_image_draw-gdi_image_codec_drawMODIS调试前篇文章介绍了手机调试的TRACE技巧,MTK手机调试是比较简洁的,除了打TRACE,找ASSERT,分析DUMP外,剩下的就是阅历了,有阅历的人看到现象就能猜到问题出在什么地方,简洁看一下TRACE只是为了确认自己的猜想.初涉此道的伴侣往往需要时间,渐渐积累阅历.要达到娴熟,就需要有空的时候多读多商量代码.娴熟的掌握了代码,解决问题就会熟能生巧.MTK的模拟器调试说没技巧也是对的,说有技巧也不错.由于模拟器的技术与其说是MTK阅历,不如说是VC阅历.由于模拟

33、器能在没有样机的情况做大量的UI方面的开发,同时模拟器具有快捷,所见即所改等优点,因此,受到很多开发老手的青睐.娴熟掌握模拟器使用技巧,对于提高工作效率,节省资源具有很乐观的意义.工欲善其事,必先利其器.欲了解模拟器调试,就要先了解VC使用.VC调试过程中常常使用的快捷键如下:vc+断点的使用:按F9(设置断点),F5调试,F10单步调试,shift+F5退出调试F10单语句执行,F11单指令执行,Ctrl+F10执行至光标处;F9按行设置/取消断点, Alt+F9可按行,按数据或按消息设置断点;调试时,按Alt+3打开跟踪窗口,Alt+4打开变量窗口,Alt+5打开寄存器窗口,Alt+6打开

34、内存窗口,Alt+7打开堆栈窗口,Alt+8打开汇编指令窗口;1.只要你有源代码,拥有一个模拟器是一件很容易的事.当然,有些情况下,这对于初入MTK的人来说,也是困难的,特别是在一些代码管理不善,公司人员众多,员工流淌频繁的公司,你永久想象不出他们的代码会有多糟.不过一般情况下,我到一个新公司,都会试着去使用他们的代码编译得到模拟器,不管他们的代码多么糟,我总能快速的编出模拟器来.只要三个步骤:a.在编译模拟器前请关掉全部SP的宏,这是很重要的,很多SP都不供应在模拟器下运行的库,所以一个项目SP越多,在模拟器下,他无法识别的函数也会越多b.在编译过程中遇到错误,可以把全部与显示无关的代码全部

35、使用#ifdef WIN32宏括起来,把全部不生疏的类型使用typedef int xxx;重定义.把一些不能识别的宏定义使用WIN32括起来重定义一下c.在生成MODIS时,会遇到大量不生疏的函数,如果少于50个,全部建成void xxx()类型的空函数.如果多于一百个,尝试查找这些函数的来源,如果是相关SP的,就再次补充关掉相关SP.当然如果你不怕麻烦,也可以把这一百个函数建成空函数.一般来说,把全部第三方功能和与MTK无关的功能关掉的话,不能识别的函数一般不会超过十个.经过这样三步,一般情况下你都能得一个差不多可以使用的模拟器.有了模拟器,你就可以进行下面的工作了.如果你仍然无法获得模拟

36、器,建议询问你的项目领导,如果你的领导也无法解决,说明这个软件组是一个组员变动很快,或者说缺乏条理性的部门,当然也有可能这个部门的程序员都是一些MTK的顶尖层高手,他们的程序从来不需要调试.总之这是会让人疯狂的部门.2.如果你顺利到到一个模拟器,那么就可以开头调试了.首先说一下断点,VC中的断点分三大类,一类是本地断点,一类是数据断点(也称之为条件断点,有人称之为高级断点),还是一类是消息断点;这三类断点分别对应于快捷键ALT+F9打开的对话框中三个选项卡.由于消息断点是用于跟踪WIN的消息,所以在MTK中用不着.在模拟器中一般我们只使用本地断点与数据断点.本地断点和数据断点在BUG调试中举足

37、轻重,熠熠生辉。娴熟掌握断点技巧,可以使工作事倍功半。可能有些人会使用断点,但却不知道断点在模拟器中有什么妙用.断点有两个最常使用也的作用,一是跟踪代码执行情况,二是观察断点处局部变量值的变化.这两个功能应用最多.但他在MTK模拟器中还有两个隐含的用途,一就是快速定位文件,MTK本身的源代码大约有差不多上万个文件,而加入SP后,代码大约已经超过了万数.在这里面查找文章,查找函数,是一件很困难的事,这时就需要使用断点了.你在代码阅读工具SI中可以很轻松的利用CTRL+O打开文件,也可以使用F7快速定位到函数,但在VC中却没这么便利,不过你可以使用断点,比如想在VC中打开某个文件wgui_cate

38、gories_CM.c,只要VC中使用ALT+F9,在break at编辑框里输入,E:JMT_1120plutommimmiGUIGUI_SRCwgui_categories_CM.c, .4693,按F5执行DEBUG后VC就能自己定位到这个文件wgui_categories_CM.c的4693行。这是文件断点,也可以打函数断点,比如文件wgui_categories_CM.c的4693行对应的是函数ShowCategory16Screen,也可以直接在break at编辑框里输入ShowCategory16Screen,使用F5键DEBUG时,函数运行到拨号界面时,就会停下来供你调试。本

39、地断点就是这样使用的。那么本地断点有什么用呢?或者说有什么特别用途呢?简洁举几个例子吧,但断点可以应用于解决十分多的问题中,不要由于我的例子束缚了你的想象力.a.如何使用断点快速定位到问题点呢?如果我们发现,拨号窗口显示出了问题,但我们对代码不熟,不知道拨号窗口的代码在哪个文件,哪一行,我们就可以在EntryNewScreen函数上打断点,当进入拨号时他就会停下来,这时我们能过堆栈窗口信息就可以很轻松的找到这个窗口的实现函数。简略商量代码,就可以找到解决方法.b.断点可以用于快速解决窗口显示问题,比如我们的拨号窗口,有一个图片显示不正常,这时我们可以在绘图函数gdi_image_codec_d

40、raw上打上断点,进入拨号窗口中,每一次显示图片,都会在该函数上停下来,结合堆栈,我们可以很容易找到是哪个地方代码出来问题,从而找到解决方法.有关此类的函数太多,不一一举例.C.断点可以用来商量全局变量被意外修改问题,我们打开断点对话框,选其次个选项卡,把需要跟踪的变量打进去,当每次变量变化时,VC都会停下来等我们调试.也可以设置条件,假设某全局变量U8 g_XXX, 其值等于5时会出错,但你不知道这个全局变量在什么地方被什么代码赋值为5,这时就可以设置数据断点,在其次选项卡上面的对话框里输入g_XXX = 5,当其值为5时就会停下来.d.商量代码也可以使用断点,比如MTK代码里使用有很多函数

41、指针封装,例如gui_print_text指针,你想商量他的实现过程,但由于是指针,你找不到他的函数体,这时你就可以在数据断点中,把指针gui_print_text输入进去,重启模拟器时,他就会定位到ui_print_text函数处.兹举这四个例子吧,断点可以使用于你需要调试的任何场合,但过多的断点会影响你查找问题的速度,等娴熟使用时,就可以有针对性的对某些变量和函数打断点以解决问题.这是一个积累的过程3.堆栈调试,Alt+7打开堆栈窗口.该窗口中我们可以看到函数之间的调用关系,这是十分有用的,一般都是结合断点使用,定位BUG和商量代码十分有用.由于上面有例子,这里就不举了4.变量窗口,Alt

42、+4打开变量窗口,该窗口会自动显示断点代码处使用的变量及其值,阅读代码解决BUG时使用,单步执行时常常参考该窗口数据5.WATCH窗口,按Alt+3打开,由于变量窗口自动显示的变量有时不是我们需要的,这时就可以把我们需要查看的变量拖放到该窗口商量,结合断点使用,并且这里也支持表达式取值,真是太棒了.6.内存窗口,Alt+6打开内存窗口,内存窗口可以显示一块内存的内容,这是很有用的,比如我们要跟踪短信内容,有一个短信内容的指针,把该指针输入WATCH窗口,只能看到该指针指向的第一个值,要看其他的,会很麻烦,你只能输入表达式,但你把该指针输入内存窗口,就不必这样费事了7.Alt+8打开汇编指令窗口

43、,这个窗口用处不是很大,学习汇编的话,还是有用处的.一般情况下,如果第三方的库文件出了问题,也就只能使用这个窗口调试了.一般情况下,如果错误定位在C标准库文件的汇编代码上,只有一种可能,就是你的调用出错了.调试占了研发的很大一部分时间,调试的基本技术就这样,一般情况下是综合运用,敏捷掌握,以期快速解决问题,稳定代码.剩下就是阅历积累的问题了.TRACE使用的技巧MTK的调试一般来说可以分为仿真调试与手机调试.这两种调试对于研发新功能,修改BUG,商量算法都是十分重要的.当然,这两种调试也有差异,有时会消失在模拟器运行正常,在手机却运行失败,或者相反,这就突出了软件模拟环境与硬件手机环境的差别.

44、缘由可能是各种各样的,比如可能是有些硬件软件没有方法模拟,有些新功能对硬件依靠强,不能模拟,新软件的有些函数只能在手机上运行,没有写相应的模拟器代码.等等缘由都会导致两者差异.这里不一一赘述,大家知道模拟器和手机有差异就行了.模拟器调试具有直观,快速,追踪便利能优点,受到很多MMI开发者的喜爱.而有关模拟器的调试,其他也就是VC调试功能的使用.由于国内软件训练重编程,算法,轻调试,所以很少有系统的调试方书的书.在开发过程中,我也见过很多人压根就不使用模拟器,他们认为模拟器也就是在没有手机的时候使用.简略讲解模拟器的调试就放到以后,由于模拟器断点,内存,堆栈,变量各个方面的调试,简略写来都可以成

45、一篇文章.这里先讲一个手机调试的TRACE使用.1.在MTK平台,我们最常使用的TRACE函数是kal_prompt_trace函数,这个函数是系统供应应我们的用于在catcher里调试错误的.在这个函数不能使用的场合,有时我们会使用函数system_print或者dbg_printf,这两个函数可以不使用catcher的情况,使用WIN自带的工具超级终端来调试程序.有时驱动的伴侣会自己用函数PutUARTBytes写自已TRACE函数,这些函数可以使用超级终端调试,如下,就是别人写的一个TRACE函数.打印某一块数据的内容,常常TRACE内存数据,指定地址,指定大小void perun_du

46、mp(void *buf, prn_int16 size)#ifdef PRN_TRACE_OPEN#ifdef MMI_ON_HARDWARE_P char str2048; char *ptr = (char*)str; char *ptr1 = buf; int i = 0; memset(str, 0, sizeof(str); strcpy(ptr, Perun_dump: ); ptr += strlen(Perun_dump: ); while (i 或者我自己的拼音名字,我会如下修改我的MYTRACE:#ifdef WIN32#define MYTRACE printf#els

47、e#define STR(s) #s#define MYTRACE(.) kal_prompt_trace(MOD_WAP, STR()#_VA_ARGS_)#endif经过这样的改进,我的TRACE在输出信息时,信息头就是我的名字,我可以使用查找全部功能把我需要的TRACE全抓出来.如果你对#号的使用,有疑问,请自己查找相关资料4.种种迹象和从理论上看来,TRACE和MMI_ASSERT是调试的好帮手,但在发布软件时,带上了这个会引来不必要的麻烦.MMI_ASSERT增加了系统重启的频率.TRACE增加了系统的ROM,RAM和CPU的开销.在工作中,我们曾经发现一款手机,由于ROM过于紧张,

48、添加几条TRACE就会消失编译错误,去掉TRACE就编译通过了,导致出了BUG调试十分的麻烦.如何写一种使用时可以TRACE错误,不使用时又不占用系统资源的TRACE呢,我见很多人这样处理,由于NULL会被编译器优化点,后面括号变成一个表达式了.表达式对系统的开销自然小于函数了.#ifdef DEBUG_KAL#define MYTRACE(.) kal_prompt_trace(MOD_WAP, _VA_ARGS_)#else#define MYTRACE NULL#endif 我一般这样操作.#ifdef DEBUG_KAL#define MYTRACE(.) kal_prompt_tra

49、ce(MOD_WAP, _VA_ARGS_)#else#define MYTRACE /#endif我曾经认为这样写可以在不使用时,把宏函数变为注释符,但我的一个伴侣认为这样写,并不能把我的函数变成注释符,他的道理是双斜线会被编译器外忽视掉,我认为是有道理的,后来我的伴侣经过思考,写出如下的TRACE,通过一个反斜杠的连接符,哄编译器在展开宏时把两个斜杠连起来组成注释符,这个写法有些奇怪,下面的单个斜杠必须顶格写,以保证经过连接合,两斜杠之间没有空格从而在被编译时与后面的代码组成注释行.但这样写的一个致命的缺陷是会让很多人看不明白.另一个缺陷时不美观#ifdef DEBUG_KAL#defin

50、e MYTRACE printf#else#define MYTRACE /#endif5.有关C语言的奇怪用法,据的作者曾说,世界上有一个奇怪的大赛叫”国际C语言混乱代码大赛”,每年举办一次.获奖的都功能齐全而代码惨不忍睹的典型.在MTK上,也曾经有一段费了我很大功夫的TRACE代码:#define DBG_PRINTF(_x_) do printf(%s(%d)-:,_); printf _x_; while(0);当时怎么想都不明白为什么会有这么奇怪的使用printf _x_;后来才发现使用时要加双层括号才能正常使用。6.在手机与网络,手机与电脑的交互过程中,有时我们需要TRACE数据包

51、的内容,特别在显示不正确或者不精确的情况下,需要商量数据包的数据是使用UTF编码,还UCS2编码,还是ASC编码,这时我们就需要TRACE数据的字节内容,从而便于分析。我一般使用下面这个自己顺手写的函数来实现.static U8 TraceUni(U8 *str, U8 len) U8 *tempstr,*tempascstr; U8 i; tempstr = str; kal_prompt_trace(MOD_MMI, XXXXXXXXXXXXXXXXXXXXXXXX Trace mmi_msg_handle_new_msg_ind is start XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX); if (*(tempstr + 1) = 0x00) UnicodeNToAnsii(S8*)tempascstr,(S8*)tempstr,len ); kal_prompt_trace(MOD_MMI, jo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论