GB T 28169-2011 嵌入式软件.C语言编码规范.pdf
《GB T 28169-2011 嵌入式软件.C语言编码规范.pdf》由会员分享,可在线阅读,更多相关《GB T 28169-2011 嵌入式软件.C语言编码规范.pdf(28页珍藏版)》请在麦多课文档分享上搜索。
1、ICS 35.060 L 74 道B中华人民共和国国家标准G/T 28169-2011 嵌入式软件C语言编码规范Embedded software-C language coding specification 2011田12-30发布2012-06-01实施数码防伪中华人民共和国国家质量监督检验检茂总局中国国家标准化管理委员会发布GB/T 28169-2011 目次前言. . . . . . . 1lI 引言.凹1 范围-2 规范性引用文件3 术语和定义.4 编码规范要求4. 1 总体要求.4.2 内存空间管理类.2 4. 3 中断处理类.3 4.4 系统接口类. 3 4.5 硬件系统初始化
2、类.34.6 软件模块初始化类.4.7 版面书写类.4 4.8 声明定义类.4.9 控制语句类4. 10 类型转换类.10 4.11 指针、数组使用类.4.12 运算处理类.14 4.13 函数使用类4. 14 冗余类174. 15 程序效率类.17 5 符合性.18 附录A(资料性附录)符合性矩阵.参考文献.20I GB/T 28169-2011 目。吕本标准按照GB/T1. 12009给出的规则起草。请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。本标准由全国信息技术标准化技术委员会(SAC/TC28)提出并归口。本标准起草单位:中国电子技术标准化研究所、珠海
3、南方软件产品检测中心、炬力集成电路设计有限公司、珠海许继电气有限公司、珠海优特电力科技股份有限公司、东信和平智能卡股份有限公司、深圳市吉阳自动化科技有限公司、上海博泰悦臻电子设备制造有限公司、珠海银邮光电技术发展股份有限公司、上海嵌入式系统应用工程技术研究中心、上海超算并行软件有限责任公司、上海鲁齐信息科技有限公司、大连共创软件有限公司等。本标准主要起草人z侯建华、潘海洋、杨哲军、张展新、张亚伟、罗庆霞、齐建华、陈勇、张肠肠、阳如坤、于晓菁、代玉宏、吴智凯。皿GB/T 28169-2011 引嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可剪裁,适应应用系统对功能、可靠性、成本、体积和
4、功耗严格要求的专门计算机系统。嵌入式系统几乎包括了生活中所有的电器设备,还广泛应用于船舶、机床、仪表、工业自动化仪表及航空航天等领域。尽管C语言是嵌入式软件开发的主要工具,然而C语言并非是专门为嵌入式系统应用而设计的。因此,需要制定针对嵌入式系统软件的编码规范要求。本标准是在理解标准C语言的基础上,结合嵌入式软件的开发实践以及嵌入式软件开发中常见的不规范编码方式制定的,着重于软件的安全性、可读性,既可作为嵌入式软件开发中的编码要求,也可作为软件交付时验收方的验证要求。N GB/T 28169-2011 嵌入式软件C语言编码规范1 范围本标准规定了使用C语言在嵌入式软件编程中的规范要求。本标准也
5、给出了在嵌入式系统开发中应该注意的与编码相关的事项。本标准适用于嵌入式软件生存周期的C语言的设计、编码、测试及其使用。2 规范性引用文件下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。GB/T 15272 程序设计语言C 3 术语和定义GB/T 15272界定的以及下列术语和定义适用于本文件。3. 1 副作用side effect 在表达式执行后对程序运行环境可能会造成影响。赋值语句、自增等操作都是典型的具有副作用的操作。4 编码规范要求4. 1 总体要求4. 1. 1 编程前应阅读硬件
6、电路和芯片资料熟悉芯片的各种存储器(区)、寄存器地址、中断服务、定时器、通讯接口等功能,必要时应将相关信息加入程序注释中。4. 1. 2 编程中应注意程序的存储空间一一-如指令空间大小、数据空间大小、堆枝空间大小等是否超出系统有关限制。4. 1. 3 使用联合体时,应明确该编译器联合体存储的细节-如联合体的末尾有多少个填充单位、联合体的各个成员如何对齐、多字节的数据类型高低字节排放顺序等。4.1.4 宜注意硬件系统复位和软件复位的方法和区别一一-在程序中宜使用芯片提供的看门狗功能实现硬件系统复位。4. 1. 5 宜注意CPU对各种存储器的访问速度一一在程序中宜利用各种硬件设备自身的特点来提高程
7、序效率。4.1.6 应注意所使用的编译器的目标CPU的位数、支持的C语言标准、调试程序所占用的内存、兼容性等特点。4.1.7 应注意编译器处理不同数据类型的原则及有关细节如static类别的局部变量将在内存数据区中生成,而非statlc类别的局部变量将在堆找中生成。4. 1. 8 应注意程序开发调试环境和实际应用环境的区别。G/T 28169-2011 4.1.9 应用程序宜使用操作系统驱动程序来调用硬件端口。4.2 内存空间管理类4.2.1 在使用malloc等函数获取内存时,应对分配失败做异常处理。4.2.2 动态内存的申请与释放应配对,防止内存泄漏。应用场景主要包括:a) 过程或函数中分
8、配的内存,在过程、函数退出之前要释放;b) 过程或函数中申请的(为打开文件而使用的)文件句柄,在过程、函数退出之前要关闭。规范用法示911: int examp1e_fun (BYTE gt_1阻,BYTE提供一code)BYTE祷gt_buf;gt_buf = (BYTE叫malloc(MAX_GT_LENGTH); /秘g10ba1title length ;rror提/if (gt_1enMAX_GT皿NG四free (gt_buf);/ /退出之前释放gt_bufreturl1 GT I血NGTHERROR; 不规范用法示911: int examp1e_fun (BYTE gt_1e
9、n,BYTE祷gt_code)BYTE * gt_buf; gt buf = (BYTE开)malloc (MAX_GT_LENGTH); /铸globa1title 1ep.gth error养/if (gt_lenM皿.GT一皿盹四)return GT_皿NGTH一回ROR;/退出之前没有释放gt_buf4.2.3 不应使用已经释放的内存空间。4.2.4 应防止越界操作数组、指针、内存地址等内存空间。4.2.5 字符串连接宜使用strncat库函数代替strcat库函数,字符串拷贝宜使用strncpy库函数代替strcpy库函数,避免长度不够引起的数组越界。4.2.6 使用sprintf库
10、函数时,应注意字符长度,避免长度不够引起的数组越界。4.2.7 对于内存受限的系统,宜减少使用动态内存分配,多采用静态分配,在程序编译时就确定所需的空间。4.2.8 对于内存受限的系统,在分配内存时,应考虑内存碎片的问题。2 G/T 28169-2011 4.2.9 对于动态分配的内存指针和文件句柄,在定义的时候应初始化为空,访问的时候应判断是否为空,在释放完成后应设为空。4.3 中断处理类4.3.1 中断服务程序不应带回返回值。4.3.2 不应在中断服务程序中使用printf、malloc等函数。4.3.3 对于中断中使用到的非局部变量,在中断处理函数中应对其进行人找保护。4.3.4 中断处
11、理程序中的变量,如果会被其他函数执行读操作或者写操作,那么在其他函数读写这个变量前,应先关中断,再读写,之后再开中断。4.3.5 对于开关中断,应注意成对匹配一一对于默认开启的中断,如果在某个函数中进行了关闭,在函数退出时需进行相应的开启;对于默认关闭的中断,如果在某个函数中进行了开启,在函数退出时需进行相应的关闭。4.3.6 不应在中断服务程序中进行浮点数运算。4.4 系统接口类4.4.1 不应更改其他模块或系统的有关设置和配置。4.4.2 不应改变与其他模块的接口。4.4.3 应充分了解系统的接口之后,再使用系统提供的功能。4.5 硬件系统初始化类4.5.1 系统运行之初,应初始化有关变量
12、及运行环境。4.5.2 系统运行之初,应对加载到系统中的数据进行一致性检查。4.5.3 在硬件系统初始化之前,有条件时应检测工作电压是否已经稳定。4.6 软件模块初始化类4.6.1 所有变量在使用之前应被初始化。规范用法示例:nun xy +nn 时时mdmJ;一-1lx SSEE-mmr一不规范用法示例zxvd LL+L nn d时mdmvu,一阳山一4.6.2 不应在局部作用域声明变量时使用extern。不规范用法示9JJ: int foo (void) extern int x = 0 ; return (x); 3 GB/T 28169-2011 4.6.3 数组、结构和联合的初始化列
13、表应使用大括号,并使用附加的大括号来指示嵌套的结构E程序员应显式地考虑和描述复杂数据类型的所有元素,不应忽略某个元素的初始化。规范用法示例:int16 _ t Y 3 J 2 J = 1 ,2 , 3 ,4 , 5 ,6 ; 不规范用法示例zint16_t Y 3J 2J = 1 ,2 ,3 ,4 ,5 ,6; int16_t y 3J 2J = 1 ,2; 4.6.4 枚举元素的初始化应完整一一如果对枚举元素进行初始化,只能通过以下两种形式:a) 初始化所有元素;b) 只初始化第一个元素。规范用法示例:enum E_typenuml = 1 ,num2 = 2,nu皿3= 3; enum E
14、_typenuml = 1 ,num2 ,num3; 不规范用法示伊g:|enum E川enuml ,num2 = 2 ,num3 ; 4. 7 版面书写类4.7. 1 文件注释应采用统一格式。宜使用格式如下:规范用法示例:/祷祷Copyright(c) 2007,公司名称祷Allrights reserved. 禄文件名称:fil四ame.c公摘要:简要描述本文件的内容替当前版本:X.X,编写者、修改者、修改时间、修改内容铃历史版本:X.X,编写者、修改者、修改时间、修改内容祷/4.7.2 函数注释应采用统一格式。推荐使用格式如下:规范用法示例:/祷铃函数介绍:祷参数:祷返回值2提备注:祷/
15、4.7.3 不应使用嵌套的注释。4.7.4 应保证注释与代码的一致性,元用的注释应删除。4.7.5 对单条语句代码的注释应放在其上方或右方相邻位置。4.7.6 对于有物理含义的变量、常量、数据结构,如果其命名不是充分自注释的,在声明时应加以注释,说明其物理含义。4 G/T 28169-2011 4.7.7 iLfor,do、while、switch等语句的执行语句部分应使用大括号括起来。规范用法示例:if (a= 1) x= Y; while (b! = 0) putchar (c) ; for (; ;) timetest (n); 不规范用法示伊tl:if (a= 1) x= Y; whi
16、le (b! = 0) putchar (c) ; for (;) timetest (n) ; 4.7.8 注释与其上面的代码应使用空行隔开。4.7.9 宏定义标识符应使用大写字母。规范用法示例:5-4-01-ul-M工MP ee nn-ff ee一,GEd一忡廿扑廿一不规范用法示例:| 忡叫f丑hin#define pi 3.141 59 4.7. 10 函数式宏定义的参数和定义体应使用括号0括起来,但是含有#和#操作符的除外。规范用法示91J:|#削neADD (a,b) (a) + (b) 不规范用法示91J:|#削ne皿D(讪a+b4.7. 11 代码中的一行中只应有一个声明或者一条
17、语句。5 GB/T 28169-2011 不规范用法示例zint i; int j; !铃一行中包含多个声明铸/j=i;i+; !替一行中包含多条语句著/4.7. 12 超过120个字符的长语句,宜分成多行书写。4.7. 13 一个文件中的程序总行不宜超过2000行。4.7. 14 一个函数中的程序总行不宜超过200行。4.7. 15 宜用括号0明确表达式的操作顺序,避免使用默认优先级。4.7.16 不应使用逗号操作符,但是for语句的第一和第三表达式除外。4.8 声明定义类4.8. 1 头文件中只应存放对象或函数的声明,不应存放对象或函数的定义。4.8.2 不应单独使用小写字母1或大写字母0
18、作为变量名。注:小写字母1很容易与数字叮叮昆淆,大写字母0很容易与数字0混淆。4.8.3 函数参数、结构体和联合体的成员不应只有类型名没有标识符的情况出现。4.8.4 使用八进制数应加以注释。注:八进制数以0开始,易与十进制数混淆。4.8.5 局部变量和参数不应与全局变量重名,应避免结构体名、联合体名、枚举名重名。4.8.6 不应使用未知大小的数组。当声明一个数组时,其大小应该显式声明或者通过初始化进行隐式定义。4.8.7 不应重新定义使用C的关键字。4.8.8 非void类型函数每个出口都应有一个含有返回值的return语句,并且返回值与函数返回类型应一致。规范用法示f91J: int fu
19、nc (void) int x = 1; return (x); 不规范用法示f91J: int func (void) return; 4.8.9 不应在函数参数中使用statlc存储类别。不规范用法示例:|int func (时北intx); 4.8.10 调用函数式宏定义时,其参数个数与宏定义时的应一致。GB/T 28169-2011 规范照法示例:j:j: define阻c(x) (x) + 3) a=且BC(b); :j:j: define MAX归,b)(a)(b)? (a):(b) long maxnum = MAX (numl ,num2); 不规范用法示例:斗中defineA
20、BC (x) (x) + 3) a=且BC;丰丰defineMAX (a,b) (的(b)?(a) :(b) long maxnum = MAX (num) ; 4.8. 11 字符型变量应明确定义是有符号的还是无符号的。4.8. 12 在同一嵌入式软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突例如,可规定接口部分的变量与常量之前加上模块名称标识等。4.8. 13 在文件范围内声明和定义的所有对象或函数均应具有内部链接,除非是在需要外部链接的情况下。4.8. 14 用typedef自定义的类型不应被重新定义。注:改变用户自定义的类型会引起混淆甚至能
21、导致错误。4.8. 15 匹配的预处理语句:j:j: if、:j:j: else、:j:j: elseif和:j:j:endif不应被分散在不同的文件之中。4.8.16 :j:j:if表达式中使用的宏应该已经被定义,并且:j:j: if表达式只能包含整型常量。不规范用法示f91J: :j:j: define BIG工配32767:j:j: define BIG阻ALle3B :j:j: if (BIG阻且LBIGINT)/祷BIGRE泣,是浮点型常数赞/#四dif4.8. 17 应避免一个头文件的内容被包含两次。4.8. 18 宏如果需要被重定义,应该先用:j:j:undef解除前面的定义。4
22、.8. 19 除了编译开关和头文件等特殊应用外,不应使用一EXAMPLE_TEST _之类以下划线字符二开始和结尾的定义。4.8.20 标识符命名中不应包含两个连续的下划线字符一。4.8.21 不应使用static存储类别定义标记。不规范用法示f91J: i static s叩S叫t句intb; 4.8.22 不应把地址操作符&.用于一个声明为register的对象。7 G/T 28169-2011 不规范用法示例zstatic void foo (void) register int a; 口吐*pa; pa=&a; I赞&不应用于一个声明为register类型的对象椿/r呵isteri眈a
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GB 28169 2011 嵌入式 软件 语言 编码 规范
