|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本规范主要针对单片机编程语言和08编译器而言,包括排版、注释、命名、变量使用、代码可测性、程序效率、质量保证等内容。
" v7 v! g( X- F; f7 k. d/ v8 X1.基本规则
7 D1 f+ t% Z* }: Z. U& v格式清晰、注释简明扼要、命名规范易懂、函数模块化、程序易读易维护、功能准确实现、代码空间效率和时间效率高、适度的可扩展性、单片机编程规范-标识符命名
1 @$ k/ G8 J" |6 G& t* ]* I2.标识符命名 2.1 命名基本原则 3 X o" V S8 E6 P" A- ]5 _
(1)命名清晰明了,有明确含义,使用完整单词或约定俗成的缩写。通常,较短的单词可通过去掉元音字母形成缩写;较长的单词可取单词的头几个字母形成缩写。即"见名知意"。(2)命名风格要自始至终保持一致。
$ B* @" q# j. }( p h% M7 P9 E(3)命名中若使用特殊约定或缩写,要有注释说明。3 r( I5 _( {, g. N
(4)同一软件产品内模块之间接口部分的标识符名称之前加上模块标识。9 B8 n' B. Y0 l: Z% s7 `, B2 s8 C
2.2 宏和常量命名 8 P( }- E5 i) Z. i: X+ \5 L* o
宏和常量用全部大写字母来命名,词与词之间用下划线分隔。对程序中用到的数字均应用有意义的枚举或宏来代替。9 R+ ~* ^/ k5 M e
2.3 变量命名
5 V' { w2 q5 m- @: o$ V8 u2 e' O变量名用小写字母命名,每个词的第一个字母大写。类型前缀(u8\s8 etc.)全局变量另加前缀g_。0 P/ ~) j9 S) v6 ~
局部变量应简明扼要。局部循环体控制变量优先使用i、j、k等;局部长度变量优先使用len、num等;临时中间变量优先使用temp、tmp等。. R. R0 I [" l" g
2.4 函数命名 + A0 l6 n6 S$ q& G, ~( W% l
函数名用小写字母命名,每个词的第一个字母大写,并将模块标识加在最前面。
( K p2 E9 y0 K9 l7 I' z2.5 文件命名
3 c5 r. Y* ~ o( t) V一个文件包含一类功能或一个模块的所有函数,文件名称应清楚表明其功能或性质。
; b0 U8 a/ M% F每个.c文件应该有一个同名的.h文件作为头文件。 " @" j; `& w; |6 g2 a3 @2 r
3.注释 3.1 注释基本原则
4 o/ z4 C, D- ]- }: R, v有助于对程序的阅读理解,说明程序在"做什么",解释代码的目的、功能和采用的方法。
% F. E2 p+ g4 r- O& p2 v一般情况源程序有效注释量在30%左右。
; u# x8 K2 Y$ T% A+ L注释语言必须准确、易懂、简洁。! [7 s! ]& @ p3 I1 a
边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。1 g! I, m, s3 t
汇编和C中都用"//",取消";" 不使用段注释" /* */ "(调试时可用) % d4 D( R- n, r5 i% [! b
3.2 文件注释
$ |9 o3 I) e- R; ]* W( i文件注释必须说明文件名、函数功能、创建人、创建日期、版本信息等相关信息。
B5 _6 H4 ]* {! n- j3 r8 X修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。所有修改记录必须保持完整。
: R$ V; |/ o7 K1 t" @, J文件注释放在文件顶端,用"/*……*/"格式包含。
1 N7 C# C# j" n* d. t1 R注释文本每行缩进4个空格;每个注释文本分项名称应对齐。
" d. S) m' c* D: ?# D/***********************************************************
; x5 E' v) M" c* @" r文件名称:
) i0 x$ }9 l1 l2 Q- u0 e作 者:7 r, E$ {' m" E8 R
版 本:
) w$ T: t) H3 ^3 B3 {说 明:8 I, w8 f% K/ `/ J- s
修改记录:+ d8 H( g5 J' _' d9 n% A
***********************************************************/
4 m4 M9 P$ W. u6 O) }1 M0 p3.3 函数注释 & d& w+ T2 o! l0 U% p7 C0 l
3.3.1 函数头部注释6 |0 z" V+ r. @; g
函数头部注释应包括函数名称、函数功能、入口参数、出口参数等内容。如有必要还可增加作者、创建日期、修改记录(备注)等相关项目。
% @$ Z& ]0 N/ {9 a函数头部注释放在每个函数的顶端,用"/*……*/"的格式包含。其中函数名称应简写为Name(),不加入、出口参数等信息。/ _# M( v! A( u' v. j2 ]( E, F. b O
/***********************************************************
; X% H2 V) F- N函数名称:1 H# L; }" _6 c# S( T2 c$ j Z2 B( J
函数功能:# ]) W3 n+ Y/ p( U6 L( r
入口参数:
1 g8 p) @' r# @; i! h出口参数:
+ \# O+ I# O1 P; d备 注:- B! C0 Q; W3 B% w
***********************************************************/
+ v4 ?' E2 O n% k' c) l0 w3.3.2 代码注释(信、盈、达‘腾讯:以一齐捂捂吧久零久要’)" z; R0 ?5 K8 L. e' i7 J8 y3 }
代码注释应与被注释的代码紧邻,放在其上方或右方,不可放在下面。如放于上方则需与其上面的代码用空行隔开。一般少量注释应该添加在被注释语句的行2尾,一个函数内的多个注释左对齐;较多注释则应加在上方且注释行与被注释的语句左对齐。
# W$ U4 _4 ^ ~4 Y% H函数代码注释用"//…//"的格式。
/ S8 A- Q( Z9 I0 G通常,分支语句(条件分支、循环语句等)必须编写注释。其程序块结束行"}"的右方应加表明该程序块结束的标记"end of ……", 尤其在多重嵌套时。+ N' h$ j' E: n8 Z$ g5 Y
3.4 变量、常量、宏的注释
7 t" J, O9 ~9 X同一类型的标识符应集中定义,并在定义之前一行对其共性加以统一注释。对单个标识符的注释加在定义语句的行尾。1 g! q5 b9 `6 [4 x
全局变量一定要有详细的注释,包括其功能、取值范围、哪些函数或过程存取它以及存取时的注意事项等。
3 A- `$ o7 v$ `! l7 t注释用"//…//"的格式。 + c& w5 B: M9 |( e% Y1 E
4.函数 4.1 函数设计原则 2 m2 F6 E4 \1 q, k6 A- ^2 w
函数的基本要求: % u0 S, p; S! f( ^ j2 Y6 l
1)封装性
! B; \5 l& L3 Z. a- w' I. y6 k1) 正确性:程序要实现设计要求的功能。
6 A% y) q, L( a% @% o9 H, p2) 稳定性和安全性:程序运行稳定、可靠、安全。
+ R; f& _! [8 n1 f4 A3 b3) 可测试性:程序便于测试和评价。+ |$ d& y6 N4 k' W( _9 \% c
4) 规范/可读性:程序书写风格、命名规则等符合规范。
W4 ^" k( x9 M+ z, c5) 扩展性:代码为下一次升级扩展留有空间和接口。+ l- T7 `: I8 j# @( ^
6) 全局效率:软件系统的整体效率高。5 Y1 |7 n- c/ o
7) 局部效率:某个模块/子模块/函数的本身效率高。2 j. N( R, e& _
编制函数的基本原则:4 x0 v2 y9 ]3 ?7 J9 }
1) 单个函数的规模尽量限制在200行以内(不包括注释和空行)。一个函数只完成一个功能。3 K0 F1 T. h- w6 Y# l0 ?
2) 函数局部变量的数目一般不超过5~10个。
$ @+ A9 b b% r% \; m# F3) 函数内部局部变量定义区和功能实现区(包含变量初始化)之间空一行。8 ^: l; E6 [& G
4) 函数名应准确描述函数的功能。通常使用动宾词组为执行某操作的函数命名。0 \) V8 X, J3 h& B( W2 L5 {8 ]
5) 函数的返回值要清楚明了,尤其是出错返回值的意义要准确无误。7 k8 g9 B7 }7 _9 l2 T
6) 不要把与函数返回值类型不同的变量,以编译系统默认的转换方式或强制的转换方式作为返回值返回。9 R+ r. T# h) G$ `0 N
7) 减少函数本身或函数间的递归调用。
% r! B* f5 m2 c8) 尽量不要将函数的参数作为工作变量。
5 q |0 k; F5 ?. m& ^4.2 函数定义
2 `/ D4 v7 K% T) e# E' ]1) 函数若没有入口参数或者出口参数,应用void明确申明。! D. w! @# I+ L
2) 函数名称与出口参数类型定义间应该空一格且只空一格。
& U3 m# v# A' x3 z. |% A! {# E3) 函数名称与括号()之间无空格。
$ g1 I# M1 Q, I8 J! v0 R4) 函数形参必须给出明确的类型定义。
. f# m7 x$ @" D: Z& e5) 多个形参的函数,后一个形参与前一个形参的逗号分割符之间添加一个空格。4 P2 p& P* _! ?8 a9 g" Q: D
6) 函数体的前后花括号"{}" 各独占一行。* N- r) |1 {- u/ u q
4.3 局部变量定义 ; R$ Y. u7 o5 J9 E1 H2 p
1) 同一行内不要定义过多变量。& E( c- K# j0 e* }
2) 同一类的变量在同一行内定义,或者在相邻行定义。" {% d# s& k6 N' `7 g
3) 先定义data型变量,再定义idtata型变量,再定义xdata型变量.(?)" K' Z: z c, u6 V k& F w6 `. c
4) 数组、指针等复杂类型的定义放在定义区的最后。. u$ h* x5 {; f/ a( g3 O
5) 变量定义区不做较复杂的变量赋值。
& d" @" D" D+ d5 Z q! U2 h( H4.4 功能实现区规范 : Z t+ m% k$ k4 G" n" {
1) 一行只写一条语句。7 N" I" K0 \7 ?5 k6 C/ v
2) 注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。! p2 l7 p9 S. `2 f7 a U
3) 各程序段之间使用一个空行分隔,加以必要的注释。程序段指能完一个较具体的功能的一行或多行代码。程序段内的各行代码之间相互依赖性较强。(1、2、3方式)
- N, S" J% R+ E5 J' F4) 不要使用难懂的技巧性很高的语句。 D9 A! [4 X: r
5) 源程序中关系较为紧密的代码应尽可能相邻。' J, F& z/ W7 g8 u
6) 完成简单功能、关系非常密切的一条或几条语句可编写为函数或定义为宏。
! H5 k1 k! K# ?5 M$ }! @; [5. 单片机编程规范-排版
( l) A; l- D8 |' v8 o! t% ] 2 D, Y; f4 E; a: ?( o* H
|
|