




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TRZN工程:Embeddedsoftwaredevelopment领域:SWEngineering文件名称:嵌入式软件编程标准文件号:SW-00-00-0001版本号:0.1 日期:2016-10-28所属部门:电控质量管理部-.z.------专业资料-TRZN嵌入式软件编程标准文档修改历史:2016-10-28杨科ykee126126.根据查阅的相关资料整理,此版本为第一次提交。1文档概述【规则411】)。[建议]说明:函数的每种出错返回值的意义要清晰、明了、准确,防止使用者误用、理解错误或无视错误返回码。【规则STYLEREF1\s8SEQ规则\*ARABIC\s117】除非必要,最好不要把与函数返回值类型不同的变量,以编译系统默认的转换方式或强制的转换方式作为返回值返回。【规则STYLEREF1\s8SEQ规则\*ARABIC\s118】在调用函数填写参数时,应尽量减少没有必要的默认数据类型转换或强制数据类型转换。[建议]说明:因为数据类型转换或多或少存在危险。【规则STYLEREF1\s8SEQ规则\*ARABIC\s119】防止函数中不必要语句,防止程序中的垃圾代码。[建议]说明:程序中的垃圾代码不仅占用额外的空间,而且还常常影响程序的功能与性能,很可能给程序的测试、维护等造成不必要的麻烦。【规则STYLEREF1\s8SEQ规则\*ARABIC\s120】防止把没有关联的语句放到一个函数中。说明:防止函数或过程内出现随机内聚。随机内聚是指将没有关联或关联很弱的语句放到同一个函数或过程中。随机内聚给函数或过程的维护、测试及以后的升级等造成了不便,同时也使函数或过程的功能不明确。使用随机内聚函数,常常容易出现在一种应用场合需要改良此函数,而另一种应用场合又不允许这种改良,从而陷入困境。在编程时,经常遇到在不同函数中使用一样的代码,许多开发人员都愿把这些代码提出来,并构成一个新函数。假设这些代码关联较大并且是完成一个功能的,则这种构造是合理的,否则这种构造将产生随机内聚的函数。例如:如下函数就是一种随机内聚。voidInit_Var(void){Rect.length=0;Rect.width=0;/*初始化矩形的长与宽*/Point.*=10;Point.y=10;/*初始化"点〞的坐标*/}矩形的长、宽与点的坐标根本没有任何关系,故以上函数是随机内聚。应如下分为两个函数:voidInit_Rect(void){Rect.length=0;Rect.width=0;/*初始化矩形的长与宽*/}voidInit_Point(void){Point.*=10;Point.y=10;/*初始化"点〞的坐标*/}【规则STYLEREF1\s8SEQ规则\*ARABIC\s121】如果多段代码重复做同一件事情,则在函数的划分上可能存在问题。说明:假设此段代码各语句之间有实质性关联并且是完成同一件功能的,则可考虑把此段代码构造成一个新的函数。【规则STYLEREF1\s8SEQ规则\*ARABIC\s122】功能不明确较小的函数,特别是仅有一个上级函数调用它时,应考虑把它合并到上级函数中,而不必单独存在。说明:模块中函数划分的过多,一般会使函数间的接口变得复杂。所以过小的函数,特别是扇入很低的或功能不明确的函数,不值得单独存在。【规则STYLEREF1\s8SEQ规则\*ARABIC\s123】设计高扇入、合理扇出〔小于7〕的函数。[建议]说明:扇出是指一个函数直接调用〔控制〕其它函数的数目,而扇入是指有多少上级函数调用它。扇出过大,说明函数过分复杂,需要控制和协调过多的下级函数;而扇出过小,如总是1,说明函数的调用层次可能过多,这样不利程序阅读和函数构造的分析,并且程序运行时会对系统资源如堆栈空间等造成压力。函数较合理的扇出〔调度函数除外〕通常是3-5。扇出太大,一般是由于缺乏中间层次,可适当增加中间层次的函数。扇出太小,可把下级函数进一步分解多个函数,或合并到上级函数中。当然分解或合并函数时,不能改变要实现的功能,也不能违背函数间的独立性。扇入越大,说明使用此函数的上级函数越多,这样的函数使用效率高,但不能违背函数间的独立性而单纯地追求高扇入。公共模块中的函数及底层函数应该有较高的扇入。较良好的软件构造通常是顶层函数的扇出较高,中层函数的扇出较少,而底层函数则扇入到公共模块中。【规则STYLEREF1\s8SEQ规则\*ARABIC\s124】减少函数本身或函数间的递归调用。[建议]说明:递归调用特别是函数间的递归调用〔如A->B->C->A〕,影响程序的可理解性;递归调用一般都占用较多的系统资源〔如栈空间〕;递归调用对程序的测试有一定影响。故除非为*些算法或功能的实现方便,应减少没必要的递归调用。【规则STYLEREF1\s8SEQ规则\*ARABIC\s125】仔细分析模块的功能及性能需求,并进一步细分,同时假设有必要画出有关数据流图,据此来进展模块的函数划分与组织。[建议]说明:函数的划分与组织是模块的实现过程中很关键的步骤,如何划分出合理的函数构造,关系到模块的最终效率和可维护性、可测性等。根据模块的功能图或/及数据流图映射出函数构造是常用方法之一。【规则STYLEREF1\s8SEQ规则\*ARABIC\s126】改良模块中函数的构造,降低函数间的耦合度,并提高函数的独立性以及代码可读性、效率和可维护性。优化函数构造时,要遵守以下原则:[建议]〔1〕不能影响模块功能的实现。〔2〕仔细考察模块或函数出错处理及模块的性能要求并进展完善。〔3〕通过分解或合并函数来改良软件构造。〔4〕考察函数的规模,过大的要进展分解。〔5〕降低函数间接口的复杂度。〔6〕不同层次的函数调用要有较合理的扇入、扇出。〔7〕函数功能应可预测。〔8〕提高函数内聚。〔单一功能的函数内聚最高〕说明:对初步划分后的函数构造应进展改良、优化,使之更为合理。【规则STYLEREF1\s828】制止在向外提供接口的头文件中定义staticinline函数。[必须]说明:如果向外提供接口的头文件中定义了staticinline函数,并且该头文件被外部模块所包含,同时包含该头文件的模块没有调用该staticinline函数〔往往外部模块包含该头文件是为了使用其中的构造定义或者函数申明〕,则编译时将会出现告警,该现象在系统中是不允许的。【规则STYLEREF1\s829】制止在头文件中函数申明时参加e*tern标记,各模块调用外部函数时制止采用e*tern的形式申明该函数,必须采用包含头文件的方式申明该函数。[必须]可测性【规则STYLEREF1\s9SEQ规则\*ARABIC\s11】在同一工程组或产品组内,调测打印出的信息串的格式要有统一的形式。信息串中至少要有所在模块名〔或源文件名〕、行号。[必须]说明:统一的调测信息格式便于集成测试。否则串口上跳出一句莫名其妙的打印,不知是谁打的。【规则STYLEREF1\s9SEQ规则\*ARABIC\s12】编程的同时要为单元测试选择恰当的测试点,并仔细构造测试代码、测试用例,同时给出明确的注释说明。测试代码局部应作为〔模块中的〕一个子模块,以方便测试代码在模块中的安装与拆卸〔通过调测开关〕。[建议]【规则STYLEREF1\s9SEQ规则\*ARABIC\s13】在进展集成测试/系统联调之前,要构造好测试环境、测试工程及测试用例,同时仔细分析并优化测试用例,以提高测试效率。[建议]说明:好的测试用例应尽可能模拟出程序所遇到的边界值、各种复杂环境及一些极端情况等。【规则STYLEREF1\s9SEQ规则\*ARABIC\s14】软件模块必须设计和提供完善的DEBUG命令。[建议]【规则STYLEREF1\s9SEQ规则\*ARABIC\s15】软件模块必须设计和提供完善的DEBUG打印信息控制,打印信息开关必须分级控制。[必须]说明:建议打印开关必须与实例(instance)独立,即开关控制参数支持多instance。例如:#include"dbg_ei.h〞/*AnonymousenumthatcontainsDBGlevels.ItshallcomplywithgDghSelfInfo.*/enum{S1W_FAIL=0,S1W_BASIC,S1W_FUNC,S1W_INT,S1W_TIMER,S1W_ISR,};e*ternDBG_MODULE_TgDbgS1wModNum;#defineS1W_DBG(msg,level)DBG_Print(msg,gDbgS1wModNum,level)#defineS1W_DBG2(msg,level1,level2)DBG_Print2And(msg,gDbgS1wModNum,level1,level2)实现文件file.C:DBG_INFO_TgDbgS1wInfo={"S1W",{{"FAIL",0,"Whenerroroccurs."},{"BASIC",0,""},{"FUNC",0,"Functionentry/e*it"},{"INT",0,"Interrupthandling."},{"TIMER",0,"Timerrelated-itmaybeprintedrepeatedly."},{"ISR",0,"ISR-donotenableinunlessinNVRAM."},}};DBG_MODULE_TgDbgS1wModNum;S1W_Init(){gDbgS1wModNum=DBG_RegisterModule(&gDbgS1wInfo);/*Moreinitializations…*/S1W_DBG(("Mymessage:%d\r\n〞,myParam),S1W_INIT);}voidMY_Timer(){S1W_DBG2(("Timertriggered!No%d\r\n〞,myParam),S1W_INT,S1W_TIMER);/*…*/}【规则STYLEREF1\s9SEQ规则\*ARABIC\s16】制止在模块代码中直接使用〞printf〞打印控制信息。每个模块必须设计独立的打印信息函数(参见上一条),打印开关必须全部默认为关闭,打印信息的长度必须控制在75字节以内。[必须]例如:本例如说明了模块代码中采用两层封装实现打印信息函数的一种方式。voidPLB_Print(char*fmt,...){va_listvaObj;charbuf[500];va_start(vaObj,fmt);vsprintf(buf,fmt,vaObj);if(gPlbDbgLogCtrl&PLB_DBG_CTRL_ON){#ifdefPLB_SMC_PRINT_ONsmcPrint("%s:tick=%u\r\n",buf,tickGet());#elsprintf("%s:tick=%u\r\n",buf,tickGet());#endif}va_end(vaObj);return;}voidPLB_Log(char*filename,UINT32line,intnErrCode,char*fmt,...){va_listvaObj;charbuf[500];va_start(vaObj,fmt);vsprintf(buf,fmt,vaObj);if(gPlbDbgLogCtrl&PLB_LOG_CTRL_ON){ulogit(line,filename,nErrCode,"ErrCode=%*:%s:tick=%lu",nErrCode,buf,tickGet());}#ifdefPLB_DBG_MODE_ONPLB_Print("PLB-Log:line=%dfile=%serr=%dmsg=%s",line,filename,nErrCode,buf);#endifva_end(vaObj);return;}在代码中调用以上两函数的方式如下:if(PLB_DBG_CHK(instance,PLB_DBG_LEVEL_MAIN)){PLB_Print("PLBCheckInstanceorIfId*Error(tpTask)!instance=%difId*=%d",instance,ifId*);}【规则STYLEREF1\s9SEQ规则\*ARABIC\s17】软件模块必须编写防错程序,处理错误状态,然后在处理错误之后可用断言宣布发生错误或者用LOG方式记录错误信息。[必须]【规则STYLEREF1\s9SEQ规则\*ARABIC\s18】准确估计打印的频率,不要弄得串口上不停地打印垃圾(即使是调试开关翻开的时候)。【规则STYLEREF1\s9SEQ规则\*ARABIC\s19】注意串口的打印速率是很慢的。*些对时间非常敏感的问题,可能在调试开关关闭时出现,而在调试开关翻开、打印很多时,不再出现。代码版本管理本章没有按照"规则N-M"的格式编排,因为它是在执行过程中的流程。代码质量定义对于每个模块的每一行code来说,代码质量定义如下:一级:临时性的〔可能是出于联调目的提供〕二级:可编译通过三级:软件自测已经完成〔可以放到代码分支上去〕四级:已经经过至少一轮的系统确认SVT的测试〔有一定的代码质量〕五级:GA〔GenerallyAvailable〕质量Git分支定义分支branch:projectmanager(可委托loadbuilder)创立,每个release只有一个,用于出正式的load给SVT。主干master:是一个特殊的分支,缺省情况下把它定义为当前release的分支。(如有必要,ProjectManager可以特别向大家强调这一点。)临时分支:各人为了调试目的自己创立,TAG:是一种标记和记录点。主干和分支的关系:以805为例,CVS的分支和主干的关系如下:T2T2MaintrunkT1Git代码引入规定必须时刻保持各Release分支(包括主干)代码的质量,绝对不可以把它作为垃圾场。如有违反,任何发现违反的工程师要报告给ProjectManager,由ProjectManager找到肇事者责令其立即更正,并报FunctionManager/TeamLeader备案。BeforeNEI阶段:至少二级以上质量的代码才可以放入分支,其余代码在临时分支〔或本机〕上进展。在上NE测试前:只可以commit除2.e,2.f以外的代码〔见下章代码Commit顺序〕在上NE测试阶段:此时co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 会务公司会议合同范本
- 2025年金华年货运从业资格证考试题大全
- 公司保险担保合同范本
- 农民养车用车合同范本
- 佣金制合同范本
- 公司资产入股合同范本
- 代理签订协议合同范本
- 养殖木船出售合同范本
- 公司部分收购合同范本
- 产品独家使用合同范本
- CentOS 7系统配置与管理(Linux 试题库) 习题答案 (杨海艳 第2版)
- 手机直连卫星的可用频率分析
- 中国氢内燃机行业发展环境、市场运行格局及前景研究报告-智研咨询(2024版)
- 2025年人教版英语五年级下册教学进度安排表
- 同等学力英语申硕考试词汇(第六版大纲)电子版
- 部编四下语文《口语交际:转述》公开课教案教学设计【一等奖】
- 2023静脉治疗护理技术操作标准解读
- 唐纳森焊烟除尘器(共22页)
- 机电一体化毕业设计(论文)基于PLC的玻璃搬运机械手系统设计
- 抗滑桩施工专项方案9
- 生理案例分析
评论
0/150
提交评论