ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:20.70KB ,
资源ID:8020786      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8020786.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机程序设计规范与技巧.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机程序设计规范与技巧.docx

1、单片机程序设计规范与技巧单片机软件设计规范1 学习软件设计规范的目的学习软件设计规范的目的就是编写高质量的软件,降低编码阶段的错误率。设计一个高质量的软件有以下几点要求:1) 软件设计模块化,具有好的可重用性和可移植性。2) 程序代码干净整洁,具有好的可维护性。3) 不使用晦涩的语句,简洁易懂,具有好的易懂性。4) 代码设计简明扼要,提高程序的运行效率以及程序所占用的内存空间。5) 使用充足的程序说明,程序具有好的可读性。综上所述:可重用性、可移植性、可维护性、易懂性、高效率性以及可读性是衡量一个软件质量基本要求。 2 排版规范1 程序块采用缩进风格编写,缩进为4个空格位,通常采用TAB键来进

2、行缩进,也可直接敲入4个空格位,但排版不能混合使用空格和TAB键。2 函数体的开始,类的定义,结构的定义,if、for、do、while、switch及case语句中的程序都应采用缩进方式,符号与独占一行并且位于同一列。示例:如下例子不符合规范if() 应如下书写if()3 相对独立的程序块之间、变量说明之后必须加空行。示例:如下例子不符合规范if (!valid_ni(ni) . / program coderepssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;应如下书写if (!valid_ni(ni) .

3、 / program coderepssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;4 一行最多写一条语句。示例:如下例子不符合规范i+ ; j+ ;应如下书写i+;j+;5 不同类型的操作符混合使用时,使用括号给出优先级。示例:如下例子不符合规范 if( i!=1 | j!=2 & k!=3 )应如下书写 if( (i!=1) | ( (j!=2) & (k!=3) ) )6 较长的语句(80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整

4、齐,语句可读。示例(书写正确):perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN + STAT_SIZE_PER_FRAM * sizeof( _UL );7 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如),后不应加空格。说明:采用这种松散方式编写代码的目的是使代码更加清晰。示例:(1) 逗号、分号只在后面加空格。int a, b, c; (2)比较操作符, 赋值操作符=、 +=,算术操作符+、%,逻辑操作符&、&,位域操作符= MAX_TIME

5、_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 & c d)3 注释规范1 一般情况下,源程序有效注释量必须在20以上说明:注释的原则是有助于对程序的阅读理解

6、,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。2 说明性文件(如头文件.h文件、.inc文件)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、头文件的注释中还应有函数功能简要说明。示例:下面为一头文件的头部注释的模板/* Copyright (C), 2005, HUST File name: test.h/ 文件名 Author: Version: Date: / 作者、版本及完成日期 Description: / 用于详细说明此程序文件完成的主要功能,与其他模块 / 或函数的接口,输出值、取值范围、含义及参数间的控

7、 / 制、顺序、独立或依赖等关系 Others: / 其它内容的说明 Function List: / 主要函数列表,每条记录应包括函数名及功能简要说明*/3 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能等。示例:下面为一源文件的段头注释的模板/* Copyright (C), 2005, HUST FileName: test.c Author: Version : Date: Description: / 模块描述 Version: / 版本信息 Function List: / 主要函数及其功能 1. -*/4 函数头部应进行注释,列出:

8、函数的目的/功能、输入参数、输出参数、返回值等。示例:下面为一函数头部注释的模板/* Function: / 函数名称 Description: / 函数功能、性能等的描述 Input: / 输入参数说明,包括每个参数的作 / 用、取值说明及参数间关系。 Output: / 对输出参数的说明。 Return: / 函数返回值的说明 Others: / 其它说明*/5 注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。示例:如下例子不符合规范。例1:/* get replicate sub system i

9、ndex and net indicator */repssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;例2:repssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;/* get replicate sub system index and net indicator */应如下书写/* get replicate sub system index and net indicator */repssn_ind = ssn_data

10、index.repssn_index;repssn_ni = ssn_dataindex.ni;6 注释与所描述内容进行同样的缩排。这样可使程序排版整齐,并方便注释的阅读与理解。示例:如下例子,排版不整齐,阅读稍感不方便。void example_fun( void )/* code one comments */ CodeBlock One /* code two comments */ CodeBlock Two应改为如下布局。void example_fun( void ) /* code one comments */ CodeBlock One /* code two comment

11、s */ CodeBlock Two7 将注释与其上面的代码用空行隔开。示例:如下例子,显得代码过于紧凑。/* code one comments */program code one/* code two comments */program code two应如下书写/* code one comments */program code one/* code two comments */program code two4 高效率代码设计规范代码效率分为全局效率、局部效率、时间效率及空间效率。全局效率是站在整个系统的角度上的系统效率;局部效率是站在模块或函数角度上的效率;时间效率是程序处理

12、输入任务所需的时间长短;空间效率是程序所需内存空间,如机器代码空间大小、数据空间大小、栈空间大小等。1 仔细分析有关算法,并进行优化。(1) 用移位来代替2的次幂的乘除法示例:(A/D采样时的均值滤波:每次采样16个点,求16个点的均值)以下代码不规范:sum /= 16 ;应书写为:sum = 4 ;(2) 用减法代替任意的除法示例:(在LED/LCD显示中,常需要将一个无符号整型数的个、十、百位取出来)以下代码不规范:temprature = 253 ;led1 = temperature / 100 ;temperature %= 100 ;led2 = temperature / 10

13、 ;temperature %= 10 ;led3 = temperature ;应书写为:temprature = 253 ;led1=led2=led3=0;while(temperature100) led1+; temperaturn -= 100 ;(3) 用定点数代替浮点数的运算说明:用定点数代替浮点数的基本原则就是单元变换。比如,要对某个电压值进行运算处理,电压的具体值是用浮点数变量voltage_f来表示的,单位是V,精度是mV ,即当voltage_f 1.234 时,则表示当前电压是1.234V,经过单位变换,将最小单位换成mV就可以将浮点换成定点来进行运算,整型变量vol

14、tage_i来表示电压,对应于之前的1.234V,voltage_i 1234 ;2 在多重循环中,应将最忙的循环放在最内层。说明:减少CPU切入循环层的次数。示例:如下代码效率不高。for (row = 0; row 100; row+) for (col = 0; col 5; col+) sum += arowcol; 可以改为如下方式,以提高效率。for (col = 0; col 5; col+) for (row = 0; row 100; row+) sum += arowcol; 3 避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。说明:目的是减少判断次数。循环体

15、中的判断语句是否可以移到循环体外,要视程序的具体情况而言,一般情况,与循环变量无关的判断语句可以移到循环体外,而有关的则不可以。示例:如下代码效率稍低。for (ind = 0; ind MAX_RECT_NUMBER; ind+) if (data_type = RECT_AREA) area_sum += rect_areaind; else rect_length_sum += rectind.length; rect_width_sum += rectind.width; 因为判断语句与循环变量无关,故可如下改进,以减少判断次数。if (data_type = RECT_AREA) f

16、or (ind = 0; ind MAX_RECT_NUMBER; ind+) area_sum += rect_areaind; else for (ind = 0; ind MAX_RECT_NUMBER; ind+) rect_length_sum += rectind.length; rect_width_sum += rectind.width; 4 编程时,要随时留心代码效率;优化代码时,要考虑周全。5 不应花过多的时间拼命地提高调用不很频繁的函数代码效率。6 命名规范1 自己特有的命名风格,要自始至终保持一致,不可来回变化。2 对于变量命名,禁止取单个字符(如i、j、k.),建议

17、除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。3 变量的命名规范。变量的命名规范可参照匈牙利命名法:作用范围域前缀 + 前缀 + 基本类型 + 变量名其中前缀是可选项,以小写字母表示基本类型是必选项,以小写字母表示变量名是必选项,可多个单词(或缩写)合在一起,每个单词首字母大写。示例:g_pCounter: g是前缀,代表是gobal变量,p表示类型是指针,Couter是变量名。基本类型列表:基本类型意义举例cChar 字符cMyChari或nIntger 整数nTestNumberuunsigned integer 无符号整数uCountulunsi

18、gned Long无符号长整数ulTimewword 字wParadwDouble Word双字dwParallong 长整型lParaffloat 浮点数fTotalsString 字符串sTemp4 宏和常量的命名宏和常量的命名规则:单词的字母全部大写,各单词之间用下划线隔开。命名举例:#defineMAX_SLOT_NUM8const int MAX_ARRAY5 函数的命名单词首字母为大写,其余均为小写,单词之间不用下划线。函数名应以一个动词开头。命名举例:void PerformSelfTest(void) ;void GetKeyNum(int* nKey);7 提高代码正确性设计

19、规范1 严禁使用未经初始化的变量。引用未经初始化的变量可能会产生不可预知的后果,特别是引用未经初始化的指针经常会导致系统崩溃,需特别注意。声明变量的同时初始化,除了能防止引用未经初始化的变量外,还可能生成更高效的机器代码。2 注意变量的有效取值范围,防止表达式出现上溢或下溢。示例:死循环代码 例子1:char i ;for(i=0 ; i200 ; i+) ; 应书写为:unsigned char i ;for(i=0 ; i= 0 )/将出现下溢当cIndex等于0 时,再减1不会小于0,而是0xFF,故程序是一个死循环。应书写为:char cIndex = 10;while( cIndex

20、-= 0 )3 防止内存操作越界。说明:内存操作主要是指对数组、指针、内存地址等的操作。内存操作越界是软件系统主要错误之一,后果往往非常严重,所以进行这些操作时一定要仔细小心。(1) 数组越界char aMyArray10;for( i = 0; i = 10; i+ )aMyArrayi = 0;/当i等于10时,将发生越界。(2) 指针操作越界char aMyArray10;char *pMyArray;pMyArray = aMyArray;-pMyArray;/ 越界pMyArray = aMyArray;pMyArray += 10;/ 越界8 可移植性代码设计规范可移植性代码是指可方便移植到其它系统上运行的代码,编写可移植性代码的关键在于使用宏。1 将读写访问硬件资源的基本代码定义为宏。示例:(将外部计数器使能)*P_IOA_DATA |= 0x0001 ;#define ENABLE_COUTER *P_IOA_DATA |= 0x0001 ;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1