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

上传人:b****5 文档编号:21157054 上传时间:2023-01-28 格式:DOCX 页数:12 大小:20.70KB
下载 相关 举报
单片机程序设计规范与技巧Word下载.docx_第1页
第1页 / 共12页
单片机程序设计规范与技巧Word下载.docx_第2页
第2页 / 共12页
单片机程序设计规范与技巧Word下载.docx_第3页
第3页 / 共12页
单片机程序设计规范与技巧Word下载.docx_第4页
第4页 / 共12页
单片机程序设计规范与技巧Word下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

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

《单片机程序设计规范与技巧Word下载.docx》由会员分享,可在线阅读,更多相关《单片机程序设计规范与技巧Word下载.docx(12页珍藏版)》请在冰豆网上搜索。

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

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.在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;

进行非对等操作时,如果是关系密切的立即操作符(如->

),后不应加空格。

说明:

采用这种松散方式编写代码的目的是使代码更加清晰。

(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;

//地址操作"

与内容之间

//"

"

(4)"

->

."

前后不加空格。

p->

id=pid;

指针前后不加空格

(5)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。

if(a>

=b&

c>

d)

3.注释规范

1.一般情况下,源程序有效注释量必须在20%以上

注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。

2.说明性文件(如头文件.h文件、.inc文件)头部应进行注释,注释必须列出:

版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、头文件的注释中还应有函数功能简要说明。

下面为一头文件的头部注释的模板

/*************************************************

Copyright(C),2005,HUST

Filename:

test.h//文件名

Author:

Version:

Date:

//作者、版本及完成日期

Description:

//用于详细说明此程序文件完成的主要功能,与其他模块

//或函数的接口,输出值、取值范围、含义及参数间的控

//制、顺序、独立或依赖等关系

Others:

//其它内容的说明

FunctionList:

//主要函数列表,每条记录应包括函数名及功能简要说明

*************************************************/

3.源文件头部应进行注释,列出:

版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能等。

下面为一源文件的段头注释的模板

/************************************************************

FileName:

test.c

Version:

//模块描述

//版本信息

//主要函数及其功能

1.-------

***********************************************************/

4.函数头部应进行注释,列出:

函数的目的/功能、输入参数、输出参数、返回值等。

下面为一函数头部注释的模板

Function:

//函数名称

//函数功能、性能等的描述

Input:

//输入参数说明,包括每个参数的作

//用、取值说明及参数间关系。

Output:

//对输出参数的说明。

Return:

//函数返回值的说明

//其它说明

5.注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

如下例子不符合规范。

例1:

/*getreplicatesubsystemindexandnetindicator*/

 

例2:

6.注释与所描述内容进行同样的缩排。

这样可使程序排版整齐,并方便注释的阅读与理解。

如下例子,排版不整齐,阅读稍感不方便。

voidexample_fun(void)

/*codeonecomments*/

CodeBlockOne

/*codetwocomments*/

CodeBlockTwo

应改为如下布局。

/*codeonecomments*/

7.将注释与其上面的代码用空行隔开。

如下例子,显得代码过于紧凑。

programcodeone

/*codetwocomments*/

programcodetwo

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;

led1=led2=led3=0;

while(temperature<

100)

led1++;

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;

row<

100;

row++)

for(col=0;

col<

5;

col++)

{

sum+=a[row][col];

}

可以改为如下方式,以提高效率。

for(col=0;

for(row=0;

3.避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。

目的是减少判断次数。

循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而言,一般情况,与循环变量无关的判断语句可以移到循环体外,而有关的则不可以。

如下代码效率稍低。

for(ind=0;

ind<

MAX_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;

else

4.编程时,要随时留心代码效率;

优化代码时,要考虑周全。

5.不应花过多的时间拼命地提高调用不很频繁的函数代码效率。

6.命名规范

1.自己特有的命名风格,要自始至终保持一致,不可来回变化。

2.对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。

3.变量的命名规范。

变量的命名规范可参照匈牙利命名法:

[作用范围域前缀]+[前缀]+基本类型+变量名

其中前缀是可选项,以小写字母表示

基本类型是必选项,以小写字母表示

变量名是必选项,可多个单词(或缩写)合在一起,每个单词首字母大写。

g_pCounter:

g是前缀,代表是gobal变量,p表示类型是指针,Couter是变量名。

基本类型列表:

基本类型

意义

举例

c

Char字符

cMyChar

i或n

Intger整数

nTestNumber

u

unsignedinteger无符号整数

uCount

ul

unsignedLong 

无符号长整数

ulTime

w

word字

wPara

dw

DoubleWord 

双字

dwPara

l

long长整型

lPara

f

float浮点数

fTotal

s

String字符串

sTemp

4.宏和常量的命名

宏和常量的命名规则:

单词的字母全部大写,各单词之间用下划线隔开。

命名举例:

#define 

MAX_SLOT_NUM 

8

constintMAX_ARRAY

5.函数的命名

单词首字母为大写,其余均为小写,单词之间不用下划线。

函数名应以一个动词开头。

voidPerformSelfTest(void);

voidGetKeyNum(int*nKey);

7.提高代码正确性设计规范

1.严禁使用未经初始化的变量。

引用未经初始化的变量可能会产生不可预知的后果,特别是引用未经初始化的指针经常会导致系统崩溃,需特别注意。

声明变量的同时初始化,除了能防止引用未经初始化的变量外,还可能生成更高效的机器代码。

2.注意变量的有效取值范围,防止表达式出现上溢或下溢。

死循环代码

例子1:

chari;

for(i=0;

i<

200;

i++)

……;

unsignedchari;

例子2:

unsignedcharcIndex=10;

while(cIndex-- 

=0)

//将出现下溢

当cIndex等于0时,再减1不会小于0,而是0xFF,故程序是一个死循环。

charcIndex=10;

3.防止内存操作越界。

内存操作主要是指对数组、指针、内存地址等的操作。

内存操作越界是软件系统主要错误之一,后果往往非常严重,所以进行这些操作时一定要仔细小心。

(1)数组越界

charaMyArray[10];

for(i=0;

i<

=10;

i++)

aMyArray[i]=0;

//当i等于10时,将发生越界。

(2)指针操作越界

char*pMyArray;

pMyArray=aMyArray;

--pMyArray;

//越界

pMyArray+=10;

8.可移植性代码设计规范

可移植性代码是指可方便移植到其它系统上运行的代码,编写可移植性代码的关键在于使用宏。

1.将读写访问硬件资源的基本代码定义为宏。

(将外部计数器使能)

*P_IOA_DATA|=0x0001;

#defineENABLE_COUTER*P_IOA_DATA|=0x0001;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学计划

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

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