嵌入式软件C语言编码规范.pdf

所需积分/C币:40 2019-08-31 16:52:06 373KB PDF
191
收藏 收藏
举报

嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可剪裁,适应应用系统对功能、可靠 性、成本、体积和功耗严格要求的专门计算机系统。嵌入式系统几乎包括了生活中所有的电器设备,还 广泛应用于船舶、机床、仪表、工业自动化仪表及航空航天等领域。 尽管C语言是嵌入式软件开发的主要工具,然而C语言并非是专门为嵌入式系统应用而设计的。 因此,需要制定针对嵌入式系统软件的编码规范要求。 本标准是在理解标准C语言的基础上,结合嵌入式软件的开发实践以及嵌入式软件开发中常见的 不规范编码方式制定的,着重于软件的安全性、可读性,既可作为嵌入式软件开发中的编码要求,也可作 为软件交付时验收方的验证要求。
GB/T28169-2011 前言 本标准按照GB/T1.1-2009给出的规则起草。 请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。 本标准由全国信息技术标准化技术委员会(SAC/TC28)提出并归口 本标准赶草单位:中国电子技术标准化研究所、珠海南方软件产品检测中心炬力集成电路设计有 限公司、珠海许继电气有限公司珠海优特电力科技股份有限公司东信和平智能卡股份有限公司、深圳 市吉阳自动化科技有限公司、上海博泰悦臻电子设备制造有限公司、珠海银邮光电技术发展股份有限公 可、上海嵌入式系统应用工程技术研究中心、上海超算并行软件有限责任公司、上海鲁齐信息科技有限 公司、大连共创软件有限公司等 本标准主要起草人侯建华潘海洋、杨哲军、张展新、张亚伟、罗庆霞、齐建华、陈勇、张旸肠、阳如坤 于晓菁、代玉宏、吴智凯。 Ⅲ GB/T28169—2011 嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可剪裁,适应应用系统对功能、可靠 性成本、体积和功耗严格要求的专门计算机系统。嵌入式系统几乎包括了生活中所有的电器设备,还 广泛应用于船舶、机床、仪表、工业自动化仪表及航空航天等领域 尽管C语言是嵌入式软件开发的主要工具,然而C语言并非是专门为嵌入式系统应用而设计的 因此,需要制定针对嵌入式系统软件的编码规范要求 本标准是在理解标准C语言的基础上,结合嵌人式软件的开发实践以及嵌入式软件开发中常见的 不规范编码方式制定的,着重于软件的安全性、可读性既可作为嵌入式软件开发中的编码要求,也可作 为软件交付时验收方的验证要求 GB/T28169-2011 嵌入式软件C语言编码规范 1范围 本标准规定了使用C语言在嵌入式软件编程中的规范要求。本标准也给出了在嵌入式系统开发 中应该注意的与编码相关的事项。 本标准适用于嵌入式软件生存周期的C语言的设计编码、测试及其使用。 2规范性引用文件 下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文 件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件 GB/T15272程序设计语言C 3术语和定义 GB/T15272界定的以及下列术语和定义适用于本文件 刚作用 side effect 在表达式执行后对程序运行环境可能会造成影响。赋值语句、自增等操作都是典型的具有副作用 的操作 编码规范要求 4.1总体要求 4.1.编程前应阅读硬件电路和芯片资料——熟悉芯片的各种存储器(区)、寄存器地址、中断服务、定 时器通讯接口等功能,必要时应将相关信息加入程序注释中 4.1.2编程中应注意程序的存储空间——如指令空间大小数据空间大小、堆栈空间大小等是否超出 系统有关限制 4.1.3使用联合体时,应明确该编译器联合体存储的细节—如联合体的末尾有多少个填充单位、联 合体的各个成员如何对齐、多字节的数据类型高低字节排放顺序等 4.1.4宜注意硬件系统复位和软件复位的方法和区别在程序中宜使用芯片提供的看门狗功能实 现硬件系统复位。 4.1.5宜注意CPU对各种存储器的访问速度一在程序中宜利用各种硬件设备自身的特点来提高 程序效率。 4.1.6应注意所使用的编译器的目标CPU的位数、支持的C语言标准、调试程序所占用的内存兼容 性等特点 4.1.7应注意编译器处理不同数据类型的原则及有关细节—如stat类别的局部变量将在内存数 据区中生成,而非 static类别的局部变量将在堆栈中生成。 4.1.8应注意程序开发调试环境和实际应用环境的区别。 GB/T28169—2011 4.1.9应用程序宜使用操作系统驱动程序来调用硬件端口 4.2内存空间管理类 4.2.1在使用mllc等函数获取内存时,应对分配失败做异常处理。 4.2.2动态内存的申请与释放应配对,防止内存泄漏。应用场景主要包括: a)过程或函数中分配的内存,在过程、函数退出之前要释放 b)过程或函数中申请的(为打开文件而使用的)文件句柄,在过程、函数退出之前要关闭。 规范用法示例 int example_ fun(BYiE gt_ len, BYTE gt_code) BYI黃 gt buf gt buf =(BYTE*)malloc (MAX_Gr_LENGTH) / global title length error * if (gt len> MAX Gr_LENGTH) free( st buf);//退出之前释放 gt buf return GT LENGTH ERROR; 不规范用法示例 int example fun(BYTE gt len, BYTE *gt_code) bYtE gt buf buf=(BYtE*)malloc (MAX Gr_LENGTH); /x global title length error * f (gt len>MAX GT LENGIH) return Gf LENGTH ERROR/退出之前没有释放gtuf 4.2.3不应使用已经释放的内存空间。 42.4应防止越界操作数组、指针、内存地址等内存空间 4.25字符串连接宜使用 strncat库函数代替 strcat库函数,字符串拷贝宜使用 strncpy库函数代替 strcpy库函数,避免长度不够引起的数组越界。 4.2.6使用 sprintf库函数时,应注意字符长度,避免长度不够引起的数组越界。 4.2.7对于内存受限的系统,宜减少使用动态内存分配,多釆用静态分配,在程序编译时就确定所需的 空间 4.28对于内存受限的系统,在分配内存时,应考虑内存碎片的问题。 GB/T28169-2011 4.2.9对于动态分配的内存指针和文件句柄,在定义的时候应初始化为空,访问的时候应判断是否为 空,在释放完成后应设为空。 4.3.中断处理类 4.3.1中断服务程序不应带回返回值。 4.3.2不应在中断服务程序中使用 printf、mlle等函数。 4.3.3对于中断中使用到的非局部变量,在中断处理函数中应对其进行人栈保护。 4。 中断处理程序中的变量,如果会被其他函数执行读操作或者写操作,那么在其他函数读写这个 变量前,应先关中断,再读写,之后再开中断 43.5对于开关中断,应注意成对匹配—对于默认开启的中断,如果在某个函数中进行了关闭,在函 数退出时需进行相应的开启;对于默认关闭的中断,如果在某个函数中进行了开启,在函数退出时需进 行相应的关闭。 4.3.6不应在中断服务程序中进行浮点数运算 4.4系统接口类 4.4.1不应更改其他模块或系统的有关设置和配置。 4.4.2不应改变与其他模块的接口。 4.4.3应充分了解系统的接口之后,再使用系统提供的功能 4.5硬件系统初始化类 4.5.1系统运行之初,应初始化有关变量及运行环境。 4.5.2系统运行之初,应对加载到系统中的数据进行一致性检查。 4.5.3在硬件系统初始化之前,有条件时应检测工作电压是否已经稳定 4.6软件模块初始化类 4.6.1所有变量在使用之前应被初始化。 觌范用法示例: unsigned int x=0 unsigned int y=0 不规范用法示例: unsigned int x; unsigne y -C 4.6.2不应在局部作用域声明变量时使用 extern 不规范用法示例: int foo(void) extern int x=0 return (x) GB/T28169-2011 4.6.3数组、结构和联合的初始化列表应使用大括号“{}”,并使用附加的大括号来指嵌套的结构;程 序员应显式地考虑和描述复杂数据类型的所有元素,不应忽略某个元素的初始化。 舰范用法示例 int16ty[3][2]={{1,2},{3,4},{5,6}} 不规范用法示例: int16ty[3][2]={1,2,3,4,5,6}; int16ty[3][2]={1,2}; 4.6.4枚举元素的初始化应完整—如果对枚举元素进行初始化,只能通过以下两种形式 a)初始化所有元素; b)只初始化第一个元素 规范用法示例 nume type[numl =1, nu2=2, num3=3>i enum type num1 1, num2, num3) 不规范用法示例 enum E_ type(numl, num2 =2, num); 4.7版面书写类 4.7.1文件注释应采用统一格式。宜使用格式如下 规范用法示例 Copyright(c)2007公司名称 All rights reserved. 文件名称: filename. c 著摘要:简要描述本文件的内容 当前版本;x,x,编写者、修改者、修改时间、修改内容 *历史版本:x.x编写者、修改者、修改时间、修改内容 4.7.2函数注释应采用统一格式。推荐使用格式如下: 规范用法示例 函数介绍 参数 ¥返回值 备注 4.7.3不应使用嵌套的注释。 4.7.4应保证注释与代码的一致性,无用的注释应删除。 4.7.5对单条语句代码的注释应放在其上方或右方相邻位置。 4.7.6对于有物理含义的变量、常量数据结构,如果其命名不是充分自注释的,在声明时应加以注释, 说明其物理含义 GB/T28169—201 4.7.7if、for、do、 while、 switch等语句的执行语句部分应使用大括号“{}”括起来 规范用法示例 f(a==1) while (b=o) tchar (c) for (ii) timetest (n) 不规范用法示例 f while (b=0) putchar (c) timetest (n); 4.7.8注释与其上面的代码应使用空行隔开。 4.7.9宏定义标识符应使用大写字母 规范用法示例 f define MAX 100 # define豇3.14159 不规范用法示例 f define max 100 t define pi 3. 141 59 4.7.10函数式宏定义的参数和定义体应使用括号“)”括起来,但是含有#和##操作符的除外。 规范用法示例 f define ADD (a, b)((a)t(b)) 不规范用法示例 i define Add(a,b) a+b 4.7.1代码中的一行中只应有一个声明或者一条语句。 5 GB/T281692011 不规范用法示例 int i; int ji 行中包含多个声明/ ii++;/*一行中包含多条语句/ 4.7.12超过120个字符的长语句,宜分成多行书写 4.7.13一个文件中的程序总行不宜超过2000行。 4.7.14一个函数中的程序总行不宜超过200行。 4.7.15宜用括号“()”明确表达式的操作顺序,避免使用默认优先级。 4.7.16不应使用逗号操作符,但是for话句的第一和第三表达式除外。 4.8声明定义类 4.8.1头文件中只应存放对象或函数的声明,不应存放对象或函数的定义 4.8.2不应单独使用小写字母“1”或大写字母“O”作为变量名 注:小写字母“1”很容易与数字“1”混滑,大写字母“0”很容易与数字“0”混滑 4.8.3函数参数、结构体和联合体的成员不应只有类型名没有标识符的情况出现。 4.8.4使用八进制数应加以注释。 注:八进制数以0开始,易与十进制数混淆。 4.8.5局部变量和参数不应与全局变量重名,应避免结构体名、联合体名、枚举名重名 4.8.6不应使用未知大小的数组。当声明一个数组时,其大小应该显式声明或者通过初始化进行隐式 定义 4.8.7不应重新定义使用C的关键字。 488非void类型函数每个出口都应有一个含有返回值的 return语句,并且返回值与函数返回类型 应一致 规范用法示例 int func (void) int x=1 retun(x) 不规范用法示例 int func (void) return; 48.9不应在函数参数中使用 static存储类别。 不规范用法示例 nt func (static int x) 4.8.10调用函数式宏定义时,其参数个数与宏定义时的应一致。

...展开详情
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
嵌入式软件C语言编码规范.pdf 40积分/C币 立即下载
1/0