【连载】【FPGA黑金开发板】NIOS II那些事儿--编程风格(三)

声明:本文为XiaomaGee编写,版权由XiaomaCee和本博文作者所有,如需转载请标明出处http://www.cnblogs.com/kingst

一、 规范参照标准

良好的代码风格及编程规范,是书写优良代码的基础,也是工程师必备的技能。本规范遵循C语言的创始人B.W.Kernighan和D.M.Ritchit (简称 K & R)所著的《The C Programming Language》一书的示例,并参照 Linux 内核代码风格。

本规范适用于有一定c语言基础的读者,对于需要入门的,建议熟读几遍《The C Programming Language》。另外本规范部分内容仅适用于基于单片机、arm等嵌入式处理器的固件开发。

二、 格式

1. 缩进

函数体、if、for、while、switch case、do while等都需要使用缩进。不管你用任何编辑器或者是集成开发环境,缩进均是基于“Tab”键的,而不是基于“空格”键。一般来说,我采用 8 个字符的缩进长度。例如:

clip_image001

2. 空格及空行

空格和空行的出现,是以增强程序的可读性为目的。但是不要插入过多(两个以上)的空格和空行。函数开始局部变量声明后需加一个空行,函数内逻辑相对独立的部分,需加一个空行。文件结尾需加一个空行。

代码中加入空格是以程序逻辑清晰为目的。c关键字后需加空格,例如:

clip_image002

3. 大括号

函数的大括号位于函数体的第二行与末行,if、while、switch、do的大括号位于关键字所在行的行尾和逻辑末行,末行的大括号与关键字上下对齐。例如:

clip_image003

三、 元素及命名规则

1. 文件

C语言源文件主要包括 .c文件和 .h 文件。文件命名要以体现其意义的名词为主,例如芯片 max525的驱动程序,我们可以命名为 max525.c;实现fat32协议的驱动,我们可以命名为 fat32.c;忌出现 a.c、newfile.c、my.c、wang.c等无意义文件名。

文件名用小写字母、下划线、数字的组合命名,不可出现空格等其他字符,更不允许出现汉字、日语、俄语等非 ascii码的字符。

每个 .c文件都要对应有一个 .h 文件来配合其对外资源声明。 .h 文件内可包含宏定义、类型定义、对外资源(全局变量、全局函数)声明。 .c 文件可以包含变量声明、函数原型、函数体。为了防止重复调用,.h文件的逻辑开头需要加入开关控制,例如:

clip_image004

2. 宏、枚举体

宏、枚举体均需用大写字母、数字及下划线的组合,宏与常量之间用“tab”隔离,同一类含义的宏定义在一起,并放于相关的头文件中。宏定义以能表达清楚含义为标准,除专业术语外,推荐用完整单词表示宏含义。不同含义的宏定义需用空行分割,部分需加注释。例如:

clip_image005

3. 自定义类型

我们可以用c关键字 typedef 进行自定义c语言中的数据类型。类型定义一般包括结构体、联合体类型定义及函数类型定义。ANSI C包含的数据类型(如unsigned char、unsigned short int、double 等),不建议重定义。

结构体、联合体类型定义推荐大写字母加 _T 的形式出现,例如:

clip_image006

4. 函数声明及实体

函数命名采用谓宾结构,中间用下划线隔开,函数必须使用小写、数字及下划线的组合。不管函数原型声明还是函数体,必须包含完整的函数类型及参数类型(包括 void型亦不能省略)。文件的内部函数(不需要外部调用),需要在函数类型前加static 关键字。

函数原型声明时,需用注释的方式,添加函数调用参数的意义,例如:

clip_image007

大部分函数需返回函数执行状态,定义 0 为正常执行, -1为一般错误,-1 ~ -999为自定义错误。自定义错误可以通过宏或者变量实现。例如:

clip_image008

从逻辑功能划分的角度来讲,函数需要简、短、精,函数实现的逻辑内容要跟函数名要一一对应,不要超过函数名表达的范围,也不要只实现函数名所表达的部分功能。一般情况,尽量调用系统库来实现功能而不是自己去实现。

5. 变量及初始化

变量一律用小写字母、数字及下划线实现,全局变量要体现变量的意义,需用单词的全写; 由于局部变量作用的范围,一般都在视野范围你,所以可以用简写及单个字母,如 i、a等。

全局变量尽量越少越好,并且需根据属性划分,以结构体形式体现为主。整个工程的全局变量需在头文件中用 extern 关键字对外声明,隶属于文件的全局变量(不属于整个工程的全局变量),需加 static 关键字修饰。

变量使用前必须初始化,初始化可以采用静态初始化和函数执行时初始化。结构体的初始化建议采用 c99 规范里的指定初始化。例如:

clip_image009

数组维数最好用宏定义,数组用时必须初始化(赋值或者清零),对数组维数判断时,需用sizeof 关键字,切忌直接用数字。

使用指针时,切忌指针越界及野指针的出现;指针也是个变量,用它之前也必须初始化。对CPU外设进行直接映射或者是中断内变量使用时,变量前需加 volatile 以防系统优化。

6. 注释

注释不宜过少,但也不宜过多。以表达清楚程序员的意图为最终目的,注释尽量不要用中文。函数体内注释,推荐采用 “//” 的注释方式。

每个文件头,均需加一个说明性的注释。例如:

clip_image010

每个函数体的开始,均需加一个说明性的注释。例如:

clip_image011

四、 项目管理

1. 项目文件夹

每个C工程中,可以以功能为依据对源文件进行文件夹分类。文件夹不可以出现空格、除英文字母、数字、下划线外的字符;更不允许出现汉字、俄语等非 ASCII码字符。例如某个工程可以划分为如下文件夹:

clip_image012

2. 功能划分

功能划分应以逻辑清晰、层次关系明显为目的。一旦划分好后,不可越级调用系统资源(例如只有driver内文件内直接操作硬件资源,其他文件夹代码均不可调用最底层硬件资源)。也不要互相调用而使系统资源很快耗尽。

3. 文件管理

文件一旦建立,就需在文件头说明文件目的、版权及历史记录,每次修改后必须记录。工程完工或者是间歇性搁置时,需要对所有工程文件夹、文件进行只读属性设置及当前状态记录(进行到什么状态、存在什么bug等)。对源代码最好做到每天一备份,以防意外篡改及丢失,以备恢复之用。

五、 一些建议

1. 代码编辑器

有很多优秀的代码编辑器可供大家选择,例如 Vim、Emacs、Souce-Insight、Edit-Plus等。每个人可以根据自己的喜好,选择一种编辑器,切忌滥用。

2. PC 端编译器及集成开发环境

GCC (GNU Compiler Collection) 是一个非常优秀的编译器套装。他几乎在所有的操作系统下均有移植,并且有很多CPU的交叉编译器可供我们使用,例如 SDCC、arm-elf-gcc等。MS-Windows下推荐使用 Mingw32移植版,相应的集成开发环境推荐 Dev-cpp 和 Code::block。

3. 参考资源及网站

《The C Programming Language》 c语言圣经;

《Advanced Programming in the UNIX Environment》 UNIX C 程序员圣经;

http://www.gnu.org GNU Operating System

http://www.sf.net Source Forge

http://www.kernel.net The Linux Kernel Archives

六、 示例代码

1. c文件

clip_image014

clip_image016

clip_image018

2. 头文件

clip_image020

clip_image022

posted on 2010-03-27 18:20  FPGA黑金开发板  阅读(3228)  评论(3编辑  收藏  举报