在接触DSP之前,我一直都是在做单片机的开发。在以前的单片机开发中,所有的程序都是在一个文件中,没有.c和.h文件之分,也从来就没有使用过结构体。我把我在学习C64中遇到的问题在下面列出来,希望能对想学习DSP的网友提供一些帮助,大家共同学习,共同进步。
1 头文件
在C64的DSP开发中,由于模块比较复杂,看到一大堆的文件。开始由于没有清楚理解头文件的概念,总是出现包含错误。
为什么要有头文件呢?头文件中一般存放宏定义,结构体声明,函数声明,数组声明等。如果没有对函数的作用域做限制的化,只要包含来这个头文件,就可以使用头文件中声明函数,数组等。为了防止头文件被重复包含,头文件一般要加上
#ifndef _FUN_H_
#define _FUN_H_
………………..
………..
#endif
2 结构体
在结构化的设计中一般都要使用到结构体。例如:模块A中使用 stuct A。模块B
struct B。两者之间没有耦合,如果结构体A,B之间有公共变量或是结构体,那么可以在第3个common.h文件中声明结构体,然后在模块A,模块B中包含此文件。
3 内存分配
在DSP开发过程中,一般不建议使用动态内存分配。一个模块或是算法中需要多少
内存,又上层主调度进行管理和分配。如果上层为模块或是算法传入一块连续的内存空间,只要进行强制类型转换就可以了
4 自动测试。
在开发过程中经常要进行一些验证测试,比如找到一个Bug测试条件改变了,这就要求重新进行测试。如果是手工测试的化,工作量大,而且容易出错,人都有这样的特性。做的次数多了就容易麻木。因此一套自动测试的工具就很有必要了。晚上下班的时候配置好测试条件,明天就可以查看结果。何乐而不为你。
测试代码一般比较简单,但千万不能忽略测试代码的质量,很多时候,问题很可能由测试代码引起。
5 C语言编译开关
在不同的模式或是条件下执行不同的代码,可以用编译开关把程序分开,方便进行验证和测试,但编译开关不能设置太多,太多了容易出乱子。
6 数据结构
由于当时所做的项目中经常涉及到数据处理和消息处理,因此,模块间通常使用邮箱进行数据传递,又模块A写入,由模块B进行读取。在DSP处理过程中经常用到各类型型的数据结构
7 浮点定点化运算
很多算法的原型是浮点的,而我们通常使用的是定点DSP。因此在重算法原型到DSP的实现过程需要经过浮点数定点化运算。在浮点数进行定点化的运算过程成中要注意精度和可能出现溢出的情况。
8 CCS工具应用
8.1 CCS编译选项
CCS的编译选项有很多,常用的主要有-g、–o3、-ms、-mv、-mh。在开发的不同过程中,使用的编译选项有所不同,因此,在开始测试前就一定要配置好编译选项。我就曾经遇到过打开o3优化后,程序跑飞了。定义死机问题是一件很痛苦的事情,在开发过程中要尽量避免出现死机问题。
8.2 图型工具
使用CCS的图像工具可以很直观把信号显示除了,方便进行测试和问题定位。
9 JTAG仿真
在JTAG仿真中要关闭打印输出,否则可能引起难以定位的问题。
10 C程序优化
在性能达不到要求的情况下,可能要进行一些性能上的优化。为了方便移植,大型的程序使用的是C语言,因此有可能对C进行一些优化。
10.1 使用DSP自带的编译选项
10.2 使用内联函数
10.3 进行循环展开
11 数字信号处理理论
在DSP中经常用到一些数字信号处理的的一些算法,如FFT、 FIR、 IIR滤波等程序。在对DSP开发过程中一定要做好这方面的积累。
12 MatLab
MatLab是进行DSP前期开发仿真的工具。Matlab的仿真为DSP开发起到了很好的促进作用,最好能够掌握这种强有力的开发仿真工具。