您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 嵌入式软件C语言编码规范doc---标准名称
ICS35.060L74中华人民共和国国家标准GB/TXXXXX—XXXX嵌入式软件C语言编码规范EmbeddedSoftwareCLanguageCodingSpecification“在提交反馈意见时,请将您知道的相关专利连同支持性文件一并附上”(征求意见稿)(本稿完成日期:2009-12-23)XXXX-XX-XX发布XXXX-XX-XX实施GB/TXXXXX—XXXXI前言本标准由全国信息技术标准化技术委员会(SAC/TC28)提出并归口。本标准起草单位:中国电子技术标准化研究所、珠海南方软件产品检测中心、炬力集成电路设计有限公司本标准主要起草人:GB/TXXXXX—XXXXII引言嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积和功耗严格要求的专门计算机系统。嵌入式技术并不是一个独立的学科,它是伴随着微电子技术和计算机技术的发展,微控制芯片功能越来越强大,而嵌入微控制芯片的设备和系统越来越多而发展起来的。嵌入式系统几乎包括了生活中所有的电器设备,如:mp3、手机、数字电视、汽车、微波炉、数码相机、电梯、空调、自动售货机、工业自动化仪表与医疗仪器等。尽管C语言是嵌入式软件开发的主要工具,然而C语言并非是专门为嵌入式系统设计的,一是因为标准C语言编写的软件缺乏安全性;二是因为“标准C语言”太庞大了,很难操作。因此,需要制订针对嵌入式系统软件的编码格式要求。本标准是在理解标准C语言的基础上,结合嵌入式软件的开发实践以及嵌入式软件开发中常见的危险编码方式制订的,着重于软件的安全性、可读性。既可作为嵌入式软件开发中的编码要求,也可作为软件交付时验收方的验证要求。在要求条款中,“应”标示的要求是必须符合的,“宜”标示的要求是可选择符合的。GB/TXXXXX—XXXX1嵌入式软件C语言编码规范1范围本标准规定了使用C语言编写嵌入式软件的编码格式要求。本标准也提及了软件设计人员应该注意的与编码相关的事项。本标准适用于嵌入式软件生存周期的编码阶段,主要供具有C语言编程能力的软件编码人员使用。2规范性引用文件下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅所注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。GB/T15272程序设计语言C3术语和定义GB/T15272中界定的以及下列术语和定义适用于本文件。3.1单边作用sideeffect指在表达式执行后对程序运行环境可能会造成影响。赋值语句、自增等操作都是典型的具有单边作用的操作。4编码格式要求4.1总体要求4.1.1编程前应阅读硬件电路和芯片资料――熟悉芯片的各种内存、寄存器地址、中断服务、定时器、通讯接口等功能,必要时将相关信息加入程序注释中。4.1.2编程中应注意程序的存储空间――如指令空间大小、数据空间大小、堆栈空间大小等是否超出系统有关限制。4.1.3使用联合体时,应明确该编译器联合体存储的细节――如联合体的末尾有多少个填充单位、联合体的各个成员如何对齐、多字节的数据类型高低字节如何排放顺序等。4.1.4宜注意硬件系统复位和软件复位的方法和区别――在程序中宜使用芯片提供的看门狗功能实现硬件系统复位。GB/TXXXXX—XXXX24.1.5宜注意CPU对各种存储器的访问速度――在程序中宜利用各种硬件设备自身的特点来提高程序效率。4.1.6应注意所使用的编译器的位数,支持的C语言标准,调试程序所占用的内存,兼容性等特点。4.1.7应注意编译器处理不同数据类型的原则及有关细节――如static局部变量将在内存数据区中生成,而非static局部变量将在堆栈中生成。4.1.8应注意程序开发调试环境和实际应用环境的区别。4.1.9应用程序宜使用操作系统驱动程序来调用硬件端口。4.2内存空间管理类4.2.1在使用malloc等其它函数获取内存时,应判断申请内存是否成功。4.2.2动态内存的申请与释放应配对,防止内存泄漏。应用场景主要包括:a)过程/函数中分配的内存,在过程/函数退出之前要释放;b)过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。错误用法示例:intexample_fun(BYTEgt_len,BYTE*gt_code){BYTE*gt_buf;gt_buf=(BYTE*)malloc(MAX_GT_LENGTH);.../*globaltitlelengtherror*/if(gt_lenMAX_GT_LENGTH){returnGT_LENGTH_ERROR;//退出之前没有释放gt_buf}...//otherprogramcode}正确用法示例:intexample_fun(BYTEgt_len,BYTE*gt_code){BYTE*gt_buf;gt_buf=(BYTE*)malloc(MAX_GT_LENGTH);.../*globaltitlelengtherror*/if(gt_lenMAX_GT_LENGTH)GB/TXXXXX—XXXX3{free(gt_buf);//退出之前释放gt_bufreturnGT_LENGTH_ERROR;}...//otherprogramcode}4.2.3不应引用已经释放的内存空间。4.2.4应防止内存操作越界。应防止越界操作数组、指针、内存地址等内存空间。4.2.5字符串连接宜使用strncat库函数代替strcat库函数,字符串拷贝宜使用strncpy库函数代替strcpy库函数,避免长度不够引起的数组越界。4.2.6使用sprintf库函数时,应注意字符长度,避免长度不够引起的数组越界。4.2.7对于内存受限的系统,宜少用动态内存分配,尽量选用数组。4.2.8对于内存受限的系统,在分配内存时,应考虑内存碎片的问题。4.3中断处理类4.3.1中断服务程序不应有返回值。4.3.2中断服务程序中不应使用printf()函数。4.3.3对于中断中使用到的非局部变量,在中断处理函数中应对其进行入栈保护。4.3.4中断处理程序中的变量,如果会被其他函数执行读操作或者写操作,那么在其他函数读写这个变量前,应先关中断,读写完,再开中断。4.3.5对于开关中断,要注意成对匹配。对于默认开启的中断,如果在某个函数中进行了关闭,在函数退出时需进行相应的开启。对于默认关闭的中断,如果在某个函数中进行了开启,在函数退出时需进行相应的关闭。4.3.6宜避免在中断服务程序中进行浮点数运算。4.4系统接口类4.4.1不应随意更改其它模块或系统的有关设置和配置。4.4.2不应随意改变与其它模块的接口。4.4.3应充分了解系统的接口之后,再使用系统提供的功能。GB/TXXXXX—XXXX44.5硬件系统初始化类4.5.1系统运行之初,应初始化有关变量及运行环境。4.5.2系统运行之初,应对加载到系统中的数据进行一致性检查。4.5.3在硬件系统初始化之前,宜判断工作电压是否已经稳定。4.6软件模块初始化类4.6.1所有变量在使用之前应被初始化。错误用法示例:unsignedintx;unsignedinty;y=x;/*x没有初始值*/4.6.2对局部声明不应用extern初始化。错误用法示例:intfn(void){externintx=0;return(x);}4.6.3数组、结构和联合的初始化列表应显式描述。数组、结构和联合的初始化列表应使用大括号,并使用附加的大括号来指示嵌套的结构;程序员应显式地考虑和描述复杂数据类型的所有元素,不应忽略某个元素的初始化。错误用法示例:int16_ty[3][2]={1,2,3,4,5,6};int16_ty[3][2]={{1,2}};正确用法示例:int16_ty[3][2]={{1,2},{3,4},{5,6}};4.6.4枚举元素的初始化应完整。GB/TXXXXX—XXXX5枚举元素的初始化只有两种形式是安全的,一是初始化所有元素,二是只初始化第一个元素。错误用法示例:enumE_type{num1,num2=2,num3};4.7版面书写类4.7.1文件注释应采用统一格式。文件注释示例:/**Copyright(c)2007,公司名称*Allrightsreserved.*文件名称:filename.c*摘要:简要描述本文件的内容*当前版本:x.x,编写者/修改者,修改时间,修改内容*历史版本:x.x,编写者/修改者,修改时间,修改内容*/4.7.2函数注释应采用统一格式。函数注释示例:/**函数介绍:*参数:*返回值:*备注:*/4.7.3不应使用嵌套的注释。4.7.4应保证注释与代码的一致性,无用的注释应删除。4.7.5对单条语句代码的注释应放在其上方或右方相邻位置。4.7.6对于有物理含义的变量、常量、数据结构(包括数组、结构、类和枚举等),如果其命名不是充分自注释的,在声明时应加以注释,说明其物理含义。4.7.7控制语句应用大括号括起来。错误用法示例:if(a==1)x=y;while((c=getchar())!=EOF)GB/TXXXXX—XXXX6putchar(c);for(;;)timetest(n);正确用法示例:if(a==1){x=y;}while((c=getchar())!=EOF){putchar(c);}for(;;){timetest(n);}4.7.8注释与其上面的代码应用空行隔开。4.7.9宏定义应大写。正确用法示例:#defineMAX100#definePI3.141594.7.10函数风格的宏应用括号“()”括起来。错误用法示例:#defineADD(a,b)a+b正确用法示例:#defineADD(a,b)((a)+(b))4.7.11代码中的一行中只应有一个声明或者一条语句。错误用法示例:inti;intj;/*多个声明*/j=i;i++;/*多条语句*/GB/TXXXXX—XXXX74.7.12超过120个字符的长语句,应分成多行书写。4.7.13一个文件中的程序总行不宜超过2000行。4.7.14一个函数中的程序总行不宜超过200行。4.7.15宜用括号“()”明确表达式的操作顺序,避免使用默认优先级。4.7.16宜避免使用逗号操作符。4.8声明定义类4.8.1头文件中不应有对象或函数的定义。头文件中只存放“声明”而不存放“定义”。4.8.2不应单独使用小写字母“l”或大写字母“O”作为变量名。小写字母“l”很容易与数字“1”混淆,大写字母“O”很容易与数字“0”混淆。4.8.3函数参数不应只有类型名没有标识符。4.8.4使用八进制数应加以注释。八进制数是以0开始,易与十进制数混淆。4.8.5局部变量不应与全局变量重名。4.8.6不应使用未知大小的数组。当声明一个数组时,其大小应该显式声明或者通过初始化进行隐式定义。4.8.7不应重新定义使用C的关键字。4.8.8non-void类型函数的所有出口路径都应该有一个明确的return语句表达式,而不应该只有return。错误用法示例:intfunc(void){…return;}4.8.9在函数参数中不应使用static存储类标识符。GB/TXXXXX—XXXX8错误用法示例:intfunc(staticintx);4.8.10类函数宏调用时不应没有它的参数,并且参数不应多于或少于宏定义时的参数。错误用法示例:#defineABC(x)((x)+3)b=ABC;#defineMAX(a,b)((a)(b)?(a):(b))longmaxnum=MAX(intnum);4.8.11字符型变量应明确定义是有符号的还是无符号的。4.8.12在同一嵌入式软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。例如:可规定接口部分的变量与常量之前加上“模块”标识等。4.8.13在文件范围内声明和定义的所有对象或函数应具有内部链接,除非是在需要外部链接的情况下。如果一个变量只是被同一文件中的函数所使用,那么就用st
本文标题:嵌入式软件C语言编码规范doc---标准名称
链接地址:https://www.777doc.com/doc-4807006 .html