您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 单片机程序设计规范与技巧
电工与电子创新基地培训教材第1页/共13页单片机软件设计规范1.学习软件设计规范的目的学习软件设计规范的目的就是编写高质量的软件,降低编码阶段的错误率。设计一个高质量的软件有以下几点要求:1)软件设计模块化,具有好的可重用性和可移植性。2)程序代码干净整洁,具有好的可维护性。3)不使用晦涩的语句,简洁易懂,具有好的易懂性。4)代码设计简明扼要,提高程序的运行效率以及程序所占用的内存空间。5)使用充足的程序说明,程序具有好的可读性。综上所述:可重用性、可移植性、可维护性、易懂性、高效率性以及可读性是衡量一个软件质量基本要求。2.排版规范1.程序块采用缩进风格编写,缩进为4个空格位,通常采用TAB键来进行缩进,也可直接敲入4个空格位,但排版不能混合使用空格和TAB键。2.函数体的开始,类的定义,结构的定义,if、for、do、while、switch及case语句中的程序都应采用缩进方式,‘{’符号与‘}’独占一行并且位于同一列。示例:如下例子不符合规范if(……){……}应如下书写if(……){……}3.相对独立的程序块之间、变量说明之后必须加空行。示例:如下例子不符合规范if(!valid_ni(ni)){电工与电子创新基地培训教材第2页/共13页...//programcode}repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;应如下书写if(!valid_ni(ni)){...//programcode}repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;4.一行最多写一条语句。示例:如下例子不符合规范i++;j++;应如下书写i++;j++;5.不同类型的操作符混合使用时,使用括号给出优先级。示例:如下例子不符合规范if(i!=1||j!=2&&k!=3)应如下书写if((i!=1)||((j!=2)&&(k!=3)))6.较长的语句(80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。示例(书写正确):perm_count_msg.head.len=NO7_TO_STAT_PERM_COUNT_LEN+STAT_SIZE_PER_FRAM*sizeof(_UL);7.在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如-),后不应加空格。电工与电子创新基地培训教材第3页/共13页说明:采用这种松散方式编写代码的目的是使代码更加清晰。示例:(1)逗号、分号只在后面加空格。inta,b,c;(2)比较操作符,赋值操作符=、+=,算术操作符+、%,逻辑操作符&&、&,位域操作符、^等双目操作符的前后加空格。if(current_time=MAX_TIME_VALUE)a=b+c;a*=2;a=b^2;(3)!、~、++、--、&(地址运算符)等单目操作符前后不加空格。*p='a';//内容操作*与内容之间flag=!isEmpty;//非操作!与内容之间p=&mem;//地址操作&与内容之间i++;//++,--与内容之间(4)-、.前后不加空格。p-id=pid;//-指针前后不加空格(5)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。if(a=b&&cd)3.注释规范1.一般情况下,源程序有效注释量必须在20%以上说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。电工与电子创新基地培训教材第4页/共13页2.说明性文件(如头文件.h文件、.inc文件)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、头文件的注释中还应有函数功能简要说明。示例:下面为一头文件的头部注释的模板/*************************************************Copyright(C),2005,HUSTFilename:test.h//文件名Author:Version:Date://作者、版本及完成日期Description://用于详细说明此程序文件完成的主要功能,与其他模块//或函数的接口,输出值、取值范围、含义及参数间的控//制、顺序、独立或依赖等关系Others://其它内容的说明FunctionList://主要函数列表,每条记录应包括函数名及功能简要说明*************************************************/3.源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能等。示例:下面为一源文件的段头注释的模板/************************************************************Copyright(C),2005,HUSTFileName:test.cAuthor:Version:Date:Description://模块描述Version://版本信息FunctionList://主要函数及其功能1.-------***********************************************************/4.函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值等。示例:下面为一函数头部注释的模板/*************************************************Function://函数名称电工与电子创新基地培训教材第5页/共13页Description://函数功能、性能等的描述Input://输入参数说明,包括每个参数的作//用、取值说明及参数间关系。Output://对输出参数的说明。Return://函数返回值的说明Others://其它说明*************************************************/5.注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。示例:如下例子不符合规范。例1:/*getreplicatesubsystemindexandnetindicator*/repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;例2:repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;/*getreplicatesubsystemindexandnetindicator*/应如下书写/*getreplicatesubsystemindexandnetindicator*/repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;6.注释与所描述内容进行同样的缩排。这样可使程序排版整齐,并方便注释的阅读与理解。示例:如下例子,排版不整齐,阅读稍感不方便。voidexample_fun(void)电工与电子创新基地培训教材第6页/共13页{/*codeonecomments*/CodeBlockOne/*codetwocomments*/CodeBlockTwo}应改为如下布局。voidexample_fun(void){/*codeonecomments*/CodeBlockOne/*codetwocomments*/CodeBlockTwo}7.将注释与其上面的代码用空行隔开。示例:如下例子,显得代码过于紧凑。/*codeonecomments*/programcodeone/*codetwocomments*/programcodetwo应如下书写/*codeonecomments*/programcodeone/*codetwocomments*/programcodetwo电工与电子创新基地培训教材第7页/共13页4.高效率代码设计规范代码效率分为全局效率、局部效率、时间效率及空间效率。全局效率是站在整个系统的角度上的系统效率;局部效率是站在模块或函数角度上的效率;时间效率是程序处理输入任务所需的时间长短;空间效率是程序所需内存空间,如机器代码空间大小、数据空间大小、栈空间大小等。1.仔细分析有关算法,并进行优化。(1)用移位来代替2的次幂的乘除法示例:(A/D采样时的均值滤波:每次采样16个点,求16个点的均值)以下代码不规范:sum/=16;应书写为:sum=4;(2)用减法代替任意的除法示例:(在LED/LCD显示中,常需要将一个无符号整型数的个、十、百位取出来)以下代码不规范:temprature=253;led1=temperature/100;temperature%=100;led2=temperature/10;temperature%=10;led3=temperature;应书写为:temprature=253;led1=led2=led3=0;while(temperature100){led1++;电工与电子创新基地培训教材第8页/共13页temperaturn-=100;}………………………………(3)用定点数代替浮点数的运算说明:用定点数代替浮点数的基本原则就是单元变换。比如,要对某个电压值进行运算处理,电压的具体值是用浮点数变量voltage_f来表示的,单位是V,精度是mV,即当voltage_f=1.234时,则表示当前电压是1.234V,经过单位变换,将最小单位换成mV就可以将浮点换成定点来进行运算,整型变量voltage_i来表示电压,对应于之前的1.234V,voltage_i=1234;2.在多重循环中,应将最忙的循环放在最内层。说明:减少CPU切入循环层的次数。示例:如下代码效率不高。for(row=0;row100;row++){for(col=0;col5;col++){sum+=a[row][col];}}可以改为如下方式,以提高效率。for(col=0;col5;col++){for(row=0;row100;row++){sum+=a[row][col];}}3.避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。说明:目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序电工与电子创新基地培训教材第9页/共13页的具体情况而言,一般情况,与循环变量无关的判断语句可以移到循环体外,而有关的则不可以。示例:如下代码效率稍低。for(ind=0;indMAX_RECT_NUMBER;ind++){if(data_type==RECT_AREA){area_sum+=rect_area[ind];}else{rect_length_sum+=rect[ind].length;rect_width_sum+=rect[ind].width;}}因为判断语句与循环变量无关,故可如下改进,以减少判断次数。if(data_type==RECT_AREA){for(ind=0;indMAX_RECT_NUMBER;ind++){area_sum+=rect_area[ind];}}else{for(ind=0;indMAX_RECT_NUMBER;ind++){rect_length_sum+=rect[ind].length;rect_width_sum+=rect[ind].width;电工
本文标题:单片机程序设计规范与技巧
链接地址:https://www.777doc.com/doc-1284283 .html