[信息与通信]DSP C语言编程规范

上传人:油条 文档编号:34063151 上传时间:2018-02-20 格式:DOC 页数:52 大小:261KB
返回 下载 相关 举报
[信息与通信]DSP C语言编程规范_第1页
第1页 / 共52页
[信息与通信]DSP C语言编程规范_第2页
第2页 / 共52页
[信息与通信]DSP C语言编程规范_第3页
第3页 / 共52页
[信息与通信]DSP C语言编程规范_第4页
第4页 / 共52页
[信息与通信]DSP C语言编程规范_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《[信息与通信]DSP C语言编程规范》由会员分享,可在线阅读,更多相关《[信息与通信]DSP C语言编程规范(52页珍藏版)》请在金锄头文库上搜索。

1、DSP C 语言编程规范版本 时间 作者 备注Version 1.0 2010.02.24 刘 昊 创建编写目的:此规范主要用于规范基于 DSP 的代码开发,可以有效提高代码的可读性、可移植性、可靠性等,提高 DSP 的开发效率,其它的 C 或 C+开发也可以参考此规范,此规范对 C 或 C+编程有普遍指导性。其中第 19 为基础篇,第 1014 为提高篇。1. 目录结构 .32. 各文件的功能划分 .33. 排版 .54. 注释 .115. 标识符命名 .156. 宏 .187. 可读性 .198. 变量、结构 .219. 函数、过程 .2610. 可测性 .3311. 程序效率 .3812

2、. 质量保证 .4213. 代码编辑、编译、审查 .4914. 代码测试、维护 .511. 目录结构如下图所示,一个工程的根目录应该新建三个文件夹:src、include、lib,src 文件夹用来存放*.c 文件(C 语言) 、 *.cpp 文件(C+语言) 、*.asm 文件(汇编) ;include 文件夹用来存放*.h 文件、*.inc 文件、*.dat 文件;lib 文件夹用来存放*.lib 及其相关的文件。与工程相关的文件放在工程的根目录下,如.pjt(工程文件) 、 .cmd、.cdb 等。2. 各文件的功能划分src 文件夹里的*.c 文件(C 语言) 、*.cpp 文件(C+

3、语言) 、*.asm 文件(汇编)用来做每个函数的具体实现,一个完整功能实现相关的函数放在一个文件中实现。每个*.c 文件(C 语言) 、*.cpp 文件(C+语言)都要有一个同名的 *.h 文件,在这个.h文件中写每个函数的声明,例如 foo.c 文件应该有一个 foo.h 文件包含 foo.c 中每个函数的声明,且每个头文件都应该用内部保护符保护每个头文件,以避免在多次包含时重新定义:例如,头文件 foo.h 应该采用下面的一般形式:#ifndef _FOO_H#define _FOO_H/ 文件内容#include “ MACRO.h ”#include “ TYPE.h ”#inclu

4、de “ *.h ”extern int funa(int a, int b,int c);#endif其中,有几个特殊的头文件用来做一些整个工程的宏定义或是类型定义,如XXX_DSP_MACRO.h 用来定义整个工程所有的宏定义, XXX_DSP_TYPE.h 用来定义整个工程所有的类型定义。*.inc 文件用来定义全局变量,XXX_DSP_GBL_L2.inc 文件用来定义分配在 DSP 的 L2里全局变量,XXX_DSP_GBL_SDRAM.inc 文件用来定义分配在 DSP 的 SDRAM 里全局变量,其具体写如例:#include XXX_DSP_ MACRO.h#include X

5、XX_DSP_TYPE.h#ifdef _GBL_EX#define GBL_extern#else#define GBL_extern extern#endif/* FFT 旋转因子 */#ifdef _GBL_EX#pragma DATA_ALIGN(gacsfftFactor, 16) #endifGBL_extern const INT32 gacsfftFactor128#ifdef _GBL_EX=#include FFT128.dat#endif;3. 排版3.1:程序块要采用缩进风格编写,缩进的空格数为 4 个,对齐只能使用空格键,不使用 TAB 键。 说明:对于由开发工具自动

6、生成的代码可以有不一致。 (不做强制要求)3.2:相对独立的程序块之间、变量说明之后必须加空行。 示例:如下例子不符合规范。 if (!valid_ni(ni) . / program code repssn_ind = ssn_dataindex.repssn_index; repssn_ni = ssn_dataindex.ni; 应如下书写 :if (!valid_ni(ni) . / program code repssn_ind = ssn_dataindex.repssn_index; repssn_ni = ssn_dataindex.ni; 3.3:较长的语句(80 字符)要分

7、成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例: perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN + STAT_SIZE_PER_FRAM * sizeof( _UL ); act_task_tableframe_id * STAT_TASK_CHECK_NUMBER + index.occupied = stat_poiindex.occupied; 3.4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新

8、行,操作符放在新行之首。 示例: if (taskno ) ,后不应加空格。 说明:采用这种松散方式编写代码的目的是使代码更加清晰。 由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面) 不需要加空格,多重括号间不必加空格,因为在 C/C+语言中括号已经是最清晰的标志了。 在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。 示例: (1) 逗号、分号只在后面加空格。 int a, b, c; (2)比较操作符, 赋值操作符=、 +=,算术操作符+

9、、%,逻辑操作符& 、&,位域操作符= MAX_TIME_VALUE) a = b + c; a *= 2; a = b 2; (3)!、 、+、- 、&(地址运算符)等单目操作符前后不加空格。 *p = a; /* 内容操作* 与内容之间 */flag = !isEmpty; /* 非操作! 与内容之间 */p = /* 地址操作& 与内容之间 */i+; /* +,-与内容之间 */(4)-、.前后不加空格。 p-id = pid; /* -指针前后不加空格 */(5) if、for、while、switch 等与后面的括号间应加空格,使 if 等关键字更为突出、明显。 if (a = b

10、 & c d)3.9:if、else、for、switch 的标准写法:if (条件语句)/ program codeelse/ program codefor(i = 0; i B-C-A) ,影响程序的可理解性;递归调用一般都占用较多的系统资源(如栈空间) ;递归调用对程序的测试有一定影响。故除非为某些算法或功能的实现方便,应减少没必要的递归调用。 9.3:防止将函数的参数作为工作变量。 说明:将函数的参数作为工作变量,有可能错误地改变参数内容,所以很危险。对必须改变的参数,最好先用局部变量代之,最后再将该局部变量的内容赋给该参数。 示例:下函数的实现不太好。 void sum_data(

11、 unsigned int num, int *data, int *sum ) unsigned int count; *sum = 0; for (count = 0; count b ) ? a : b ; 改为如下就很清晰了。 int max (int a, int b) return (a b) ? a : b); value = max (a, b); 或改为如下。 #define MAX (a, b) (a) (b) ? (a) : (b) value = MAX (a, b); 9.7:不要设计多用途面面俱到的函数。 说明:多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难。 9.8:函数的功能应该是可以预测的,也就是只要输入数据相同就应

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号