ADSP基础入门-第6讲-Blackfin嵌入式C编程课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《ADSP基础入门-第6讲-Blackfin嵌入式C编程课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ADSP 基础 入门 Blackfin 嵌入式 编程 课件
- 资源描述:
-
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)需要将寄存器的值由未知状态设置为已)需要将寄存器的值由未知状态设置为已知状态,完成用于维护工作环境的操作。知状态,完
展开阅读全文