![第五章 Blackfin嵌入式C编程_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-1/7/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e1.gif)
![第五章 Blackfin嵌入式C编程_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-1/7/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e2.gif)
![第五章 Blackfin嵌入式C编程_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-1/7/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e3.gif)
![第五章 Blackfin嵌入式C编程_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-1/7/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e4.gif)
![第五章 Blackfin嵌入式C编程_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-1/7/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e/90f20865-3d79-4ffb-8b3a-cbb9b2862a4e5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、The World Leader in High Performance Signal Processing SolutionsBlackfin Blackfin 嵌入式嵌入式C C编程编程本章要点uCCES集成开发环境集成开发环境u嵌入式嵌入式C编程编程21.CCES集成开发环境3ADSP 程序开发流程 CCES(Crosscore Embedded Studio) CCES(Crosscore Embedded Studio)是是ADIADI公司针对公司针对ADSPADSP系列处理器提供的新一代集成开发工具。其使用方法系列处理器提供的新一代集成开发工具。其使用方法与与VisualDSP+V
2、isualDSP+非常类似。非常类似。 CCES CCES通过图形窗口的方式与用户进行信息交换,程序开通过图形窗口的方式与用户进行信息交换,程序开发人员可以在窗口中进行高效的工程管理,轻松地在编辑发人员可以在窗口中进行高效的工程管理,轻松地在编辑、编译和调试之间互相切换,实现高效率的程序开发。、编译和调试之间互相切换,实现高效率的程序开发。4CCES 集成开发环境5CrossCore EmbeddedStudio is ADIs NewEclipse based ToolchainIDEDebuggerCompilersAssemblersLinkerLoaderAlgorithm Libra
3、ries7CCES IDE特点6u基于基于Eclipse的集成开发环境的集成开发环境 u支持多核开发与调试支持多核开发与调试u优异的代码生成工具,包括优异的代码生成工具,包括Compilers, Assemblers, Linker, Loader. u成熟的算法库成熟的算法库u优化的系统服务及设备驱动优化的系统服务及设备驱动u软件插件便于集成软件插件便于集成, 包括包括RTOS, TCP/IP Stack, USB Stack, & File System. u硬件兼容性强,支持多核处理器板、扩展子板,支持音视频采集、硬件兼容性强,支持多核处理器板、扩展子板,支持音视频采集、处理、显示与播放
4、处理、显示与播放.步骤1:新建工程(1/7)启动CCES7CCES程序开发、调试步骤步骤1:新建工程(2/7)点击新建工程8步骤1:新建工程(3/7)输入工程名称与类型9步骤1:新建工程(5/7)配置路径10步骤1:新建工程(5/7)配置目标平台11步骤1:新建工程(6/7)配置插件12步骤1:新建工程(7/7)配置开发语言13步骤2:编程(1/2)添加source file14C/C+视图视图Folder&file auto Generated步骤2:编程(2/2)编写代码15Generated by CCES步骤3:编译及配置(1/10)点击Build Project16步骤3:编译及配置
5、(2/10)观察编译结果17步骤3:编译及配置(3/10)点击属性配置18步骤3:编译及配置(4/10)Assembler配置19Command line步骤3:编译及配置(5/10)C/C+ Compiler20Assembler level optimization步骤3:编译及配置(6/10)definition&include21步骤3:编译及配置(7/10)LDR file config22If you make a LDR file步骤3:编译及配置(8/10)目标处理器23选择目选择目标器件标器件步骤3:编译及配置(9/10)编译类型配置24步骤3:编译及配置(10/10)环境变
6、量25步骤4:调试(1/10)点击Debug As26步骤4:调试(2/10)选择目标处理器27步骤4:调试(3/10)选择连接类型28步骤4:调试(4/10)选择平台29选择仿真器,具体型选择仿真器,具体型号查看仿真器型号号查看仿真器型号:本本实验使用实验使用HPUSB-ICE仿真器仿真器步骤4:调试(5/10)配置自动断点30步骤4:调试(6/10)用户板卡配置31步骤4:调试(7/10)多处理器配置32步骤4:调试(8/10)配置载入程序33步骤4:调试(9/10) 切换视图34Debug视图视图(custom perspective)步骤4:调试(10/10)变量、内存、寄存器监测35
7、可查看变量、可查看变量、内存、寄存器内存、寄存器步骤4:导入已有工程(1/3)点击Import36步骤4:导入已有工程(2/3)选择Existing Project37步骤4:导入已有工程(3/3)导入项目文件38步骤5:关闭与删除工程(1/3)关闭工程39Close Non-current project步骤5:关闭与删除工程(2/3)删除工程40步骤5:关闭与删除工程(3/3)是否从磁盘删除工程4142uC/C+编译器编译器 CCES使用使用ccblkfn编译器,此编译器,此C/C+编译器有如下功能:编译器有如下功能:u处理处理C和和C+源文件,产生机器级源代码和目标文件。源文件,产生机器
8、级源代码和目标文件。u在目标文件中包含可重定位的代码和调试信息。在目标文件中包含可重定位的代码和调试信息。u在处理器存储区中提供可由链接器替换的可重定位数据和在处理器存储区中提供可由链接器替换的可重定位数据和程序存储段。程序存储段。u C/C+编译器处理编译器处理C和和C+语言源文件并生成语言源文件并生成Blackfin汇编汇编源文件。源文件。汇编源文件由汇编源文件由Blackfin DSP系列汇编器(系列汇编器(easmblkfn.exe)汇编产生。汇编器进一步产生汇编产生。汇编器进一步产生ELF(Executable and Linkable Format)目标文件,由它可以链接(使用链接
9、器)目标文件,由它可以链接(使用链接器)产生一个)产生一个Blackfin DSP可执行文件或将其包含在一个档案可执行文件或将其包含在一个档案文件库(文件库(elfar.exe)中。编译器如何控制处理过程的汇编,)中。编译器如何控制处理过程的汇编,链接和存档阶段取决于输入源文件和所用的编译器选项。链接和存档阶段取决于输入源文件和所用的编译器选项。2.嵌入式C编程43Blackfin C/C+编译器支持的数据类型类型类型位大小位大小数学表示方式数学表示方式使用使用sizeof()返回值返回值char8位有符号位有符号8位二进制补码位二进制补码1unsigned char8位无符号位无符号8位无符
10、号量位无符号量1short16位有符号位有符号16位二进制补码位二进制补码2unsigned short16位无符号位无符号16位无符号量位无符号量2int32位有符号位有符号32位二进制补码位二进制补码4unsigned int32位无符号位无符号32位无符号量位无符号量4long32位有符号位有符号32位二进制补码位二进制补码4unsigned long32位无符号位无符号32位无符号量位无符号量4指针指针32位位32位二进制补码位二进制补码4函数指针函数指针32位位32位二进制补码位二进制补码4float32位位32位位IEEE单精度单精度4double64位位64位位IEEE双精度双精
11、度8fract1616位有符号位有符号1.15小数形式小数形式2fract3232位有符号位有符号1.31小数形式小数形式444注意:注意:Blackfin定点处理器只支持定点运算,宽度最高定点处理器只支持定点运算,宽度最高32位位,所以浮点数据及,所以浮点数据及64位数据不直接支持,需通过软件位数据不直接支持,需通过软件转换来实现转换,速度会降低很多。转换来实现转换,速度会降低很多。分数形式的数据类型分数形式的数据类型fract16和和fract32并不是实际存并不是实际存在的数据类型,事实上就是以在的数据类型,事实上就是以short和和int形式存储,形式存储,即即1.15的的16位有符号
12、位有符号short整型(定点型),整型(定点型), 1.31的的32位有符号位有符号int整型(定点型),用于表示有符号小整型(定点型),用于表示有符号小数。数。 typedef short fract16; typedef int fract32;使用该数据类型时需要先使用该数据类型时需要先#include 45u逻辑操作符与位操作符逻辑操作符与位操作符l逻辑操作符逻辑操作符与与(&)、或、或( | | )、非、非( ! )对操作数执行逻辑操作,主要用于对操作数执行逻辑操作,主要用于if等判断语句中。等判断语句中。例如:例如:if (xSCR_XSIZE & SCR_YSIZE)l位操作符位
13、操作符与与(&)、或、或( | )、求反、求反( )、异或、异或()、左移左移()&位与位与清除某个位或某些位清除某个位或某些位例:例:#define pLCDCON (volatile unsigned int*) 0 x1F00000 *pLCDCON &= 0 xfffffffe;/清除清除LCD控制寄存器控制寄存器的最低位来关闭的最低位来关闭LCD|位或位或设置某个位或某些位设置某个位或某些位例:例:*pLCDCON |= 0 x1; /设置设置LCD控制寄存器的最控制寄存器的最低位来打开低位来打开LCD位异或位异或将某个位或某些位取反将某个位或某些位取反46左移左移设置寄存器的位设置
14、寄存器的位 或或 乘以乘以2n 例:例:*pLCDCON = 0 x6右移右移实现除法(除以实现除法(除以2n ) 如果除数是如果除数是2的的n次方,编译器就会调用移位次方,编译器就会调用移位操作来完成除法运算(无符号除法比有符合操作来完成除法运算(无符号除法比有符合除法的效率高)。除法的效率高)。 求反求反将每一位取反。将每一位取反。47uVolatile的用法的用法l编译器有一种技术叫数据流分析,分析程序中的变编译器有一种技术叫数据流分析,分析程序中的变量在哪里赋值、哪里使用、哪里失效,分析结果可量在哪里赋值、哪里使用、哪里失效,分析结果可以用于常量合并,常量传播等优化。当它觉察到代以用于
15、常量合并,常量传播等优化。当它觉察到代码没有修改变量的值时,就可能在访问变量时提供码没有修改变量的值时,就可能在访问变量时提供上次访问的缓冲值,这能够提高程序的效率。上次访问的缓冲值,这能够提高程序的效率。l但这些优化可能会带来问题(特别是对硬件寄存器但这些优化可能会带来问题(特别是对硬件寄存器操作的程序中),这时需要用操作的程序中),这时需要用volatile关键词来禁关键词来禁止做这些优化。止做这些优化。告诉编译器:变量已经变化,告诉编译器:变量已经变化,不要用缓存值不要用缓存值(变量可能会随时改变,不要对其优化变量可能会随时改变,不要对其优化,而是每次用的时候去读写该变量。,而是每次用的
16、时候去读写该变量。)48u使用使用volatile变量的场合变量的场合l硬件寄存器通常要加硬件寄存器通常要加volatile说明。说明。#define pFlashA_PortA_Dir (volatile unsigned char *)0 x20270006u在中断服务程序中修改的供其它程序检测的在中断服务程序中修改的供其它程序检测的变量需要加变量需要加volatile。例:中断服务程序常常通过改变一些全局变量来通例:中断服务程序常常通过改变一些全局变量来通知应用程序某个外部事件已经发生,这些全局变知应用程序某个外部事件已经发生,这些全局变量不应该被优化。量不应该被优化。u多任务环境中各任
17、务间共享的标志应该加多任务环境中各任务间共享的标志应该加volatile。49u C/C+编译语言扩展编译语言扩展u 编译器支持对编译器支持对ISO/ANSI 标准的标准的C语言和语言和C+语言语言的扩展。的扩展。u为了使为了使C/C+扩展中附加关键字与扩展中附加关键字与ISO/ANSI 标准标准C/C+的关键字不冲突,的关键字不冲突, C/C+扩展中附加关键字扩展中附加关键字在形式上均以双下划线在形式上均以双下划线“_”打头。打头。l标准标准C/C+关键字用一个下划线关键字用一个下划线“_”打头,编译打头,编译器扩展器扩展C/C+关键字用两个下划线关键字用两个下划线“_” 打头;打头;l标准
18、库函数名用一个下划线标准库函数名用一个下划线“_”打头,编译器扩打头,编译器扩展的库函数(由编译器给出的内嵌函数)名用两展的库函数(由编译器给出的内嵌函数)名用两个下划线个下划线“_” 打头。打头。50u内联函数内联函数关键字(关键字(inline),ccblkfn的的inline关键字关键字使声明为使声明为inline类型的函数代码内嵌到调用它的地方类型的函数代码内嵌到调用它的地方。inline是是C+的标准特点,的标准特点,ccblkfn将它作为将它作为C的扩的扩展。使用该选项节省了调用函数的额外时间开销,因展。使用该选项节省了调用函数的额外时间开销,因此提高了程序执行速度。此提高了程序执
19、行速度。u内联汇编语言关键字(内联汇编语言关键字(asm),), ccblkfn的的asm()结构可在()结构可在C/C+函数中内嵌函数中内嵌Blackfin DSP汇汇编语言指令。对程序中用编语言指令。对程序中用C或或C+不易或不能高不易或不能高效实现的地方可以用效实现的地方可以用asm()结构利用汇编语言()结构利用汇编语言实现。实现。51u指定要放置数据的存储器位置指定要放置数据的存储器位置的关键字(的关键字(section),),section关键字使编译器在汇编器的交叉输出关键字使编译器在汇编器的交叉输出文件的文件的.SECTION中放置目标或函数代码。可以用中放置目标或函数代码。可
20、以用section()中的字符串参数命名()中的字符串参数命名.SECTION。如。如果对目标或函数声明没有指定果对目标或函数声明没有指定section(),编译(),编译器会使用默认值。例如:器会使用默认值。例如:section(“buffer”) int in1024= #include “sine.dat”;u指针受限指针受限关键字(关键字(restrict),),restrict关键字支持关键字支持受限制的指针特性。受限制的指针特性。restrict的使用局限于声明一的使用局限于声明一个指针,并指明指针是访问它所指向内容的惟一途个指针,并指明指针是访问它所指向内容的惟一途径。简单来说,
21、径。简单来说,restrict使指针不能使用别名,即使指针不能使用别名,即两个不同受限指针不能指向同一个对象两个不同受限指针不能指向同一个对象(指针不能指针不能有别名有别名)。52u内置函数内置函数(buildin),编译器支持使用内置函数,编译器支持使用内置函数,从而有效利用硬件资源。从而有效利用硬件资源。有关这些函数的信息已经有关这些函数的信息已经内嵌在编译器中。用户程序使用正常的函数调用句内嵌在编译器中。用户程序使用正常的函数调用句法调用它们法调用它们。编译器处理此类函数调用,会生成一。编译器处理此类函数调用,会生成一条或多条机器指令,就像处理正常的操作符(如条或多条机器指令,就像处理正
22、常的操作符(如+和和*)那样。)那样。l内置函数名是以内置函数名是以_builtin_开始的。开始的。l头文件为内置函数定义一个可读性更好的名称,这个头文件为内置函数定义一个可读性更好的名称,这个名称不使用名称不使用_builtin_前缀。例如在前缀。例如在ccblkfn.h中:中: #define sysreg_write(A,B) _builtin_sysreg_write(A,B)53u预处理命令预处理命令u预处理器在编译器之前运行,它在编译之前对等待预处理器在编译器之前运行,它在编译之前对等待处理的代码进行预处理。处理的代码进行预处理。u预处理器指令以预处理器指令以“#”开始,以回车符
23、结束(不能有开始,以回车符结束(不能有“ ;”号),如何预处理器指令长于一行,用号),如何预处理器指令长于一行,用“”续行。续行。u预处理器指令对大小写敏感,必须用小写。预处理器指令对大小写敏感,必须用小写。u预处理命令的功能如下预处理命令的功能如下l包含系统和用户定义头文件,例如包含系统和用户定义头文件,例如#includel定义宏和标志常量,例如定义宏和标志常量,例如#definel提供条件汇编和编译,例如提供条件汇编和编译,例如#ifdef、 #ifndef、 #if(均以(均以#endif结束)结束)54#if 和 #endifu条件编译指令,例如:条件编译指令,例如:#define
24、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_XSIZE (640)#define SCR_XSIZE (480)#define LCD_XSIZE (240)#define LCD_XSIZE (320)#endif技巧技巧:在程序调试中,可以用#if临时注释掉一段代码,如下所
25、示:#if 0#endif当需要这段代码时,只需将0变为1即可。55系统库函数(内置函数)系统库函数(内置函数)u编译器内置函数(编译器内置函数(Compiler Builtin Function),主要针对一些常),主要针对一些常用的操作,其实现大多与处理器硬件电路有关。用的操作,其实现大多与处理器硬件电路有关。u内置函数一般采用汇编语言编写,一旦用户调用此函数,编译器直内置函数一般采用汇编语言编写,一旦用户调用此函数,编译器直接映射到相应的汇编代码中(会被编译器识别出来,使用固定的汇接映射到相应的汇编代码中(会被编译器识别出来,使用固定的汇编语句来代替库函数的调用),运行效率很高。编语句来
26、代替库函数的调用),运行效率很高。u有一些内置函数是系统管理函数,这些内置函数将系统管理的各项有一些内置函数是系统管理函数,这些内置函数将系统管理的各项操作封装成函数,直接调用这些内置函数将能提高代码的可读性。操作封装成函数,直接调用这些内置函数将能提高代码的可读性。 例如:获取系统时钟周期的函数示例如下例如:获取系统时钟周期的函数示例如下/使用内联汇编程序,程序可读性差使用内联汇编程序,程序可读性差/使用使用ADI提供的内置函数,可读性好提供的内置函数,可读性好unsigned int get_cycles(void) unsigned int ret_val; asm(“%0=CYCLES
27、;” : ”=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 expanded into compiler intermediate instruction56系统库函数系统库函数u内部函数通常支持内部函数通常支持16位或位或32位数的操作位数的操作u包括包括libc、libdsp、libetsi、libio、lw
28、ip、libbtc等库,支持如下的操作和等库,支持如下的操作和函数:函数:l小数值内部函数小数值内部函数lETSI(欧洲电信标准协会)标准的支持(欧洲电信标准协会)标准的支持l复数小数数据和操作复数小数数据和操作lViterbi编码和解码函数编码和解码函数l循环缓冲区函数循环缓冲区函数l高低字节交换(高低字节交换(Endian-swapping)函数)函数l系统内部函数系统内部函数l视频操作函数视频操作函数l未对齐的数据函数未对齐的数据函数u内部函数支持防止溢出的饱和算法,这一点与标准内部函数支持防止溢出的饱和算法,这一点与标准C程序不同。程序不同。u库文件位置:安装目录库文件位置:安装目录B
29、lackfinlib u头文件位置:安装目录头文件位置:安装目录Blackfinincludesu源代码位置:安装目录源代码位置:安装目录Blackfinlibsrcu可根据需要对源代码进行修改,请将文件复制到其它地方,重命名后再进可根据需要对源代码进行修改,请将文件复制到其它地方,重命名后再进行修改。行修改。u调用库文件时需要先引用相应的头文件。调用库文件时需要先引用相应的头文件。57示例:完成一个示例:完成一个256256阶的阶的FIRFIR滤波器:滤波器:#include fract32 filter(fract16 *in, fract16 *coeff) int i; fract32
30、 acc=0; for(i=0;i128;i+) acc=add_fr1x32(acc,mult_fr1x32(ini,coeffi); return acc;int filter(short *in, short *coeff) int i; int acc=0; for(i=0;i15); return acc;58ETSI Builtins fully optimised Fractionalarithmetic to a standard specificationuEuropean Telecommunications Standards Institutes fract funct
31、ions carefully mapped onto the compiler built-ins.u头文件头文件libetsi.h包含了包含了ETSI内部函数,内部函数,ETSI函数与小数值内函数与小数值内部函数类似,可以完成部函数类似,可以完成16位和位和32位小数值算术运算。还包含位小数值算术运算。还包含复数小数运算。复数小数运算。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() u
32、L_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 ,且需要将,且需要将libetsi.dlb库库加入到工程中加入到工程中uHighly recommended!59C/ C+ Run-time C/ C+ Run-time 环境环境u运行时环境是为了使应用程序能够正常运行需要维护运行时环境是为了使应用
33、程序能够正常运行需要维护的一套环境。例如,系统复位跳转到开始地址后要执的一套环境。例如,系统复位跳转到开始地址后要执行的代码,这些代码(即行的代码,这些代码(即C/ C+ Run-time headers,又称,又称CRT)需要将寄存器的值由未知状态设置为已)需要将寄存器的值由未知状态设置为已知状态,完成用于维护工作环境的操作。知状态,完成用于维护工作环境的操作。u运行时环境还包括运行时环境还包括C/ C+语言中的函数调用约定。语言中的函数调用约定。u在运行时环境中,有一部分是约定好了的,由编译器在运行时环境中,有一部分是约定好了的,由编译器自己自动完成自己自动完成;另有一部分是需要编写代码实
34、现的另有一部分是需要编写代码实现的,如重如重启时的启时的CRT代码。代码。uADI提供了默认的提供了默认的CRT文件,即安装目录下文件,即安装目录下Blackfinlibsrclibccrt中的中的basiccrt.s文件。文件。60C/ C+ Run-time LibraryuC/ C+ Run-time Library是实现运行时环境时可能被是实现运行时环境时可能被代码使用的函数、宏定义、类模板的集合。这个库提代码使用的函数、宏定义、类模板的集合。这个库提供了对语言而讲最基本的应用:分配内存、字符、字供了对语言而讲最基本的应用:分配内存、字符、字符串的转换、数学计算等。符串的转换、数学计算
35、等。u头文件位置:安装目录头文件位置:安装目录Blackfinincludesu源代码位置:安装目录源代码位置:安装目录Blackfinlibsrclibcu函数名是基于函数名是基于C/ C+ 语言的,如需要在汇编语言里调语言的,如需要在汇编语言里调用它们,需要使用这些函数的汇编版本的名称用它们,需要使用这些函数的汇编版本的名称(一般后一般后缀带缀带_s,例如例如write_s.asm)。61C/ C+ Run-time Library提供的常用库函数uccblkfn.h 与与Blackfin系列系列DSP系统功能相关的函数。系统功能相关的函数。uctype.h 针对字符处理的函数,包括针对字
36、符处理的函数,包括isdigit,islower,toupper等等等等umath.h 数学运算函数(乘方、三角函数、对数、指数等)数学运算函数(乘方、三角函数、对数、指数等)usignal.h 标准标准ANSI中的信号相关功能的函数,主要用于处中的信号相关功能的函数,主要用于处理理C程序中的外部中断信号或定时器中断信号,包括程序中的外部中断信号或定时器中断信号,包括raise(建(建立和强制使能低优先级的中断)、立和强制使能低优先级的中断)、signal、interruptustdio.h 输入、输出操作(会受到中断干扰,不能在中断服输入、输出操作(会受到中断干扰,不能在中断服务程序中调用这
37、些函数),包括:务程序中调用这些函数),包括:fwrite、fclose、printf等等ustdlib.h 提供提供C语言标准中通用的功能,像定点算术功能(语言标准中通用的功能,像定点算术功能(abs、div、rand)、通用字符串至数字的转换、存储器内存空)、通用字符串至数字的转换、存储器内存空间管理(间管理(malloc、free)之类)之类ustring.h 处理字符串的函数,例如处理字符串的函数,例如strcpy、strcmp、memcpy等等utime.h 与时间相关的数据类型、宏,以及与表达式相关与时间相关的数据类型、宏,以及与表达式相关的用于时间计算的信息,如的用于时间计算的信
38、息,如clock、asctime、ctime等等62C/ C+ Run-time Library提供的常用库函数ufloat.h 浮点数据的处理浮点数据的处理ulimits.h 定义定义C data type的最大、最小值等等的最大、最小值等等uiso646.h 布尔运算布尔运算udevice.h 交互设备驱动程序的宏和数据结构交互设备驱动程序的宏和数据结构udevice_int.h 交互设备驱动的列举和原型交互设备驱动的列举和原型uerrno.h 错误处理错误处理u63DSP Run-time Library (libdsp)u支持很多通用的支持很多通用的DSP算法,例如滤波、算法,例如滤波
39、、FFT、矢量和、矢量和矩阵函数、数学函数、窗函数等。矩阵函数、数学函数、窗函数等。u这些这些DSP函数支持不同的数据类型,包括函数支持不同的数据类型,包括float、double、fract16等。等。u库文件位置:安装目录库文件位置:安装目录Blackfinlib u头文件位置:安装目录头文件位置:安装目录Blackfinincludesu源代码位置:安装目录源代码位置:安装目录Blackfinlibsrclibdspu可根据需要对源代码进行修改,请将文件复制到其它可根据需要对源代码进行修改,请将文件复制到其它地方,重命名后再进行修改。地方,重命名后再进行修改。u调用库文件时需要先引用相应
40、的头文件。调用库文件时需要先引用相应的头文件。64Libdsp提供的库函数ucomples.h 基本复数运算。包含各类复数类型(如基本复数运算。包含各类复数类型(如complex_float、complex_fract16)变量的定义和基本数学操作,例如复数绝对值、复数)变量的定义和基本数学操作,例如复数绝对值、复数加减法、复数乘除法、获取复数相位、共轭、归一化等加减法、复数乘除法、获取复数相位、共轭、归一化等ufilter.h 滤波和变换滤波和变换l滤波滤波 包括包括FIR、IIR、直接、直接I型型IIR、抽取、抽取/内插内插FIR、复数、复数FIR等等等等l变换变换 FFT、获得、获得FF
41、T旋转因子、旋转因子、IFFT、R4-FFT等等l卷积卷积 卷积操作、二维卷积、卷积操作、二维卷积、3*3矩阵的二维卷积等矩阵的二维卷积等l压缩压缩/扩展的相关函数扩展的相关函数 包括包括A律、律、u律压缩律压缩/扩展扩展umath.h 数学函数,例如求绝对值、指数、对数、幂运算、三角运算数学函数,例如求绝对值、指数、对数、幂运算、三角运算、最大值、最小值、平方根等。、最大值、最小值、平方根等。umatrix.h 矩阵函数,如实数矩阵函数,如实数/复数矩阵加复数矩阵加/减减/乘一个标量、矩阵转置等乘一个标量、矩阵转置等ustats.h 统计函数。包括自相关、互相关、柱状图、均值、方差、过统计函
42、数。包括自相关、互相关、柱状图、均值、方差、过零点等零点等uvector.h 向量函数,包含实数与复数的向量操作,例如点积、向量加向量函数,包含实数与复数的向量操作,例如点积、向量加/减减/乘一个标量、向量中的最大、最小元素及各自的索引等。乘一个标量、向量中的最大、最小元素及各自的索引等。uwindow.h 滤波、谱分析加窗时的窗函数。包括滤波、谱分析加窗时的窗函数。包括Gaussian窗、窗、Hamming窗、窗、Kaiser窗、三角窗等。窗、三角窗等。65数字滤波的实现数字滤波的实现u滤波及频谱分析可以采用滤波及频谱分析可以采用ADI提供的滤波器库函数(提供的滤波器库函数(DSP run-
43、time library中的库函数),需要包含中的库函数),需要包含 filter.h(滤波器及变换的滤波器及变换的头文件头文件),即即#include 。u滤波器初始化滤波器初始化 fir_init(state, coefs, delay, NUM_TAPS, 1); 其中其中state为初始状态,为初始状态, coefs为滤波器系数,为滤波器系数, delay为线性为线性缓冲区的首地址,缓冲区的首地址, NUM_TAPS为滤波器阶数,最后一个参数为滤波器阶数,最后一个参数表示是否内插或抽取(表示是否内插或抽取(interpolation/decimation index)u事实上,事实上,
44、fir_init就是一个宏,即:就是一个宏,即: #define fir_init(state, coeffs, delay, ncoeffs, index) (state).h = (coeffs); (state).d = (delay); (state).p = (delay); (state).k = (ncoeffs); (state).l = (index)66u对输入信号进行滤波对输入信号进行滤波ufir_fr16(in, out, VEC_SIZE, &state);u其中其中in为输入信号缓冲区的首地址,为输入信号缓冲区的首地址, out为输出信号为输出信号缓冲区的首地址,缓
45、冲区的首地址, VEC_SIZE为每次参与滤波的数据为每次参与滤波的数据的长度(缓冲区的长度),的长度(缓冲区的长度), &state表示初始状态,由表示初始状态,由fir_init(state, coefs, delay, NUM_TAPS, 1);获得。获得。u源代码源代码可以在:安装目录下可以在:安装目录下Blackfinlibsrclibdsp 找到找到fir_fr16.asm67输入信号产生与引入输入信号产生与引入u在进行设计时输入的信号可以事先由在进行设计时输入的信号可以事先由Matlab编程获得编程获得 fid=fopen(signal.dat,w); fprintf(fid,0
46、 x%04x,n,x1); fclose(fid);u使用时在使用时在DSP程序中采用程序中采用 fract16 in256= #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;68设备驱动库函数设备驱动库函数应应用用实实时时操操作作系系统统( (可可选选) )设设备备管管理理器器物物理理驱驱动动物物
47、理理驱驱动动物物理理驱驱动动系系统统服服务务程程序序设设备备驱驱动动程程序序driversadi_dev.hdriversadi_uart.hservicesservices.h69u采用设备驱动这种方式,使应用程序不用考虑控制硬件设备的采用设备驱动这种方式,使应用程序不用考虑控制硬件设备的细节,对应用程序而言,设备的控制与正常的调用函数没有什细节,对应用程序而言,设备的控制与正常的调用函数没有什么不同。么不同。u设备驱动程序位于系统服务程序的上方,设备驱动程序将调用设备驱动程序位于系统服务程序的上方,设备驱动程序将调用系统服务程序,如中断。系统服务程序,如中断。u设备驱动库是设备驱动库是AD
48、I提供的部分器件的设备驱动程序集合。提供的部分器件的设备驱动程序集合。l如果在系统中使用的是设备驱动库中的设备,则对如果在系统中使用的是设备驱动库中的设备,则对Blackfin DSP来说直接调用设备驱动库中相应的文件和函数即可;来说直接调用设备驱动库中相应的文件和函数即可;l如果使用的设备不在设备驱动库中,也可以参照如果使用的设备不在设备驱动库中,也可以参照ADI的同类的同类型器件的设备驱动程序来编写所用设备的驱动程序型器件的设备驱动程序来编写所用设备的驱动程序。u使用时需要包含:使用时需要包含: #include /系统服务程序系统服务程序 #include /设备管理器设备管理器 #in
49、clude /UART驱动程序驱动程序70u #include /系统服务程序系统服务程序l包括了所有的系统服务程序,如包括了所有的系统服务程序,如DMA、中断、接口控制等服、中断、接口控制等服务程序务程序u #include /设备管理器设备管理器l包括了所有关于设备驱动程序的一般信息,如包括了所有关于设备驱动程序的一般信息,如API、返回码、返回码、事件代码即所有的设备驱动程序一般信息、事件代码即所有的设备驱动程序一般信息u#include /xxx设备的驱动程序设备的驱动程序l特定的设备的驱动程序的包含文件,应当包含设备驱动程序特定的设备的驱动程序的包含文件,应当包含设备驱动程序本身。本
50、身。u相关文件所在位置如下:相关文件所在位置如下:l头文件在安装目录下头文件在安装目录下Blackfinincludedrivers或或services文文件夹中件夹中l各个驱动程序的源代码在安装目录下各个驱动程序的源代码在安装目录下Blackfinlibsrc drivers 或或services文件夹中文件夹中l库文件在安装目录下库文件在安装目录下Blackfinlib文件夹中文件夹中71设备管理设备管理ladi_dev.huadi_dev_Open() Opens a device for useuadi_dev_Close() Closes down a deviceuadi_dev_
51、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 device72系统服务系统服务:System Interrupt Controller FunctionsSystem Interrupt Controller Functionsuadi_int_SICEnable Ena
52、bles 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 peripheral interrupt is mappeduadi_int_SICGetIVG Detects the IVG level to which a peripheral interrupt is mapped uadi_int_
53、SICWakeup Establishes whether or not a peripheral interrupt wakes up the processor from an idled stateuadi_int_SICInterruptAsserted() Detects whether or not a peripheral interrupt is asserted.73uC与汇编混合编程与汇编混合编程u用用C语言编程结构化程度高,易于编写,但执行速语言编程结构化程度高,易于编写,但执行速度相对较慢;与之相反,汇编程序速度快,但很难度相对较慢;与之相反,汇编程序速度快,但很难有较
54、好的结构,且编写起来耗时,不易调试。有较好的结构,且编写起来耗时,不易调试。C和和汇编混合编程结合了各自的优势,往往能构造出结汇编混合编程结合了各自的优势,往往能构造出结构化好且执行速度快的程序。构化好且执行速度快的程序。uC和汇编混合编程,通常有两种基本方法:和汇编混合编程,通常有两种基本方法:l一是一是C代码中内嵌汇编代码;代码中内嵌汇编代码;采用采用C的库函数的库函数asm( )内嵌代码,这比较简单,功能受限,内嵌代码,这比较简单,功能受限,不常用;不常用;l二是二是C代码中调用汇编语言写的子函数。代码中调用汇编语言写的子函数。 通常在优化代码时使用,但比第一种方法复杂,常用。通常在优化代码时使用,但比第一种方法复杂,常用。74C调用汇编u要命名一个与要命名一个与C/C+标识符对应的汇编标识符,当在汇编程序标识符对应的汇编标识符,当在汇编程序中使用它们时在中使用它们时在C/C+标识符前加下划线。标识符前加下划线。u在汇编程序和在汇编程序和C/C+中公用(相互调用)的函数或变量,需要中公用(相互调用)的函数或变量,需要在汇编程序中用在汇编程序中用.GLOBAL伪指令声明该标识符,然后通过在伪指令声明该标识符,然后通过在C/C+程序中将该标识符声明为程序中将该标识符声明为extern型将其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村房屋建房合同范例
- 保姆和家政合同范本
- 儿童乐园实施合同范本
- 前期工程门窗合同范本
- 公地共用合同范本
- 传媒主播合同范本
- 农业抵押合同范本
- 义诊合作协议合同范本
- 2025年标准键盘行业深度研究分析报告
- 写结婚合同范例
- 《行政伦理学教程(第四版)》课件 第7、8章 行政人格、行政组织伦理
- 2024年江苏苏海控股集团有限公司招聘笔试冲刺题(带答案解析)
- 2023年4月自考00504艺术概论试题及答案含解析
- 美丽的大自然(教案)2023-2024学年美术一年级下册
- 2024年低压电工考试题库(试题含答案)
- 成都特色民俗课件
- 地质勘探行业分析
- 花城版音乐四下-第四课-认知音乐节奏(教案)
- 宠物医院员工手册
- 2024年高考英语读后续写高分宝典专题08读后续写肢体动作描写积累1(词-句-文)讲义
- 商业与公积金贷款政策
评论
0/150
提交评论