




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档2016全新精品资料全新公文范文全程指导写作独家原创1/20安全DAT心得体会安全DAT心得体会关于在美拓的简短的总结与体会关于在美拓的简短的总结与体会概要这仅仅是个人的一点心得体会与总结,本登不得大雅之堂,然而我作为一个对于手机开发完全的零起点对于其中的艰难与痛苦有着切肤的体会,这一切促使我不敢身藏浅陋将一些零星琐碎公之于众,即作为自己在美拓的简短人生经历的一个总结,如果能给后来者提供一点点地借鉴也心满意足了。1关于编译环境的认识体会首先面对程序员的就是相对复杂的编译环境及其繁琐的配置工作。高通平台分为仿真和实际的ARM编译两个截然不同的编译环境,其中有些相同有些不兼容。A仿真编译精品文档2016全新精品资料全新公文范文全程指导写作独家原创2/20仿真完全使用VC6的编译机制,高通的例子是把一个个小APPLET编译成为DLL动态库,我们的工程应该是把BREW的模拟器作为静态库链接到META的工程里面,模拟器的配置在WIN32/BIN/BREW_EMUDAT中,在其中可以指定外观即DEVICEPACK配置文件,以及APPLET运行的文件系统路径,及其相应的MIF文件所在路径。PHONEFILEHCDMAL200WIN32DEVICEPACK1L200DEVICEPACK1DPKAPPLETDIRHCDMAL600NEWRESOURCEFILESYSTEMMIFDIRHCDMAL600NEWRESOURCEFILESYSTEMVC6能够自动解析源文件的相应的依赖关系省却了程序员写MAKEFILE的痛苦,但是如何创建VC6的工程文件是一个很繁琐的工作。美拓的代码统统使用CFG文件管理机制可以很方便地依靠GENDSPCMD工具加入工程组,也就是说每个源代码模块都定义了一个CFG文件,里面列明了模块的头文件H,源文件C/CPP,以及链接库LIB/A。精品文档2016全新精品资料全新公文范文全程指导写作独家原创3/20INCLUDEFILES【安全DAT心得体会】/APPS/JAVA/JBLENDIA_JVM/INCLUDE/SETTINGS/META_JAVA_SETTINGSHSOURCEFILES/APPS/JAVA/JBLENDIA_JVM/PORT/AMSUI/META_AMSUICLINKFILESIFEQ,ARM/3PARTS/JBLEND/LIBRARY/AJSC/AJSC_ARM_ADSAELSE/3PARTS/JBLEND/LIBRARY/AJSC/AJSC_WIN32_MSVCLIB精品文档2016全新精品资料全新公文范文全程指导写作独家原创4/20以上就是CFG文件的格式,于是,运行WIN32/BUILD目录下的GENDSPCMD就会运行一个PERL的脚本GENCFGMINPL来读取METAMMICFG文件,这个文件列表了所有工程要包含的META的模块CFG文件,然后通过这些CFG文件列明的H,C,LIB文件就被加入了工程,也就是加入了SIMULATORDSP的VC6的工程文件。但是代码里面的INCLUDE头文件是一个很麻烦的事情,首先,有些工程人员喜欢把其中的头文件名前面加上相对的路径,但是这个对于编译确实很麻烦的事情,因为编译器寻找这些路径是从一个运行的相对路径开始,然后按照编译设定的搜索路径和系统环境变量比如/INCLUDE项下的路径搜索,一旦工程文件位置变动就有可能搜索不到,同时过多的设定搜索路径会减慢编译速度,因为编译器会不停在各个路径下搜索,而在系统环境变量中设置弊端更多因为有可能把不同项目的同名头文件包含进来,这才是程序员的噩梦。因此美拓的做法是INCLUDE统统使用双引号并且不带路径,并在遍历CFG的时候把这些相应的头文件都拷贝到WIN32/BUILD/INCLUDE目录下,所以,你在VC6的工程里面精品文档2016全新精品资料全新公文范文全程指导写作独家原创5/20看到的头文件在编译器看来却是在使用另外一个在BUILD/INCLUDE目录下的同名头文件,你要改动必须修改工程原路径下的重新编译才能更新拷贝,否则修改BUILD/INCLUDE下的拷贝都被覆盖掉了。CFG机制对于非高通的META的代码很方便,但是高通是采用一个MIN文件的方式来建立MAKEFILE的,添加到VC6工程就没有那么方便了,幸好不是很经常修改高通代码,因此,我们可以在SIMULATORDSP的源头TEMPLATEDSP里面修改,就是把需要应用的高通的C文件加到TEMPLATEDSP文件里面,运行GENDSPCMD就更新了SIMLATORDSP。但是头文件是不能拷贝进来的,只能使用VC6的头文件搜索路径添加ADDBASECPP/NOLOGO/MD/W3/GX/O2/I“BINSTORE“这里的/I就是搜索头文件的路径,头文件的名字自然是在代码里面的了。链接的链接库也是类似的使用ADDLINK32LIBJPEG_WIN32_MSVCLIB/LIBPATH“SOURCEMETA3PARTSJBLENDLIBRARYLIBJPEGLIB“精品文档2016全新精品资料全新公文范文全程指导写作独家原创6/20其中的/LIBPATH就是指示编译器搜索库的路径。因此,如果要添加一个新的代码文件模块或者链接库,使用高通的方式很麻繁,不如使用META的办法在CFG里面定义,同时这个方式是仿真和ARM通用的,不需要再手动修改TEMPLATEDSP。我们要添加定义的宏怎么办呢原本META的设计是在一系列的CUSTXXH文件里面作,这个CUST头文件在SOURCE/QUALCOMM/BUILD/MS目录下主要是定义了一系列的所谓FEATURE的开关,其中的XX原本被设计成项目代号,这样就可以在不同项目打开不同的所谓FEATURE开关编译,但是我对这个方法是有保留意见的,因为他的宏定义有一个小问题,他的所谓FEATURE_OFF/FEATURE_ON被定义为了0/1,在代码中的宏判断是IF可是使用宏最危险的就是它有可能因为编译顺序或遗漏INCLUDE还没有定义,如果FEATURE_OFF还没有定义,默认也是0,所以这个宏就可能被误读。还有一个仿真添加宏定义比如至关重要的META_EDIT宏的定义,这个也可以放在TEMPLATEDSP里面ADDBASECPP/NOLOGO/MD/W3/GX/O2/D“FEATURE_BREW_DOWNLOAD“其中的/D就是宏定义的开关。精品文档2016全新精品资料全新公文范文全程指导写作独家原创7/20搜索TEMPLATEDSP有如下BEGINCUSTOMBUILDCHECKINGALLINCLUDEFILESINPUTPATHRESSIMULATORICO“COPYLOG“CALLSOURCEQUALCOMMBUILDMSADS12BATMAKEFGENDSPMAKCOPYINCFILEENDCUSTOMBUILD这里就是以上提及的COPYINCLUDE代码到我们的BUILD/INCLUDE目录的地方,这是利用了VC6的CUSTOMBUILD的机制,在编译前调用PERL脚本。这里要顺便提一下ADS12BAT的重要性,因为高通的编译机制大量地使用PERL脚本因此如何初始化PERL的运精品文档2016全新精品资料全新公文范文全程指导写作独家原创8/20行环境至关重要,因此在所有调用PERL脚本前都要先调用这个批命令。同时PERL运行于LINUX/UNIX环境依靠CYGWIN才得以运行于WINDOWS环境,所以也需要初始化CYGWIN的环境变量,然而LINUX/WINDOW毕竟有很大区别,比如文件系统就还是有区别,如果你在运行ARM编译看到类似于什么ASEXE不能正确执行的错误即便你的ADS12BAT已经正确运行了很有可能是因为你没有把ASEXE的文件属性加上SYSTEM,比如ATTRIBSASEXEBARM编译ARM编译和仿真编译有着巨大的差别,要复杂的多。首先要从编译资源做起。资源包括图片,文字存放在RESOURCE/META下的IMAGE,STRING,THEME目录下,给每个资源编写资源ID是一件很繁琐的事情,这里也是依靠了工具运行IMAGERESCONVBAT把IMAGE下的所有图片都编篡相应的资源ID,比如一个图片文件INPUT_123PNG最后就在METAIMGBRH里面变成了DEFINEIDI_PNG_INPUT_1238145命名的原则就是IDI_TYPE_FILENAME,其中TYPE应该是精品文档2016全新精品资料全新公文范文全程指导写作独家原创9/20文件类型即扩展名,8145是程序顺序产生无关紧要。这样程序员在代码中按照这个命名原则就省却了更新命名资源ID的烦恼了。这个METAIMGBRH最终被放在SOURCE/META/RES/PROJECT目录下,其中PROJECT未当前的项目代号,这个必须要在BUILD_RESBAT里面设定了比如SETPROJECT0803_L201。最终这个METAIMGBRH成为METAMMICFG的一栏。文字和图片稍有不同,就是把中文字串资源“T_YES是”和英文资源“T_YESYES”进行统一编号为METASTRBRH里的“DEFINET_YES3”而相应的实际资源文件则是DEFINECHINESE_RES_FILE“CHINESEBAR“变成了高通的资源文件。这一切的编译工作都是在一个RESOURCE/META/BUILD_RESBAT下完成的。需要提醒注意的是,IMAGE路径下任何文件都回被搜罗当作资源图片文件,因此如果使用SVN需要删除SVN文件或者把图片拷贝出来编译。编译完资源后就可以开始编译了,但是首先要做的还是设置好ADS12BAT,这个的重要性前面已经讲过了,每个人都有可能不同要根据自己的安装路径来设置。运行精品文档2016全新精品资料全新公文范文全程指导写作独家原创10/20ARM/PRJ_CODEBAT其中PRJ_CODE代表当前的项目代号,因此相应的在/SOURCE/QUALCOMM/BUILD/MS目录下你要有相同项目代号的PRJ_CODECMD,PRJ_CODEMAK,CUST_PRJ_CODEH,同时在/SOURCE/META/RES/PRJ_CODE/下要有相应的资源文件以便链接。正是编译同样使用META的收集CFG的方式生成实际的MAKEFILE,高通的编译器是支持C编译的,比如TCPPEXE就是C编译器,在DMSS_RULESMIN里面有PERL脚本根据代码文件扩展名自动选择编译器的规则,因此你也完全可以写C代码只要你使用CPP文件扩展名。高通使用MIN文件来定义每个小模块包含的源文件,其中还包含了S文件,这个是一个对大多数PC程序员的巨大的SURPRISE,这里要从程序运行谈起。因为PC的程序的运行地址一般都是RELOCABLE的,也就是说运行起在哪里是不需要关心的,是由操作系统的LOADER加载同时修改代码的偏移地址完成在任意物理地址运行的,但是手机程序的静态加载模块地址却是定死的,当然各个模块的地址可以依靠SCL的文件来调整,这个是LINKER的一个配置文件,它规定了各个模块的BOOT内存地址的相对关系,比如以/SOURCE/QUALCOMM/BUILD/MS/Q60X0A_ROMSCL为例,精品文档2016全新精品资料全新公文范文全程指导写作独家原创11/20BB_RAM0X0DLOADARMODLOADUSBO/ADDEDBYNICKFORJVM/ADDLIAOHSAMOICOMCNFORJAVAJBLEND_RAM0X0JBLEND_O精品文档2016全新精品资料全新公文范文全程指导写作独家原创12/20/ENDLIAOHSFORJAVA/ADDEDBYNICKFORJVM/这里实际上规定了DLOADARMO和DLOADUSBO的模块的相对位置,同时也隐含着输出了一个地址SYMBOLBB_RAM,同样的JAVA虚拟机的起始地址JBLEND_RAM会在回编码里编成两个SYMBOLIMAGEJBLEND_RAMBASE和IMAGEJBLEND_RAMLENGTH,注意这里使用的符号是ARM编译器内部使用的,和普通的C程序变量名不兼容,为了能够让C程序在链接时候引用这两个地址相关的变量名,需要一个所谓的S文件来转换。在SOURCE/QUALCOMM/DRIVER/BOOT目录下的BOOTMEMC里面可以使用EXTERN来声明EXTERNBYTEIMAGE_JBLEND_RAM_BASE精品文档2016全新精品资料全新公文范文全程指导写作独家原创13/20EXTERNBYTEIMAGE_JBLEND_RAM_LENGTH在BOOT_DATAS文件里面把这些变量名从汇编码的”“形式转换为”_”IMPORT|IMAGEJBLEND_RAMBASE|IMPORT|IMAGEJBLEND_RAMLENGTH|EXPORTLOAD_JBLEND_RAM_BASE【安全DAT心得体会】EXPORTIMAGE_JBLEND_RAM_LENGTH他们的定义是这样子的IMAGE_JBLEND_RAM_BASEIMAGE_JBLEND_RAM_LENGTH而这个所谓的S文件是在相应的BOOTMIN文件里包含了。这种机制的核心就是为了能够让JAVA虚拟机在起始运精品文档2016全新精品资料全新公文范文全程指导写作独家原创14/20行阶段记录相应的内存地址,而这一切都是由于静态加载的地址在编译器就决定了。B关于组键编程高通的组键模型编程基本上和微软的COM机制类似,只不过搞通为了方便嵌入式程序员大多不熟悉C语法以及某些效率的考虑才使用纯C语法模拟实现,但是微软的COM机制博大精深,高通仅仅借用了其中内存资源释放管理与组建创建的很小一部分。任何一个组键一定要实现最基本的三个接口方法,即ADDREF,RELEASE,QUERYINTERFACE,这三个方法看似简单,但是META的代码的写法似乎都有不妥之处。第一,这三个方法都应该是完全对外调用的不应该随随便便当作内部方法来使用,比如有的人在组件的CONSTRUCTOR,也就是所谓COMPONENT_NEW方法里面不设定NREF计数为1,却调用QUERYINTERFACE来增加引用计数,虽然效果看上去一样,实际却是有令精品文档2016全新精品资料全新公文范文全程指导写作独家原创15/20人混淆的嫌疑,我以为在CONSTRUCTOR里面直接设定引用计数为1是最自然的,因为逻辑上一个组件的创建者也就是它的拥有者当然应该增加计数为1。第二,QUERYINTERFACE另一个被滥用的例子是META的程序组件不论CLASSID为何都一律最后返回SUCCESS,这个从原理上肯定是不对的,原本一个组件有可能支持多个接口方法,取决于传进来的CLASSID是有可能不支持而返回失败的。这些都为将来的可能的扩展埋下了隐患。DCD|IMAGEJBLEND_RAMLENGTH|DCD|IMAGEJBLEND_RAMBASE|高通的组件机制提供的内存资源管理还是一种非强制的模式,也就时说这个机制需要程序员自觉遵守,一旦有人违反了这个规则那么资源就不能被自动回收,比如,你精品文档2016全新精品资料全新公文范文全程指导写作独家原创16/20在调用了QUERYINTERFACE或者通过CREATEINSTANCE获得了这个接口指针,但是忘记调用RELEASE,或者别的模块传递给你一个参数你调用了ADDREF却没有在结束调用RELEASE,那么这个资源就再也不会被释放。有鉴于此,高通还有一套类似于JAVA的垃圾回收机制强制资源的回收,这个应该是在IMODULE里面的一个实现,也就是说在一个MODULE创建的时候就建立了某种上下文于是在这个所谓上下文中所有调用内存分配函数MALLOC都会在内存的起始处被加上这么一个上下文标志,于是在这个MODULE结束的时候,BREW会强制把所有在HEAP里有这个标志的内存回收,这个就是所谓的垃圾回收机制。这个本来是好事可以让程序员不用操心资源回收有缺漏,比如象上边提到的组建的引用计数错误,忘记RELEASE的情况,但是对于一些跨模块使用的资源却有可能是一个灾难。案例1一个组件作为参数从模块A传递到了模块B,模块B的程序也正确的ADDREF表明他还要继续使用这个对象。但是当模块A结束的时候,在组建的DESTRUCTOR里面的RELEASE方法检查到了引用计数不为0也正确的不做释放内存的调用,看上去挺好,但是BREW的垃圾回收机制却是无条件执行的,他不管三七二十一会把所有模块A上下精品文档2016全新精品资料全新公文范文全程指导写作独家原创17/20文的内存统统释放。于是模块B虽然进行了正确的ADDREF以为组件还存在继续调用结果访问的却是错误的内容,因为很有可能BREW把回收的内存已经分配给了新生成的组件或者模块。针对这个情形要求程序员对于可能跨模块使用的对象的内存分配使用所谓的系统上下文,也就是调用AEEENTERAPPCONTEXT的时候使用NULL参数,然后再分配内存,随后在AEELEAVEAPPCONTEXT,这个方法要保证的一个前提是该组件在所有的内存分配时候都要采用这种系统上下文。一旦在初始化之外也有分配内存的做法或者使用别的函数分配的内存也还有可能有问题。比如笔者在使用SQLITE的组件中的一个所谓DBMANAGER接口时就遇到这个问题,当时考虑把这个MANAGER接口做成SINGLETON以便节省资源,这就要求这个对象独立于创建的模块始终存在于系统中,于是在他的初始化在系统上下文内进行,但是没有想到随后每次当创建的模块关闭后再打开新的模块调用这个MANAGER接口都会发生访问错误,后来分析高通很有可能为了加快初始化MANAGER的进度不把所有的内存分配一次性地在初始化做完,而是在实际产生新的DATABASE实例的时候分配了一些内存,而这个时候没有在系统上下文处理,属于当前的模块上下文,于是当前模块解体其中的内存自然变成非法了。精品文档2016全新精品资料全新公文范文全程指导写作独家原创18/20案例2一个组件注册了一个TIMER的回调事件,但随后就再回调发生之前结束运行被释放了。TIMER的EVENT注册要两个参数都匹配才行,也就是说一个是回调函数指针还有一个是用户自定义的数据指针,所以你要CANCELTIMEREVENT的时候必须把两个参数都传递正确才行,笔者对于这一点已开始比较吃惊,因为这个和PC上的一些习惯不一致。后来注意到了高通的说明就是你可以把回调函数指针传递NULL,这个CANCELTIMEREVENT就把所有绑定这个数据结构的EVENT都取消了,所以,鉴于此,我觉得不如自行规定所有的SETTIMEREVENT都把当前的组件指针作为用户数据传递,因为所有的数据都是定义在实现结构里面的,那么在组建的DESTRUCTOR里面无条件调用AEECANCELTIMEREVENT确保取消一切的事件。案例3笔者在撰写SQLITE的组件时候,需求要求用户可以注册一个EVENTNOTIFIER
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 夏季亲子活动策划方案
- 建筑方案设计-技术创新
- 情感咨询账号搭建方案
- 小型建筑形体构建方案设计
- 延庆建筑景观拍摄方案设计
- 南开区全网营销报价方案
- 某县第十中学河北省人工智能创客教育实验校总结
- 市北混凝土道路施工方案
- 大学外出活动策划方案
- 工艺美术展览方案
- T/CHES 79-2022大中型输水渠道工程维修养护规程
- 人工智能智慧体育课件教学
- 海洋工程概论课件
- GA/T 2187-2024法庭科学整体分离痕迹检验规范
- 盗窃谅解赔偿协议书范本
- GB 45549-2025石墨和萤石单位产品能源消耗限额
- 2025年广东广州市高三二模高考政治试卷试题(含答案详解)
- 2024年晋能控股集团有限公司招聘笔试真题
- 沟通技巧与护理人文关怀
- 留置针的使用规范
- 钢结构转换层技术交底
评论
0/150
提交评论