2022年MTK开发心得 .pdf
MTK开 发 心 得-网友 Henry 原创一、开发环境设立以下表述中提到的相关压缩包或安装文件到华禹ftp 服务器下载,部分文件要到群共享里面下,那里是最新的。华禹 ftp服务器:IP :220.113.15.15,帐号为 study-,密码为 study-bbs0304 P1300的 QQ 群号 :15762255 P1300_Build_Guide.rar来自 ftp 服务器,“华禹 MTK相关部分”目录下手机开发板 C语言开发视频 .rar来自 ftp 服务器,“华禹 MTK相关部分”目录下huayu109_ads1.2.rar来自 ftp服务器,“华禹旋风 001 手机模块 1. 工具类”目录下huayu102_ADS12_Patch_Windows.rar 同上huayu106_perlzip.rar同上huayu108_SourceInsight3.5.rar同上huayu101_p1300软件使用工具及开发指南.rar同上huayu201_P1300_V1.7_Release.rar文件来自群共享huayu203_P1300_V1.7_Release_patch.rar文件来自群共享FlashTool_v3.0844.00.rar文件来自群共享1、开发主机要求及所需工具:操作系统: Windows 2000, WinXP. 推荐 Windows 2000 with SP2 or later. 编 译 器:ADS (Arm Developer Suite) v1.2 Build 842Perl 解析: ActivePerl, 推荐使用 ActivePerl 5.6.1版本名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 41 页 - - - - - - - - - 仿真工具: MTK PC Simulator跟踪工具: Catcher_L1 v3.10.01,从串口输出调试信息,只做普通UI 应用的话,大致不会用到,用 PC仿真工具就好了烧录工具: FlashTool_UI v3.1.05 或 FlashTool_v3.0844.00 其他:PL2303_Driver_XP2K v204102,这是下载线用到的USB串口驱动, 以前机器上装过 PL2303驱动的就不必再装了?2、开发环境建立过程:新建一个目录, 英文的好了, 否则有些工具不认识中文路径,这里以 E:MTK_P1300为例说明,下面我用文字和图片简单说明下安装过程,更详细的安装过程可以看压缩文件“手机开发板 C语言开发视频 .rar ”中的 Flash 文件“ P1300_Build_Env.swf ”。1)安装 ADS1.2 解压文件 huayu109_ads1.2.rar到某个目录,比如说解压到“E:MTK_P1300 ”,解压完后运行“E:MTK_P1300ADS1.2Setup.exe ”,一路按下一步,最后安装License 时选定文件“E:MTK_P1300ADS1.2CRACK license.dat”,然后接着一路下一步直到安装完。安装完后删掉目录“”,节省磁盘空间。2)安装 ADS 补丁运行 huayu102_ADS12_Patch_Windows.rar 压缩文件中的 ADS_Patch_Window.exe ,这是个自解压的压缩文件,选Unzip 解压到上一步 ADS的安装目录 ( 缺省是 C:Program FilesARMADSv1_2) ,解压过程中如果问到是否覆盖,全部选覆盖好了。3)安装脚本解释器 Perl 直接运行压缩包huayu106_perlzip.rar里面扩展名为 msi 的安装文件,缺省安装就好,一路Next,呵呵。上述几步完成后,编译环境基本建立,此时可以开一个dos 窗( 开始菜单 -运行 -输入 cmd-确定) 看一下,安装正常应该能顺利执行以下命令,如下图:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 41 页 - - - - - - - - - 注意看版本号,应该是ADS1.2 Build 842,不是的话可能没打补丁,或补丁打的位置不对,请看第 2 步 ADS 补丁部分的说明并重新打一次,直到版本号对为止,哈哈。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 41 页 - - - - - - - - - 这是 perl 解释器的运行画面。注 1:上述安装过程会自动创建编译环境所需的环境变量,如果发现编译不正常了,可能是安装了其他编译工具导致冲突,这时建议查看下系统环境变量,把Perl 和 ADS 的安装目录调到最前面, 同时从 path 中去掉可能会产生冲突的编译工具链的路径(例如 winavr),如下图所示(我是安装到 D 盘滴,缺省是 C 盘,不过我 C 盘几乎被我塞满了 ):如果嫌改 path麻烦(因为要用到其他编译工具链的时候还得改回去),还有一种办法,就是改 make.bat批处理,具体见 注 4 中相关说明。注 2: 如果安装 ADS 时,改变了默认安装路径,需要修改源码中的设置,源码目录树解压过程见 模拟器编译环节相关介绍 。makeOption.mak-ifeq ($(strip $(COMPILER),ADS) DIR_ARM = c:progra1armadsv1_2 # 修改这里DIR_ARM := $(strip $(DIR_ARM)DIR_TOOL = $(DIR_ARM)binDIR_ARMLIB = $(DIR_ARM)libDIR_ARMINC = $(DIR_ARM)includeendif-名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 41 页 - - - - - - - - - 比如改装到 D 盘了,这里把红色部分“ c”改成“ d”就好了4)代码编辑环境运行压缩文件 huayu108_Source Insight3.5.rar中的安装文件安装即可。 至于编辑器, 这个看个人喜好了,不过Source Inside看代码蛮方便的。5)PC 机模拟器模拟器 MTK PC Simulator 是用来在 PC 上仿真调试用的,要安装 VC6 SP6(同时要安装Uuicode 静态和动态库,没有装 Unicode库的可以用“huayu103_MTK 模拟器 DLL 补丁.zip”中的库,拷到系统目录“ %windir%system32”下即可 )。我机器上的 VC 是有装 Unicode库的,没装过 Unicode库的如果在模拟器编译或运行中出现问题,建议重装下VC6,安装时勾选 Unicode 库,并打上相关补丁到SP6。模拟器能模拟真机的大部分行为,这样能给调试带来很大便利,不需要每次改动都要烧录。模拟器要从源码编译,解压压缩包“huayu201_P1300_V1.7_Release.rar ”里面的文件“HUAYU_P1300_V1.7_Release.rar”到目录“ E:MTK_P1300”,此时会出现目录“E:MTK_P1300P1300_V1.7_Release ”,这就是 P1300的代码目录树了;接着打上最新的补丁,解压压缩包“ huayu203_P1300_V1.7_Release_patch.rar”里面的压缩文件“HUAYU_P1300_V1.7_Release_patch.rar ”到目录“E:MTK_P1300P1300_V1.7_Release ”,解压时选择全覆盖以替换被修改过的文件,打补丁之前对目录树里面的文件进行修改过的,需要手动再加上去。编译 PC仿真器之前需要先把刚才上面得到的目录树build 一次,开一个 dos窗,盘符和目录转到代码目录树对应的盘符和目录,例如:E:make new注 3:第一次 make的时候要用“ make new”,make new的时间比较长 (慢的机器搞不好要 2 小时以上 ),编译过程中间会出现一些文件找不到的信息,只要编译过程没意外终止,那些信息可以忽略。编译日志文件位置,要查看编译过程有啥问题就看这个目录下的文件了;生成的 bin 文件位置 : buildNEOTEL25_06B*.bin ,下载烧录就是烧 bin 文件。这里顺带介绍下 build 的命令格式:make new 清除后重新编译整个项目make resgen 重新生成资源make remake 重新编译链接项目make viewlog xxx 查看模块 xxx 的编译日志make 查看可以用 make选项帮助信息注 4:如果机器上装了其他gcc 编译工具链 (比如 winavr 之类)的话可能要手动改下Path,否则编译会出错,修改Path的方法见 注 1,也可以修改批处理文件“E:MTK_P1300P1300_V1.7_Releasemake.bat ”,在“ perl make2.pl %*”之前加上下面两句:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 41 页 - - - - - - - - - set PERL5LIB=D:perllibset windowssystem32;c:windows;c:windowssystem注意,上面的路径是我机器上的,不是缺省安装路径,要根据自己的实际安装路径做修改。下面开始编译 PC仿真器了,用 VC6 打开工程文件“E:MTK_P1300P1300_V1.7_Releaseplutommimmi PC_Simulator.dsw”,然后开始编译,编译时间比较长,具体看机器配置了,这时又可以干点别的啥了,呵呵。因为仿真器工程涉及文件较多,编译费时,建议编译过程中电脑上少开窗口,特别是网络类的,如 QQ,有时会发现开 QQ 后,编译过程中 VC 会挂死,呵呵。有可能是开QQ后防火墙过滤网络数据占用较多系统资源,如果发现VC 编译特别慢或干脆挂死,可以重启动一下电脑,只开必要的窗口,然后开始编译。如果编译过程中发现怪异的问题,如:incomingstringiddef.h(120) : error C2059: syntax error : constant 或者error C2065: STR_CM_REDIAL : undeclared identifier 之类这个时侯你可能需要看一下你VC 相关路径的设置顺序,如下图:把 VC 原本的头文件路径调整到最前面,我刚开始编译的时候SDK 的头文件在前面,编译总是通不过,改一下就好了,库也一样都调整下比较保险,呵呵。6)Tracer 跟踪工具名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 41 页 - - - - - - - - - 解压文件 P1300_Build_Guide.rar到 E:MTK_P1300,然后在文件管理器进入目录“E:MTK_P1300P1300_Build_Guide”,接着解压 Catcher_L1_v3.10.01.zip到当前目录下的 Catcher_L1_v3.10.01子目录,进入子目录Catcher_L1_v3.10.01 ,发送一个 Catcher.exe的快捷方式到桌面。在需要用到 TRACE 的时候,在代码中使用函数void kal_prompt_trace(module_type mod_id, const kal_char *fmt,.); 打印需要查看的信息,使用 Catcher跟踪查看。这个有点类似 Linux 的 Kernel Debug工具,具体使用方法见文档cather使用手册.doc,这个文档可在压缩包“huayu101_p1300软件使用工具及开发指南 .rar”里面找到。7)烧录工具解压文件“ E:MTK_P1300P1300_Build_Guide FlashTool_UI_exe_v3.1.05.zip”到当前目录,然后进入目录“ E:MTK_P1300P1300_Build_GuideFlashTool_v3.1.05”,发送一个Flash_tool.exe的快捷方式到桌面好了。还有个下载工具 FlashTool_v3.0844.00.rar ,也是不用安装,解压后直接用的,据说烧录速度比上面那个快。具体使用方法见文档 flash_tool_MT 平台使用教程 .doc,这个文档可在压缩包“huayu101_p1300软件使用工具及开发指南.rar”里面找到。8)USB 串口下载线驱动运行压缩文件“E:MTK_P1300P1300_Build_Guide PL2303_Driver_XP2K_v204102.zip ”里面的可执行文件进行安装,一路下一步,这里不再赘述。二、Hello World 上面一节我们建立好了开发环境, 现在是时候实战一把了, 在进行实质性的项目开发之前,我们先来了解下 P1300上写程序的一般性做法。从“ Hello World ”开始吧,有句笑话讲: “会编程就是会 Hello World ,编程高手就是会写很多个Hello World ”,虽 然是句笑话,但是细想也是有道理的, 麻雀虽小五脏俱全嘛, 掌握了框架, 剩下的就无非是些编程技巧的问题了。这和建房子一个道理,地基打的深不深,框架建的是否合理,决定房屋总体质量好不好,其他就是装修的功夫了, 当然还有水电线路的铺设, 这涉及到习惯和技巧了, 设计不好会漏水漏电,哈哈。扯远了,下面开始Hello World 。下面为描述上的方便,我们将Hello World 称为一个模块。首先建立新的模块目录,之后把模块相关文件都放到这个目录下统一进行管理,新的模块一般放到plutommiMMI 下面,这里我们新建一个目录 “HelloWorld ” , 然后在模块目录“HelloWorld ” 下再建三个子目录:“Inc” 、“Src”和“ Res”,分别用来存放模块的头文件、源文件和资源文件,目录结构如下图所示:接着我们在 Inc 下创建几个头文件: HelloWorldGprot.h ,HelloWorldProt.h, HelloWorldTypes.h, HelloWorldDefs.h, 再在 Src下创建一个源文件: HelloWorld.c ,关于文件名和函数名等的命名标准每个公司及个人各有不同,统一就好,否则在进行大的项目开发时彼此协同会遇到问题,有时候弄不好光这些问题就能折腾你半天甚至数日或数月,呵呵。上面几个文件的作用我大致讲下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 41 页 - - - - - - - - - HelloWorldGprot.h 模块对外接口, 供模块外部调用的函数原型在此申明,模块内部接口就不要放这里了HelloWorldProt.h 模块内部接口,供模块内部调用的函数原型在此申明HelloWorldTypes.h 本模块用到的一些常量、自定义数据类型、结构的定义HelloWorldDefs.h 本模块用到的资源ID 定义HelloWorld.c 模块功能函数的实现部分头文件 HelloWorldGprot.h 的内容大致如下:/*/#ifndef _HELLOWORLD_GPROT_H_#define _HELLOWORLD_GPROT_H_#include PixtelDataTypes.h#include HelloWorldTypes.hextern void mmi_HelloWorld_entry(void);/* 模块入口,理解成dos程序的 main 好了 */#endif /* _HELLOWORLD_GPROT_H_ */*/头文件 HelloWorldProt.h 的内容的大致如下:/*/#ifndef _HELLOWORLD_PROT_H_#define _HELLOWORLD_PROT_H_#include HelloWorldGprot.hextern void mmi_HelloWorld_entry(void); /* 本模块主界面入口例程*/extern void mmi_HelloWorld_exit(void); /* 本模块主界面退出例程*/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 41 页 - - - - - - - - - #endif /* _HELLOWORLD_PROT_H_ */*/其他几个文件的内容因模块功能而异,这里先略过,后面再讲。紧接着,我们要修改的相关系统文件,使这个模块成为整个项目的一部分,需要修改的系统文件如下:makeplutommiplutommi.inc 所有 mmi 部分的头文件所在目录的相对路径列表makeplutommiplutommi.pth 所有 mmi 部分的源文件所在目录的相对路径列表makeplutommiplutommi.lis 所有 mmi 部分的源文件 (相对路径 )列表在上述 3 个文件里面分别加上我们模块的对应内容,就现在讲的HelloWorld 而言,所加内容如下:makeplutommiplutommi.inc 文件追加一行“ plutommimmiHelloWorldInc ”makeplutommiplutommi.pth 文件追加一行“ plutommimmiHelloWorldSrc ”makeplutommiplutommi.lis 文件追加一行“ plutommimmiHelloWorldSrcHelloWorld.c ”再接着,我们需要增加一个开关,以决定这个模块是否成为最终发布版本的一部分,这实际上是一个编译开关,需要修改系统文件及相关的模块源文件,需要修改的系统文件包括:plutommiCustomerCustResourcePLUTO_MMIMMI_featuresPLUTO.h , 这里我们用名字为“ _MMI_HELLOWORLD_ENABLED_”这个开关好了,在这个文件里面追加一行:#define _MMI_HELLOWORLD_ENABLED_,同时在相关源文件里面用:#ifdef _MMI_HELLOWORLD_ENABLED_#endif来框住相关代码行就OK 了,当不打算将这个模块发布的时候,注释掉“#define _MMI_HELLOWORLD_ENABLED_”这一句重新 make一次就好了。下面讲具体实现的部分, 为了简化描述, 我们暂时先将我们的模块入口挂接到主菜单入口处(后面讲到资源的部分可将入口移到某个新建的子菜单下),修改下文件“plutommimmimainmenumainmenusrcMainMenu.c”中的 goto_main_menu函数,如下所示红色字体部分:void goto_main_menu(void)#ifdef _MMI_HELLOWORLD_ENABLED_ mmi_HelloWorld_entry(); return; #else / 此处为之前 goto_main_menu的代码#endif 同时我们需要在文件MainMenu.c 中包含头文件 HelloWorldGprot.h ,所以再在这个文件的头文件包含代码块 (通常是文件的顶部区域 )追加这一句: #include HelloWorldGprot.h 。下面是 HelloWorld.c 的内容:/*/#include stdC.h#include MMI_Features.h /* 编译开关会出现在这个由make update生成的文件里面*/#include L4Dr.h名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 41 页 - - - - - - - - - #include L4Dr1.h#include AllAppGprot.h#include FrameworkStruct.h#include GlobalConstants.h#include EventsGprot.h#include mmiappfnptrs.h#include HistoryGprot.h#include HelloWorldProt.h#include HelloWorldTypes.h#include HelloWorldDefs.h#include MainMenuDef.h#include wgui_categories.h#include Unicodexdcl.h/* 模块入口*/void mmi_HelloWorld_entry(void)#ifdef _MMI_HELLOWORLD_ENABLED_/* 强制退出当前屏幕,之后进入到我们的模块了*/* 上电缺省是 idle 屏幕,现进入 MAIN_MENU_SCREENID屏 */* 注意看第二个参数,这个是当我们模块被强制退出时执行的一些操作*/EntryNewScreen(MAIN_MENU_SCREENID, mmi_HelloWorld_exit, NULL, NULL);/* 关掉屏幕顶部的状态条,我们要用整个屏幕*/entry_full_screen();名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 41 页 - - - - - - - - - /* 擦除当前背景*/clear_screen();/* 移动文本输出光标*/gui_move_text_cursor(50, 100);/* 设置字体颜色*/gui_set_text_color(UI_COLOR_RED);/* 输出文本到显示缓冲 , 注意是 Unicode 编码 */gui_print_text(LHello, World);/* 刷新屏幕显示, MMI 用的是双缓冲绘图方式,而且需要显式刷新*/gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);/* 注册一个按键处理,右软键弹起时返回到之前被我们强制退出的模块*/SetKeyHandler(GoBackHistory, KEY_RSK, KEY_EVENT_UP);#endif/* 模块出口 * 当我们的模块被其他模块强制退出时会执行这个函数, * 这个函数的常见写法,包括: * 1、模块已申请资源的释放 (如果需要的话 ),这一步可选 * 2、手动把自己压栈到窗口 (实际是整个屏 )堆栈里面, * 便于强制我们退出的模块执行完后重新把我们叫出来 * 不像 Window 的窗口管理是自动压栈的,Pluto MMI 需要手动压栈 * 3、其他一些清理动作 */void mmi_HelloWorld_exit(void)#ifdef _MMI_HELLOWORLD_ENABLED_history currHistory;S16 nHistory = 0;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 41 页 - - - - - - - - - currHistory.scrnID = MAIN_MENU_SCREENID;currHistory.entryFuncPtr = mmi_HelloWorld_entry;pfnUnicodeStrcpy( (S8*)currHistory.inputBuffer, (S8*)&nHistory);AddHistory(currHistory);#endif/*/编码的部分基本上就是这些了,然后我们开始make,这次要用“ make update”,基于上述对相关系统文件的改动,make update会自动将刚才的模块加入到整个项目中去,同时也会更新仿真器VC 工程文件,如下图所示, HelloWorld 模块的相关文件已经被自动加入到 MMI 库里面了:后续的 make,如果是不涉及到系统相关文件的修改,用“make remake”就可以了,以节省编译时间,因为make一次太耗时间了。注意:对于仿真程序的编译,“ make update ”似乎缺少一些处理,导致可能还需要手工在文件“plutommimmiGlobalSimulatorPathDef”中追加一行, 以便模块的头文件能被顺利找到,如下所示:/I .HelloWorldInc好,现在编译仿真程序开始看下效果,编译(make update会清除掉仿真程序之前编译的中间文件,这样仿真程序会整个重新编译) 完后运行仿真器程序,如下图所示,点选File-Network Simulator 启动仿真,启动后手机模拟器进入Idle 画面,点选手机模拟画面上的“菜单”,就进入到我们的Hello World 了,而不是之前的主菜单,然后点右按钮,画面回到 Idle 画面。至此,Hello World 基本完成,这是一个相对完整的模块框架,在此基础之上我们可以逐步开始进入真正有意义的项目开发了。三、使用资源我们知道, 很多时候我们需要应付来自不同国家和地区客户的需求,他们使用的语言编码不一样,但实际上对产品功能的要求是基本相同的;此外即便是同一种语言, 客户的个性化需求(例如外观换皮肤 )也要求我们有相应手段来处理和产品业务逻辑关系不是很密切的产品表现手段,大多数时候,这些东西涉及到:字符串、图标、图片、菜单、字库、主题、声音等,也就是我们常说的资源, 做过多语言版本软件的朋友应该对此深有体会。一般来讲 VC 使用资源动态库来解决这个问题,那么在MTK 平台上一般是怎么解决的呢,我们一起来看下。1、资源 ID 在进入实际编码前,让我们先来看看MTK 平台是如何管理资源的。 MTK 平台大致将资源分为以下几类:字符串、菜单、图片、字库、主题、声音、屏幕,所有资源统一编码管理,对于同一类型的资源,每个资源有全系统唯一的编号,也就是资源ID,字符串资源和其他资源稍有不同,同一个语义的不同语言版本字符串共用同一个字符串资源ID,系统自动根据当前语言设定提取对应语言版本的字串。此外,屏幕是一种平常我们Windows 开发中不多见的一种资源,这里我们可以简单的理解成Windows 的窗口句柄好名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 41 页 - - - - - - - - - 了。为了不让系统各个模块的资源ID 彼此重叠从而导致混乱, 系统提供专门的宏来处理,并将相关的定义统一放到同一个文件里面便于管理。具体来讲,这个文件是“ plutommimmiIncMMIDataType.h ”,在开始添加实际资源之前,我们需要大致估计一个安全值,这个值代表我们可能用到的资源最大数,注意这个最大数并不是我们用到的所有资源的总数,而是某一类资源, 因为不同类型的资源其资源ID 是允许重复的,比如说我们总共要用到20 个字符串, 10 张图片, 1 个菜单项,那么这个最大数是 20,一般会再留一些可扩展的空间,就HelloWorld 模块而言,最大数取100足够了 (当然了,这个数后面还可以再改的)。最大值取好后,我们就可以着手向系统申报我们的资源 ID 空间了,修改文件“plutommimmiIncMMIDataType.h ”如下所示红色字体部分,这样系统就预留了100 个全系统唯一的资源ID 给我们了,注意,是每一种资源都有 100 个可用的资源 ID。typedef enum RESOURCE_BASE_RANGE(MAIN_MENU, 600),RESOURCE_BASE_RANGE(HELLOWORLD, 100), RESOURCE_BASE_ENUM; /* * Main Menu */ #define MAIN_MENU_BASE (U16) RESOURCE_BASE_MAIN_MENU) #define MAIN_MENU_BASE_MAX(U16) RESOURCE_BASE_MAIN_MENU_END)RESOURCE_BASE_TABLE_ITEM(MAIN_MENU)/* * HelloWorld */ #define HELLOWORLD_BASE (U16) RESOURCE_BASE_HELLOWORLD) #define HELLOWORLD_BASE_MAX (U16) RESOURCE_BASE_HELLOWORLD_END) RESOURCE_BASE_TABLE_ITEM(HELLOWORLD) 好,现在我们有自己的资源ID 空间了,之前我们有暂借MAIN_MENU 的屏幕 ID 资源,现在用回我们自己的,增加相关定义到HelloWorldDefs.h,现在 HelloWorldDefs.h 看起是这样:/*/ #ifndef _HELLOWORLD_DEFS_H_#define _HELLOWORLD_DEFS_H_typedef enum名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 41 页 - - - - - - - - - SCR_HELLOWORLD = HELLOWORLD_BASE + 1,SCREENID_LIST_HELLOWORLD;#endif /* _HELLOWORLD_DEFS_H_ */*/接着修改模块入口函数mmi_HelloWorld_entry ,见红色字体部分,如下所示:EntryNewScreen(SCR_HELLOWORLD , mmi_HelloWorld_exit, NULL, NULL);屏幕 ID 资源是一种最简单的资源,就是一个数值,定义完就可以使用了,其他资源相对复杂,需要有一个生成的过程,下面我们接着看资源的生成。2、资源的生成限于篇幅,这里我们主要讲常用的3 种资源:字符串、图片和菜单。首先,我们来看这些资源是如何被生成的,后面我们再讲如何使用这些资源。MTK 平台的资源是通过一个叫mtk_resgenerator.exe 的程序生成的,这个程序位于目录 plutommiCustomerResGenerator下,是个临时生成的可执行文件, 每次项目相关资源被修改, 该程序都要重新编译, 实际上这个程序是由一系列需要自有资源的模块根据一定的资源生成规则将各自的资源生成代码组合而成的。资源生成相关的代码统一放在同一个目录下面,因此我们要给自己的模块添加资源,只需要在这个目录下建立自己的资源生成.c 文件,并按照指定的生成规则编写代码即可。具体来讲,这个目录就是 plutommiCustomerCustResourcePLUTO_MMIRes_MMI 。注意 ,这个目录下不要放其他不相关的.c或.cpp 源文件,因为编译脚本会自动将这个目录下的所有源文件作为 mtk_resgenerator.exe的一部分来处理。好,下面开始资源生成相关的编码。我们继续接着在HelloWorld 模块上讲好了,首先在上面说的目录下面创建一个文件:Res_HelloWorld.c,这个文件的内容大致框架如下:/*/#include StdC.h#ifdef DEVELOPER_BUILD_FIRST_PASS /注意,后面资源生成相关代码要用这个编译开关框住#include PopulateRes.h#include MMI_features.h #include GlobalMenuItems.h#include HelloWorldDefs.hvoid PopulateHelloWorldRes(void)#ifdef _MMI_HELLOWORLD_ENABLED_名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 41 页 - - - - - - - - - / 这里是资源生成部分的代码,基本上都是些宏,后面讲到具体资源的时候我们再讲#endif#endif /* DEVELOPER_BUILD_FIRST_PASS */*/接着,我们还需要修改系统文件plutommiCustomerResGeneratorMakefile ,以便编译系统能顺利找到我们定义资源ID 的头文件 HelloWorldDefs.h ,在 PLUTO_INC = 这一项里面追加一行: -I ././MMI/HelloWorld/Inc,注意,追加新行的时候别忘了在上一行尾部添上续行符号“ ”。再接着,我们要把我们的资源生成函数“PopulateHelloWorldRes”放到合适的地方调用,这样才能生成我们要的资源,这里我们需要修改另外一个系统.c 源文件:“plutommimmiResourcePopulateRes.c ”,需要修改的见红色字体部分,如下所示:extern void PopulateMmiapiRes(void);extern void PopulateHelloWorldRes(void); void PopulateResData(void)#ifdef DOWNLOAD_MCU /* Added, 20071218 */PRINT_INFORMATION(Populating MCU Download Resourcen);Populate_MCUDownload();#endif#ifdef _MMI_HELLOWORLD_ENABLED_ PRINT_INFORMATION(Populating HelloWorld Resourcen); PopulateHelloWorldRes(); #endif 对于字符串资源的生成,我们还需要修改另外一个系统.c 源文件,这个文件是“plutommiCustomerResGeneratorreadexcel.c ”,这个文件是专门用来处理字符串资源的,mtk_resgenerator.exe 会调用这个部分来单独处理字符串相关的部分。需要修改的见红色字体部分,如下所示:#include SettingDefs.h#ifdef _MMI_HELLOWORLD_ENABLED_ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 41 页 - - - - - - - - - #include HelloWorldDefs.h #endif 只加上面 3 句就好,主要是让字串资源生成程序能根