1、The World Leader in High Performance Signal Processing SolutionsBlackfin C programming Blackfin C programming Blackfin Blackfin 嵌入式嵌入式C C编程编程 电子工程学院电子工程学院 陈子为陈子为成信院成信院ADI联合实验室联合实验室2u C/C+编译器简介编译器简介u VisualDSP+使用ccblkfn编译器,此C/C+编译器有如下功能:u处理C和C+源文件,产生机器级源代码和目标文件。u在目标文件中包含可重定位的代码和调试信息。u在处理器存储区中提供可由链接器替
2、换的可重定位数据和程序存储段。u C/C+编译器处理编译器处理C和和C+语言源文件并生成语言源文件并生成Blackfin汇编汇编源文件源文件。汇编源文件由Blackfin DSP系列汇编器(easmblkfn.exe)汇编产生。汇编器进一步产生ELF(Executable and Linkable Format)目标文件,由它可以链接(使用链接器)产生一个Blackfin DSP可执行文件或将其包含在一个档案文件库(elfar.exe)中。编译器如何控制处理过程的汇编,链接和存档阶段取决于输入源文件和所用的编译器选项。成信院成信院ADI联合实验室联合实验室3Blackfin C/C+编译器支持
3、的数据类型类型类型位大小位大小数学表示方式数学表示方式使用使用sizeof()返回值返回值char8位有符号位有符号8位二进制补码位二进制补码1unsigned char8位无符号位无符号8位无符号量位无符号量1short16位有符号位有符号16位二进制补码位二进制补码2unsigned short16位无符号位无符号16位无符号量位无符号量2int32位有符号位有符号32位二进制补码位二进制补码4unsigned int32位无符号位无符号32位无符号量位无符号量4long32位有符号位有符号32位二进制补码位二进制补码4unsigned long32位无符号位无符号32位无符号量位无符号量
4、4指针指针32位位32位二进制补码位二进制补码4函数指针函数指针32位位32位二进制补码位二进制补码4float32位位32位位IEEE单精度单精度4double64位位64位位IEEE双精度双精度8fract1616位有符号位有符号1.15小数形式小数形式2fract3232位有符号位有符号1.31小数形式小数形式4成信院成信院ADI联合实验室联合实验室4注意:注意:Blackfin定点处理器只支持定点运算,宽度最高定点处理器只支持定点运算,宽度最高32位位,所以浮点数据及,所以浮点数据及64位数据不直接支持,需通过软件位数据不直接支持,需通过软件转换来实现转换,速度会降低很多。转换来实现转
5、换,速度会降低很多。分数形式的数据类型分数形式的数据类型fract16和和fract32并不是实际存并不是实际存在的数据类型,事实上就是以在的数据类型,事实上就是以short和和int形式存储,形式存储,即即1.15的的16位有符号位有符号short整型(定点型),整型(定点型),1.31的的32位有符号位有符号int整型(定点型),用于表示有符号小整型(定点型),用于表示有符号小数。数。typedef short fract16;typedef int fract32;使用该数据类型时需要先使用该数据类型时需要先#include 成信院成信院ADI联合实验室联合实验室5u逻辑操作符与位操作符
6、逻辑操作符与位操作符l逻辑操作符逻辑操作符与与(&)、或、或(|)、非、非(!)对操作数执行逻辑操作,对操作数执行逻辑操作,主要用于主要用于if等判断语句中等判断语句中。例如:例如:if(xSCR_XSIZE&SCR_YSIZE)l位操作符位操作符与与(&)、或、或(|)、求反、求反()、异或、异或()、左移左移()&位与位与清除某个位或某些位清除某个位或某些位例:例:#define pLCDCON (volatile unsigned int*)0 x1F00000 *pLCDCON&=0 xfffffffe;/清除清除LCD控制寄存器控制寄存器的最低位来关闭的最低位来关闭LCD|位或位或设
7、置某个位或某些位设置某个位或某些位例:例:*pLCDCON|=0 x1;/设置设置LCD控制寄存器的最控制寄存器的最低位来打开低位来打开LCD位异或位异或将某个位或某些位取反将某个位或某些位取反成信院成信院ADI联合实验室联合实验室6左移左移设置寄存器的位设置寄存器的位 或或 乘以乘以2n 例:例:*pLCDCON=0 x66;/设置设置LCDCON寄存器的第寄存器的第6位、第位、第7位为位为1*pLCDCON=(*pLCDCON&0 xFFF0FFFF)|(0 x05右移右移实现除法(除以实现除法(除以2n)如果除数是如果除数是2的的n次方,编译器就会调用移位次方,编译器就会调用移位操作来完
8、成除法运算(无符号除法比有符合除法的操作来完成除法运算(无符号除法比有符合除法的效率高)。效率高)。求反求反将每一位取反。将每一位取反。例如:HC595_SendDat(DISP_TABi);/输出LED显示数据成信院成信院ADI联合实验室联合实验室7uVolatile的用法的用法lvolatile在英文字典的解释为在英文字典的解释为“易变的,反复无常易变的,反复无常的(性格)的(性格)”。l编译器有一种技术叫编译器有一种技术叫数据流分析,分析程序中的变,分析程序中的变量在哪里赋值、哪里使用、哪里失效,分析结果可量在哪里赋值、哪里使用、哪里失效,分析结果可以用于常量合并,常量传播等优化。当它觉
9、察到你以用于常量合并,常量传播等优化。当它觉察到你的代码没有修改变量的值时,它就的代码没有修改变量的值时,它就可能在你访问变可能在你访问变量时提供上次访问的缓冲值量时提供上次访问的缓冲值,这能够提高程序的效,这能够提高程序的效率。率。l但但这些优化可能会带来问题(特别是对硬件寄存器(特别是对硬件寄存器操作的程序中),这时需要用操作的程序中),这时需要用volatile关键词来禁关键词来禁止做这些优化。止做这些优化。告诉编译器:告诉编译器:变量已经变化,变量已经变化,不要用缓存值不要用缓存值(变量可能会随时改变,不要对其优化变量可能会随时改变,不要对其优化,而是每次用的时候去读写该变量。,而是每
10、次用的时候去读写该变量。)成信院成信院ADI联合实验室联合实验室8u使用使用volatile变量的场合变量的场合l硬件寄存器通常要加硬件寄存器通常要加volatile说明说明。#define pFlashA_PortA_Dir (volatile unsigned char*)0 x20270006u在中断服务程序中修改的供其它程序检测的在中断服务程序中修改的供其它程序检测的变量需要加变量需要加volatile。例如:中断服务程序常常通过改变一些全局变量来例如:中断服务程序常常通过改变一些全局变量来通知应用程序某个外部事件已经发生,这些全局通知应用程序某个外部事件已经发生,这些全局变量不应该被
11、优化。变量不应该被优化。u多任务环境中各任务间共享的标志应该加多任务环境中各任务间共享的标志应该加volatile。成信院成信院ADI联合实验室联合实验室9u C/C+编译语言扩展u 编译器支持对编译器支持对ISO/ANSI 标准的标准的C语言和语言和C+语言语言的扩展。的扩展。u为了使为了使C/C+扩展中附加关键字与扩展中附加关键字与ISO/ANSI 标准标准C/C+的关键字不冲突,的关键字不冲突,C/C+扩展中附加关键字扩展中附加关键字在形式上均以双下划线在形式上均以双下划线“_”打头。打头。l标准标准C/C+关键字用一个下划线关键字用一个下划线“_”打头,编译打头,编译器扩展器扩展C/C
12、+关键字用两个下划线关键字用两个下划线“_”打头;打头;l标准库函数名用一个下划线标准库函数名用一个下划线“_”打头,编译器扩打头,编译器扩展的库函数(由编译器给出的内嵌函数)名用两展的库函数(由编译器给出的内嵌函数)名用两个下划线个下划线“_”打头。打头。成信院成信院ADI联合实验室联合实验室10u C/C+编译语言扩展u 内联函数内联函数关键字(inline),ccblkfn的inline关键字使声明为inline类型的函数代码内嵌到调用它的地方。inline是C+的标准特点,ccblkfn将它作为C的扩展。使用该选项节省了调用函数的额外时间开销,因此提高了程序执行速度。u内联汇编语言内联
13、汇编语言关键字(asm),ccblkfn的asm()结构可在C/C+函数中内嵌Blackfin DSP汇编语言指令。对程序中用C或C+不易或不能高效实现的地方可以用asm()结构利用汇编语言实现。成信院成信院ADI联合实验室联合实验室11u指定要放置数据的存储器位置指定要放置数据的存储器位置的关键字(section),section关键字使编译器在汇编器的交叉输出文件的.SECTION中放置目标或函数代码。可以用section()中的字符串参数命名.SECTION。如果对目标或函数声明没有指定section(),编译器会使用默认值。例如:section(“buffer”)int in1024=
14、#include“sine.dat”;u指针受限指针受限关键字(restrict),restrict关键字支持受限制的指针特性。restrict的使用局限于声明一个指针,并指明指针是访问它所指向内容的惟一途径。简单来说,restrict使指针不能使用别名,即两个不同受限指针不能指向同一个对象(指针不能有别名)。成信院成信院ADI联合实验室联合实验室12u内置函数内置函数(buildin),编译器支持使用内置函数,从而有效利用硬件资源。有关这些函数的信息已经内嵌在编译器中。用户程序使用正常的函数调用句法调用它们。编译器处理此类函数调用,会生成一条或多条机器指令,就像处理正常的操作符(如+和*)那
15、样。l内置函数名是以_builtin_开始的。l头文件为内置函数定义一个可读性更好的名称,这个名称不使用_builtin_前缀。例如在ccblkfn.h中:#define sysreg_write(A,B)_builtin_sysreg_write(A,B)成信院成信院ADI联合实验室联合实验室13u预处理命令预处理命令u预处理器在编译器之前运行,它在编译之前对等待处理的代码进行预处理。u预处理器指令以“#”开始,以回车符结束(不能有“;”号),如何预处理器指令长于一行,用“”续行。u预处理器指令对大小写敏感,必须用小写。u预处理命令的功能如下l包含系统和用户定义头文件,例如#includel
16、定义宏和标志常量,例如#definel提供条件汇编和编译,例如#ifdef、#ifndef、#if(均以#endif结束)成信院成信院ADI联合实验室联合实验室14l#if 和#endifu条件编译指令,例如:条件编译指令,例如:#define LCD_TYPE MLCD_320_240#if(LCD_TYPE=MLCD_320_240)#define SCR_XSIZE(640)#define SCR_XSIZE(480)#define LCD_XSIZE(320)#define LCD_XSIZE(240)#if(LCD_TYPE=CLCD_240_320)#define SCR_XSIZ
17、E(640)#define SCR_XSIZE(480)#define LCD_XSIZE(240)#define LCD_XSIZE(320)#endif技巧技巧:在程序调试中,可以用#if临时注释掉一段代码,如下所示:#if 0#endif当需要这段代码时,只需将0变为1即可。成信院成信院ADI联合实验室联合实验室15系统库函数(内置函数)系统库函数(内置函数)u编译器内置函数(编译器内置函数(Compiler Builtin Function),主要针对一些常),主要针对一些常用的操作,其实现大多与处理器硬件电路有关。用的操作,其实现大多与处理器硬件电路有关。u内置函数一般采用汇编语言编
18、写,一旦用户调用此函数,编译器直内置函数一般采用汇编语言编写,一旦用户调用此函数,编译器直接映射到相应的汇编代码中(会被编译器识别出来,使用固定的汇接映射到相应的汇编代码中(会被编译器识别出来,使用固定的汇编语句来代替库函数的调用),运行效率很高。编语句来代替库函数的调用),运行效率很高。u有一些内置函数是系统管理函数,这些内置函数将系统管理的各项有一些内置函数是系统管理函数,这些内置函数将系统管理的各项操作封装成函数,直接调用这些内置函数将能提高代码的可读性。操作封装成函数,直接调用这些内置函数将能提高代码的可读性。例如:获取系统时钟周期的函数示例如下例如:获取系统时钟周期的函数示例如下/使
19、用内联汇编程序,程序可读性差使用内联汇编程序,程序可读性差/使用使用ADI提供的内置函数,可读性好提供的内置函数,可读性好unsigned int get_cycles(void)unsigned int ret_val;asm(“%0=CYCLES;”:”=d”.(ret_val):);return ret_val;#include#include unsigned int get_cycles(void)return sysreg_read(reg_CYCLES);C level functions with several assembly instructions and expand
20、ed into compiler intermediate instruction成信院成信院ADI联合实验室联合实验室16系统库函数u内部函数通常支持内部函数通常支持16位或位或32位数的操作位数的操作u包括包括libc、libdsp、libetsi、libio、lwip、libbtc等库,支持如下的操作和等库,支持如下的操作和函数:函数:l小数值内部函数小数值内部函数lETSI(欧洲电信标准协会)标准的支持(欧洲电信标准协会)标准的支持l复数小数数据和操作复数小数数据和操作lViterbi编码和解码函数编码和解码函数l循环缓冲区函数循环缓冲区函数l高低字节交换(高低字节交换(Endian-
21、swapping)函数)函数l系统内部函数系统内部函数l视频操作函数视频操作函数l未对齐的数据函数未对齐的数据函数u内部函数支持防止溢出的饱和算法内部函数支持防止溢出的饱和算法,这一点与标准,这一点与标准C程序不同。程序不同。u库文件位置:安装目录库文件位置:安装目录Blackfinlib u头文件位置:安装目录头文件位置:安装目录Blackfinincludesu源代码位置:安装目录源代码位置:安装目录Blackfinlibsrcu可根据需要对源代码进行修改,请将文件复制到其它地方,重命名后再进可根据需要对源代码进行修改,请将文件复制到其它地方,重命名后再进行修改。行修改。u调用库文件时需要
22、先引用相应的头文件调用库文件时需要先引用相应的头文件。成信院成信院ADI联合实验室联合实验室17示例u完成一个完成一个256阶的阶的FIR滤波器:滤波器:int filter(short*in,short*coeff)int i;int acc=0;for(i=0;i15);return acc;#include fract32 filter(fract16*in,fract16*coeff)int i;fract32 acc=0;for(i=0;i128;i+)acc=add_fr1x32(acc,mult_fr1x32(ini,coeffi);return acc;成信院成信院ADI联合实
23、验室联合实验室18ETSI Builtins fully optimised Fractionalarithmetic to a standard specificationuEuropean Telecommunications Standards Institutes fract functions carefully mapped onto the compiler built-ins.u头文件头文件libetsi.h包含了包含了ETSI内部函数,内部函数,ETSI函数与小数值内函数与小数值内部函数类似,可以完成部函数类似,可以完成16位和位和32位小数值算术运算。还包含位小数值算术运算
24、。还包含复数小数运算。复数小数运算。uadd()sub()abs_s()shl()ushr()mult()mult_r()negate()uround()L_add()L_sub()L_abs()uL_negate()L_shl()L_shr()L_mult()uL_mac()L_msu()saturate()extract_h()uextract_l()L_deposit_l()L_deposit_h()div_s()unorm_s()norm_l()L_Extract()L_Comp()uMpy_32()Mpy_32_16()u使用时需包含:使用时需包含:#include,且需要将,且需要
25、将libetsi.dlb库库加入到工程中加入到工程中uHighly recommended!成信院成信院ADI联合实验室联合实验室19C/C+Run-time C/C+Run-time 环境环境u运行时环境是为了使应用程序能够正常运行需要维护运行时环境是为了使应用程序能够正常运行需要维护的一套环境。例如,系统复位跳转到开始地址后要执的一套环境。例如,系统复位跳转到开始地址后要执行的代码,这些代码(即行的代码,这些代码(即C/C+Run-time headers,又称,又称CRT)需要将寄存器的值由未知状态设置为已)需要将寄存器的值由未知状态设置为已知状态,完成用于维护工作环境的操作。知状态,完
26、成用于维护工作环境的操作。u运行时环境还包括运行时环境还包括C/C+语言中的函数调用约定。语言中的函数调用约定。u在运行时环境中,有一部分是约定好了的,由编译器在运行时环境中,有一部分是约定好了的,由编译器自己自动完成自己自动完成;另有一部分是需要编写代码实现的另有一部分是需要编写代码实现的,如重如重启时的启时的CRT代码。代码。uADI提供了默认的提供了默认的CRT文件,即安装目录下文件,即安装目录下Blackfinlibsrclibccrt中的中的basiccrt.s文件。文件。成信院成信院ADI联合实验室联合实验室20C Run-Time Header(basiccrt.s)uSets
27、Up C Run-Time(CRT)Environmentl Sets Up Stack Pointerl Enables Cycle Counters for Benchmarking Codel Configures Cache,If Requestedl Change Clock/Voltage Settings,If RequesteduCan Be Modified Through Project Options Window成信院成信院ADI联合实验室联合实验室21C/C+Run-time LibraryuC/C+Run-time Library是实现运行时环境时可能被是实现运行时
28、环境时可能被代码使用的函数、宏定义、类模板的集合。这个库提代码使用的函数、宏定义、类模板的集合。这个库提供了对语言而讲最基本的应用:分配内存、字符、字供了对语言而讲最基本的应用:分配内存、字符、字符串的转换、数学计算等。符串的转换、数学计算等。u头文件位置:安装目录头文件位置:安装目录Blackfinincludesu源代码位置:安装目录源代码位置:安装目录Blackfinlibsrclibcu函数名是基于函数名是基于C/C+语言的,如需要在汇编语言里调语言的,如需要在汇编语言里调用它们,需要使用这些函数的汇编版本的名称用它们,需要使用这些函数的汇编版本的名称(一般后一般后缀带缀带_s,例如例
29、如write_s.asm)。成信院成信院ADI联合实验室联合实验室22C/C+Run-time Library提供的库函数uccblkfn.h 与与Blackfin系列系列DSP系统功能相关的函数。系统功能相关的函数。uctype.h 针对字符处理的函数,包括针对字符处理的函数,包括isdigit,islower,toupper等等等等umath.h 数学运算函数(乘方、三角函数、对数、指数等)数学运算函数(乘方、三角函数、对数、指数等)usignal.h 标准标准ANSI中的信号相关功能的函数,主要用于处中的信号相关功能的函数,主要用于处理理C程序中的外部中断信号或定时器中断信号,包括程序中
30、的外部中断信号或定时器中断信号,包括raise(建(建立和强制使能低优先级的中断)、立和强制使能低优先级的中断)、signal、interruptustdio.h 输入、输出操作(会受到中断干扰,不能在中断服输入、输出操作(会受到中断干扰,不能在中断服务程序中调用这些函数),包括:务程序中调用这些函数),包括:fwrite、fclose、printf等等ustdlib.h 提供提供C语言标准中通用的功能,像定点算术功能(语言标准中通用的功能,像定点算术功能(abs、div、rand)、通用字符串至数字的转换、存储器内存空)、通用字符串至数字的转换、存储器内存空间管理(间管理(malloc、fr
31、ee)之类)之类ustring.h 处理字符串的函数,例如处理字符串的函数,例如strcpy、strcmp、memcpy等等utime.h 与时间相关的数据类型、宏,以及与表达式相关与时间相关的数据类型、宏,以及与表达式相关的用于时间计算的信息,如的用于时间计算的信息,如clock、asctime、ctime等等成信院成信院ADI联合实验室联合实验室23C/C+Run-time Library提供的库函数ufloat.h 浮点数据的处理浮点数据的处理ulimits.h 定义定义C data type的最大、最小值等等的最大、最小值等等uiso646.h 布尔运算布尔运算udevice.h 交互
32、设备驱动程序的宏和数据结构交互设备驱动程序的宏和数据结构udevice_int.h 交互设备驱动的列举和原型交互设备驱动的列举和原型uerrno.h 错误处理错误处理uu加入加入C/C+Run-time Library库的方法库的方法lProject Option-Link-General-Search 找到找到lib532.dlb的路径的路径l或者用命令或者用命令 -l c532 (C库库libc532.dlb)-l cpp532 (C库库libcpp532.dlb)使用时参考使用时参考VisualDSP+4.5 C/C+Compiler and Library Manual for Bla
33、ckfin Processors.pdf成信院成信院ADI联合实验室联合实验室24DSP Run-time Library(libdsp)u支持很多通用的支持很多通用的DSP算法,例如滤波、算法,例如滤波、FFT、矢量和、矢量和矩阵函数、数学函数、窗函数等。矩阵函数、数学函数、窗函数等。u这些这些DSP函数支持不同的数据类型,包括函数支持不同的数据类型,包括float、double、fract16等。等。u库文件位置:安装目录库文件位置:安装目录Blackfinlib lBF533调用的是调用的是libdsp532.dlbu头文件位置:安装目录头文件位置:安装目录Blackfininclude
34、su源代码位置:安装目录源代码位置:安装目录Blackfinlibsrclibdspu可根据需要对源代码进行修改,请将文件复制到其它可根据需要对源代码进行修改,请将文件复制到其它地方,重命名后再进行修改。地方,重命名后再进行修改。u调用库文件时需要先引用相应的头文件。调用库文件时需要先引用相应的头文件。成信院成信院ADI联合实验室联合实验室25Libdsp提供的库函数ucomples.h 基本复数运算。包含各类复数类型(如基本复数运算。包含各类复数类型(如complex_float、complex_fract16)变量的定义和基本数学操作,例如复数绝对值、复数)变量的定义和基本数学操作,例如复
35、数绝对值、复数加减法、复数乘除法、获取复数相位、共轭、归一化等加减法、复数乘除法、获取复数相位、共轭、归一化等ufilter.h 滤波和变换滤波和变换l滤波滤波 包括包括FIR、IIR、直接、直接I型型IIR、抽取、抽取/内插内插FIR、复数、复数FIR等等等等l变换变换 FFT、获得、获得FFT旋转因子、旋转因子、IFFT、R4-FFT等等l卷积卷积 卷积操作、二维卷积、卷积操作、二维卷积、3*3矩阵的二维卷积等矩阵的二维卷积等l压缩压缩/扩展的相关函数扩展的相关函数 包括包括A律、律、u律压缩律压缩/扩展扩展umath.h 数学函数,例如求绝对值、指数、对数、幂运算、三角运算数学函数,例如
36、求绝对值、指数、对数、幂运算、三角运算、最大值、最小值、平方根等。、最大值、最小值、平方根等。umatrix.h 矩阵函数,如实数矩阵函数,如实数/复数矩阵加复数矩阵加/减减/乘一个标量、矩阵转置等乘一个标量、矩阵转置等ustats.h 统计函数。包括自相关、互相关、柱状图、均值、方差、过统计函数。包括自相关、互相关、柱状图、均值、方差、过零点等零点等uvector.h 向量函数,包含实数与复数的向量操作,例如点积、向量加向量函数,包含实数与复数的向量操作,例如点积、向量加/减减/乘一个标量、向量中的最大、最小元素及各自的索引等。乘一个标量、向量中的最大、最小元素及各自的索引等。uwindow
37、.h 滤波、谱分析加窗时的窗函数。包括滤波、谱分析加窗时的窗函数。包括Gaussian窗、窗、Hamming窗、窗、Kaiser窗、三角窗等。窗、三角窗等。使用时参考使用时参考VisualDSP+4.5 C/C+Compiler and Library Manual for Blackfin Processors.pdf成信院成信院ADI联合实验室联合实验室26数字滤波的实现数字滤波的实现u滤波及频谱分析可以采用滤波及频谱分析可以采用ADI提供的滤波器库函数(提供的滤波器库函数(DSP run-time library中的库函数),需要包含中的库函数),需要包含 filter.h(滤波器及变换
38、的头文件滤波器及变换的头文件),即即#include 。u滤波器初始化滤波器初始化 fir_init(state,coefs,delay,NUM_TAPS,1);其中其中state为初始状态,为初始状态,coefs为滤波器系数,为滤波器系数,delay为线性缓冲区为线性缓冲区的首地址,的首地址,NUM_TAPS为滤波器阶数,最后一个参数表示是否内为滤波器阶数,最后一个参数表示是否内插或抽取(插或抽取(interpolation/decimation index)u事实上,事实上,fir_init就是一个宏,即:就是一个宏,即:#define fir_init(state,coeffs,dela
39、y,ncoeffs,index)(state).h=(coeffs);(state).d=(delay);(state).p=(delay);(state).k=(ncoeffs);(state).l=(index)成信院成信院ADI联合实验室联合实验室27u对输入信号进行滤波对输入信号进行滤波ufir_fr16(in,out,VEC_SIZE,&state);u其中其中in为输入信号缓冲区的首地址,为输入信号缓冲区的首地址,out为输出信号为输出信号缓冲区的首地址,缓冲区的首地址,VEC_SIZE为每次参与滤波的数据为每次参与滤波的数据的长度(缓冲区的长度),的长度(缓冲区的长度),&sta
40、te表示初始状态,由表示初始状态,由fir_init(state,coefs,delay,NUM_TAPS,1);获得。获得。u源代码源代码可以在:安装目录下可以在:安装目录下Blackfinlibsrclibdsp 找到找到fir_fr16.asm成信院成信院ADI联合实验室联合实验室28输入信号产生与引入输入信号产生与引入u实验中输入的信号可以事先由实验中输入的信号可以事先由Matlab编程获得编程获得 fid=fopen(signal.dat,w);fprintf(fid,0 x%04x,n,x1);fclose(fid);u使用时在使用时在DSP程序中采用程序中采用 fract16 i
41、n256=#include“signal.dat”;u也可以在也可以在DSP程序中编程得到信号程序中编程得到信号#include#include *out=(fract16)(0.5*sin(2*PI*f*step)*32768.0);u加噪声加噪声#include *out+=(fract16)(rand()-0 x20000000)15;成信院成信院ADI联合实验室联合实验室29频谱分析的实现频谱分析的实现u计算旋转因子计算旋转因子void Init_FFT(void)(需包含(需包含#include )twidfftrad2_fr16(fft_twid,VECTOR_SIZE);u获取循
42、环缓冲区的指针获取循环缓冲区的指针(需包含(需包含#include)counter=_builtin_circindex(counter,INPUT_SIZE,current_size);u给信号加窗给信号加窗(需包含(需包含#include)fft_ini=mult_fr1x16(win_barti,input_arri);uFFT计算计算(需包含(需包含#include )rfft_fr16(fft_in,fft_temp,fft_out,fft_twid,(int)VECTOR_SIZE/current_size,current_size,1,1);u计算计算FFT的幅度谱的幅度谱 (需
43、包含(需包含#include)for(i=0;icurrent_size;i+)fft_magi=cabs_fr16(fft_outi);/fft_magi=sqrt(fft_outi.re*fft_outi.re+fft_outi.im*fft_outi.im);成信院成信院ADI联合实验室联合实验室30Circular addressinguAi%nThe compiler now attempts to treat array references of the form arrayi%n as circular buffer operations.-force-circbuf can
44、help the compiler to accept the safety of a circular buffer access.uExplicit circular addressing of an array index:long circindex(long index,long incr,unsigned long nitems)uExplicit circular addressing on a pointer:void*circptr(void*ptr,long incr,void*base,unsigned long buflen)成信院成信院ADI联合实验室联合实验室31设
45、备驱动库函数设备驱动库函数应应用用实实时时操操作作系系统统(可可选选)设设备备管管理理器器物物理理驱驱动动物物理理驱驱动动物物理理驱驱动动系系统统服服务务程程序序设设备备驱驱动动程程序序driversadi_dev.hdriversadi_uart.hservicesservices.h成信院成信院ADI联合实验室联合实验室32u采用设备驱动这种方式,使应用程序不用考虑控制硬件设备的采用设备驱动这种方式,使应用程序不用考虑控制硬件设备的细节,对应用程序而言,设备的控制与正常的调用函数没有什细节,对应用程序而言,设备的控制与正常的调用函数没有什么不同。么不同。u设备驱动程序位于系统服务程序的上方
46、,设备驱动程序将调用设备驱动程序位于系统服务程序的上方,设备驱动程序将调用系统服务程序,如中断。系统服务程序,如中断。u设备驱动库是设备驱动库是ADI提供的部分器件的设备驱动程序集合。提供的部分器件的设备驱动程序集合。l如果在系统中使用的是设备驱动库中的设备,则对如果在系统中使用的是设备驱动库中的设备,则对Blackfin DSP来说直接调用设备驱动库中相应的文件和函数即可;来说直接调用设备驱动库中相应的文件和函数即可;l如果使用的设备不在设备驱动库中,也可以参照如果使用的设备不在设备驱动库中,也可以参照ADI的同类的同类型器件的设备驱动程序来编写所用设备的驱动程序型器件的设备驱动程序来编写所
47、用设备的驱动程序。u使用时需要包含:使用时需要包含:#include /系统服务程序系统服务程序#include /设备管理器设备管理器#include /UART驱动程序驱动程序成信院成信院ADI联合实验室联合实验室33u#include /系统服务程序系统服务程序l包括了所有的系统服务程序,如包括了所有的系统服务程序,如DMA、中断、接口控制等服、中断、接口控制等服务程序务程序u#include /设备管理器设备管理器l包括了所有关于设备驱动程序的一般信息,如包括了所有关于设备驱动程序的一般信息,如API、返回码、返回码、事件代码即所有的设备驱动程序一般信息、事件代码即所有的设备驱动程序一
48、般信息u#include /xxx设备的驱动程序设备的驱动程序l特定的设备的驱动程序的包含文件,应当包含设备驱动程序特定的设备的驱动程序的包含文件,应当包含设备驱动程序本身。本身。u相关文件所在位置如下:相关文件所在位置如下:l头文件在安装目录下头文件在安装目录下Blackfinincludedrivers或或services文文件夹中件夹中l各个驱动程序的源代码在安装目录下各个驱动程序的源代码在安装目录下Blackfinlibsrc drivers 或或services文件夹中文件夹中l库文件在安装目录下库文件在安装目录下Blackfinlib文件夹中文件夹中成信院成信院ADI联合实验室联合
49、实验室34设备管理设备管理ladi_dev.huadi_dev_Open()Opens a device for useuadi_dev_Close()Closes down a deviceuadi_dev_Read()Provides a device with buffers for inbound datauadi_dev_Write()Provides a device with buffers for outbound datauadi_dev_Control()Sets/detects control and status parameters for a device成信院成信
50、院ADI联合实验室联合实验室35系统服务系统服务:System Interrupt Controller FunctionsSystem Interrupt Controller Functionsuadi_int_SICEnable Enables peripheral interrupts to be passed to the CECuadi_int_SICDisable Disables peripheral interrupts from being passed to the CECuadi_int_SICSetIVG Sets the IVG level to which a p