【文档说明】ADSP基础入门-第6讲-Blackfin嵌入式C编程课件.ppt,共(44)页,1.034 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-45400.html
以下为本文档部分文字说明:
TheWorldLeaderinHighPerformanceSignalProcessingSolutionsBlackfinCprogrammingBlackfin嵌入式C编程电子工程学院陈子为成信院-ADI联合实验室2C/C++编译器简介VisualDSP++
使用ccblkfn编译器,此C/C++编译器有如下功能:处理C和C++源文件,产生机器级源代码和目标文件。在目标文件中包含可重定位的代码和调试信息。在处理器存储区中提供可由链接器替换的可重定位数据和程序存储段。C/C++编
译器处理C和C++语言源文件并生成Blackfin汇编源文件。汇编源文件由BlackfinDSP系列汇编器(easmblkfn.exe)汇编产生。汇编器进一步产生ELF(ExecutableandLinkableFormat)目标
文件,由它可以链接(使用链接器)产生一个BlackfinDSP可执行文件或将其包含在一个档案文件库(elfar.exe)中。编译器如何控制处理过程的汇编,链接和存档阶段取决于输入源文件和所用的编译器选项。成信院-ADI联合实验室3BlackfinC/C++编译器支持的数据类型类型
位大小数学表示方式使用sizeof()返回值char8位有符号8位二进制补码1unsignedchar8位无符号8位无符号量1short16位有符号16位二进制补码2unsignedshort16位无符号16位无符号量2int32位有符号32位二进制补码4unsignedint32位无符号32位
无符号量4long32位有符号32位二进制补码4unsignedlong32位无符号32位无符号量4指针32位32位二进制补码4函数指针32位32位二进制补码4float32位32位IEEE单精度4double64位64位
IEEE双精度8fract1616位有符号1.15小数形式2fract3232位有符号1.31小数形式4成信院-ADI联合实验室4注意:Blackfin定点处理器只支持定点运算,宽度最高32位,所以浮点数据及64位数据不直接支持,需通过软件转换
来实现转换,速度会降低很多。分数形式的数据类型fract16和fract32并不是实际存在的数据类型,事实上就是以short和int形式存储,即1.15的16位有符号short整型(定点型),1.31的32
位有符号int整型(定点型),用于表示有符号小数。typedefshortfract16;typedefintfract32;使用该数据类型时需要先#include<fract.h>成信院-ADI联
合实验室5逻辑操作符与位操作符逻辑操作符——与(&&)、或(||)、非(!)对操作数执行逻辑操作,主要用于if等判断语句中。例如:if(x<SCR_XSIZE&&SCR_YSIZE)位操作符——与(&)、或(|)、求反(~)、异或(^)、左移(<<)、右移(>>)
&位与——清除某个位或某些位例:#definepLCDCON(volatileunsignedint*)0x1F00000*pLCDCON&=0xfffffffe;//清除LCD控制寄存器的最低位来
关闭LCD|位或——设置某个位或某些位例:*pLCDCON|=0x1;//设置LCD控制寄存器的最低位来打开LCD^位异或——将某个位或某些位取反成信院-ADI联合实验室6<<左移——设置寄存器的位或乘
以2n例:*pLCDCON=0x6<<6;//设置LCDCON寄存器的第6位、第7位为1*pLCDCON=(*pLCDCON&0xFFF0FFFF)|(0x05<<16);//保持其它位不变,单独设置第16~18位为101>>右移——实现除法(除以2n)如果除数是2的n次方,编译器就会调用移位操
作来完成除法运算(无符号除法比有符合除法的效率高)。~求反——将每一位取反。例如:HC595_SendDat(~DISP_TAB[i]);//输出LED显示数据成信院-ADI联合实验室7Volatile的用法volatile在英文字典的解释为“易变的,反
复无常的(性格)”。编译器有一种技术叫数据流分析,分析程序中的变量在哪里赋值、哪里使用、哪里失效,分析结果可以用于常量合并,常量传播等优化。当它觉察到你的代码没有修改变量的值时,它就可能在你访问变量时提供上次
访问的缓冲值,这能够提高程序的效率。但这些优化可能会带来问题(特别是对硬件寄存器操作的程序中),这时需要用volatile关键词来禁止做这些优化。——告诉编译器:变量已经变化,不要用缓存值(变量可能会随时改变,不要对其优化,而是每次用的时候去读写该变量。)成信院-ADI联合实验室8使用vola
tile变量的场合硬件寄存器通常要加volatile说明。#definepFlashA_PortA_Dir(volatileunsignedchar*)0x20270006在中断服务程序中修改的供
其它程序检测的变量需要加volatile。例如:中断服务程序常常通过改变一些全局变量来通知应用程序某个外部事件已经发生,这些全局变量不应该被优化。多任务环境中各任务间共享的标志应该加volatile。成信院-ADI联合实验室9C/C++编
译语言扩展编译器支持对ISO/ANSI标准的C语言和C++语言的扩展。为了使C/C++扩展中附加关键字与ISO/ANSI标准C/C++的关键字不冲突,C/C++扩展中附加关键字在形式上均以双下划线“__”打头。标准C/C++关键字用一
个下划线“_”打头,编译器扩展C/C++关键字用两个下划线“__”打头;标准库函数名用一个下划线“_”打头,编译器扩展的库函数(由编译器给出的内嵌函数)名用两个下划线“__”打头。成信院-ADI联合实验室10C/C++编译语言扩展内联
函数关键字(inline),ccblkfn的inline关键字使声明为inline类型的函数代码内嵌到调用它的地方。inline是C++的标准特点,ccblkfn将它作为C的扩展。使用该选项节省了调用函数的额外时
间开销,因此提高了程序执行速度。内联汇编语言关键字(asm),ccblkfn的asm()结构可在C/C++函数中内嵌BlackfinDSP汇编语言指令。对程序中用C或C++不易或不能高效实现的地方可以用asm()结构利用汇编语言实现。成信院-ADI联合实验室11指定要放置数据的存
储器位置的关键字(section),section关键字使编译器在汇编器的交叉输出文件的.SECTION中放置目标或函数代码。可以用section()中的字符串参数命名.SECTION。如果对目标或函数声明没有指定section(),编译器会使用默认值。例如:section(“buffer”)in
tin[1024]={#include“sine.dat”};指针受限关键字(restrict),restrict关键字支持受限制的指针特性。restrict的使用局限于声明一个指针,并指明指针是访问它所指向内容的惟一途径。简单来说,restrict使指针不能
使用别名,即两个不同受限指针不能指向同一个对象(指针不能有别名)。成信院-ADI联合实验室12内置函数(buildin),编译器支持使用内置函数,从而有效利用硬件资源。有关这些函数的信息已经内嵌在编译器中。用户程序使用正常的函数调用句法调用它们。编译器处理此类函数调用,会生成一条或
多条机器指令,就像处理正常的操作符(如+和*)那样。内置函数名是以__builtin_开始的。头文件为内置函数定义一个可读性更好的名称,这个名称不使用__builtin_前缀。例如在ccblkfn.h中:#definesysreg_write(A,B)__b
uiltin_sysreg_write(A,B)成信院-ADI联合实验室13预处理命令预处理器在编译器之前运行,它在编译之前对等待处理的代码进行预处理。预处理器指令以“#”开始,以回车符结束(不
能有“;”号),如何预处理器指令长于一行,用“\”续行。预处理器指令对大小写敏感,必须用小写。预处理命令的功能如下包含系统和用户定义头文件,例如#include定义宏和标志常量,例如#define提供条件汇编和编译,例如#ifdef、#ifndef、#if(均以
#endif结束)成信院-ADI联合实验室14#if和#endif条件编译指令,例如:#defineLCD_TYPEMLCD_320_240#if(LCD_TYPE==MLCD_320_240)#defineSCR_XSIZE(640)#defineSCR_XSIZE(480)#defin
eLCD_XSIZE(320)#defineLCD_XSIZE(240)#if(LCD_TYPE==CLCD_240_320)#defineSCR_XSIZE(640)#defineSCR_XSIZE(480)
#defineLCD_XSIZE(240)#defineLCD_XSIZE(320)#endif技巧:在程序调试中,可以用#if临时注释掉一段代码,如下所示:#if0…#endif当需要这段代码时,只需将0变为1即可。成信院-ADI联合实验室15系
统库函数(内置函数)编译器内置函数(CompilerBuiltinFunction),主要针对一些常用的操作,其实现大多与处理器硬件电路有关。内置函数一般采用汇编语言编写,一旦用户调用此函数,编译器直接映射到相应的汇编代码中(会被编译器识别出来,使用固定的汇编语句来代替库函数的调用),运
行效率很高。有一些内置函数是系统管理函数,这些内置函数将系统管理的各项操作封装成函数,直接调用这些内置函数将能提高代码的可读性。例如:获取系统时钟周期的函数示例如下//使用内联汇编程序,程序可读性差/
/使用ADI提供的内置函数,可读性好unsignedintget_cycles(void){unsignedintret_val;asm(“%0=CYCLES;”:”=d”.(ret_val)::);
returnret_val;}#include<ccblkfn.h>#include<sysreg.h>unsignedintget_cycles(void){returnsysreg_read(reg_CYCLES);}Clevelfu
nctionswithseveralassemblyinstructionsandexpandedintocompilerintermediateinstruction成信院-ADI联合实验室16系统库函数内部函数通常支持
16位或32位数的操作包括libc、libdsp、libetsi、libio、lwip、libbtc等库,支持如下的操作和函数:小数值内部函数ETSI(欧洲电信标准协会)标准的支持复数小数数据和操作Viterbi编码和解码函数循环缓冲区函数高低字节交换(Endian-swap
ping)函数系统内部函数视频操作函数未对齐的数据函数内部函数支持防止溢出的饱和算法,这一点与标准C程序不同。库文件位置:安装目录\Blackfin\lib\头文件位置:安装目录\Blackfin\includes\源代码位置:安装目录\Blackfin\lib\
src\可根据需要对源代码进行修改,请将文件复制到其它地方,重命名后再进行修改。调用库文件时需要先引用相应的头文件。成信院-ADI联合实验室17示例完成一个256阶的FIR滤波器:intfilter(short*in,short*coeff)
{inti;intacc=0;for(i=0;i<128;i++){acc+=((in[i]*coeff[i])>>15);}returnacc;}#include<fract.h>fract32filter(fract16*in,fract16*coeff){inti;fract32acc
=0;for(i=0;i<128;i++){acc=add_fr1x32(acc,mult_fr1x32(in[i],coeff[i]));}returnacc;}成信院-ADI联合实验室18ETSIBuiltins–fullyoptimisedFractionala
rithmetictoastandardspecificationEuropeanTelecommunicationsStandardsInstitute'sfractfunctionscarefullym
appedontothecompilerbuilt-ins.头文件libetsi.h包含了ETSI内部函数,ETSI函数与小数值内部函数类似,可以完成16位和32位小数值算术运算。还包含复数小数运算。add()sub()abs_s()shl()shr()m
ult()mult_r()negate()round()L_add()L_sub()L_abs()L_negate()L_shl()L_shr()L_mult()L_mac()L_msu()saturate()
extract_h()extract_l()L_deposit_l()L_deposit_h()div_s()norm_s()norm_l()L_Extract()L_Comp()Mpy_32()Mpy_32_16()使用时需包含:#include<libetsi.h>,且需要
将libetsi.dlb库加入到工程中Highlyrecommended!成信院-ADI联合实验室19C/C++Run-time环境运行时环境是为了使应用程序能够正常运行需要维护的一套环境。例如,系统复位跳转到开始地址后要执行
的代码,这些代码(即C/C++Run-timeheaders,又称CRT)需要将寄存器的值由未知状态设置为已知状态,完成用于维护工作环境的操作。运行时环境还包括C/C++语言中的函数调用约定。在运行时环境中,有一部分是约定好了的,由编译器自己自动完成;另
有一部分是需要编写代码实现的,如重启时的CRT代码。ADI提供了默认的CRT文件,即安装目录下Blackfin\lib\src\libc\crt中的basiccrt.s文件。成信院-ADI联合实验室21C/C++Run-timeLibraryC/C++Ru
n-timeLibrary是实现运行时环境时可能被代码使用的函数、宏定义、类模板的集合。这个库提供了对语言而讲最基本的应用:分配内存、字符、字符串的转换、数学计算等。头文件位置:安装目录\Blackfin
\includes\源代码位置:安装目录\Blackfin\lib\src\libc\函数名是基于C/C++语言的,如需要在汇编语言里调用它们,需要使用这些函数的汇编版本的名称(一般后缀带_s,例如write_s.asm)。成信院-ADI联合
实验室22C/C++Run-timeLibrary提供的库函数ccblkfn.h与Blackfin系列DSP系统功能相关的函数。ctype.h针对字符处理的函数,包括isdigit,islower,toupper等
等math.h数学运算函数(乘方、三角函数、对数、指数等)signal.h标准ANSI中的信号相关功能的函数,主要用于处理C程序中的外部中断信号或定时器中断信号,包括raise(建立和强制使能低优先级的中断)、si
gnal、interruptstdio.h输入、输出操作(会受到中断干扰,不能在中断服务程序中调用这些函数),包括:fwrite、fclose、printf等stdlib.h提供C语言标准中通用的功能,像定点
算术功能(abs、div、rand)、通用字符串至数字的转换、存储器内存空间管理(malloc、free)之类string.h处理字符串的函数,例如strcpy、strcmp、memcpy等time.h与时间相关的数据类型、宏,以及与表达式相关的用于时间计算的信息,如clock、
asctime、ctime等成信院-ADI联合实验室23C/C++Run-timeLibrary提供的库函数float.h浮点数据的处理limits.h定义Cdatatype的最大、最小值等等iso646.h布尔运算dev
ice.h交互设备驱动程序的宏和数据结构device_int.h交互设备驱动的列举和原型errno.h错误处理…加入C/C++Run-timeLibrary库的方法ProjectOption->Link->General->Search找到lib532.dlb的路径
或者用命令-lc532(C库libc532.dlb)-lcpp532(C++库libcpp532.dlb)使用时参考VisualDSP++4.5C/C++CompilerandLibraryManualforBla
ckfinProcessors.pdf成信院-ADI联合实验室24DSPRun-timeLibrary(libdsp)支持很多通用的DSP算法,例如滤波、FFT、矢量和矩阵函数、数学函数、窗函数等。这些DSP函数
支持不同的数据类型,包括float、double、fract16等。库文件位置:安装目录\Blackfin\lib\BF533调用的是libdsp532.dlb头文件位置:安装目录\Blackfin\includes\源代码位置:安装目录\Bla
ckfin\lib\src\libdsp\可根据需要对源代码进行修改,请将文件复制到其它地方,重命名后再进行修改。调用库文件时需要先引用相应的头文件。成信院-ADI联合实验室25Libdsp提供的库函数comples.h基本复数运算
。包含各类复数类型(如complex_float、complex_fract16)变量的定义和基本数学操作,例如复数绝对值、复数加减法、复数乘除法、获取复数相位、共轭、归一化等filter.h滤波和变换滤
波包括FIR、IIR、直接I型IIR、抽取/内插FIR、复数FIR等等变换FFT、获得FFT旋转因子、IFFT、R4-FFT等卷积卷积操作、二维卷积、3*3矩阵的二维卷积等压缩/扩展的相关函数包括A律、u律压缩/扩展math.h数学函数,例如求绝对值、指数、对数、幂
运算、三角运算、最大值、最小值、平方根等。matrix.h矩阵函数,如实数/复数矩阵加/减/乘一个标量、矩阵转置等stats.h统计函数。包括自相关、互相关、柱状图、均值、方差、过零点等vector.h向量函数,包含实数与复数的向量操作,例如点积、向量加/减/乘一个标量、向量中的最大
、最小元素及各自的索引等。window.h滤波、谱分析加窗时的窗函数。包括Gaussian窗、Hamming窗、Kaiser窗、三角窗等。使用时参考VisualDSP++4.5C/C++CompilerandLibraryManualforBlackf
inProcessors.pdf成信院-ADI联合实验室26数字滤波的实现滤波及频谱分析可以采用ADI提供的滤波器库函数(DSPrun-timelibrary中的库函数),需要包含filter.h(滤波器及变换的头文件),即#include<filter.h>。
滤波器初始化fir_init(state,coefs,delay,NUM_TAPS,1);其中state为初始状态,coefs为滤波器系数,delay为线性缓冲区的首地址,NUM_TAPS为滤波器阶数,最后一个
参数表示是否内插或抽取(interpolation/decimationindex)事实上,fir_init就是一个宏,即:#definefir_init(state,coeffs,delay,ncoeffs,ind
ex)\(state).h=(coeffs);\(state).d=(delay);\(state).p=(delay);\(state).k=(ncoeffs);\(state).l=(index)成信院-ADI联合实验室27对输入信号进行滤波fir_fr16(
in,out,VEC_SIZE,&state);其中in为输入信号缓冲区的首地址,out为输出信号缓冲区的首地址,VEC_SIZE为每次参与滤波的数据的长度(缓冲区的长度),&state表示初始状态,由fir_init(state,coefs,delay,NUM_TAPS,1);获得。
源代码可以在:安装目录下\Blackfin\lib\src\libdsp\找到fir_fr16.asm成信院-ADI联合实验室28输入信号产生与引入实验中输入的信号可以事先由Matlab编程获得fid=fopen('signal.dat','w');fprintf(fid,'0x%04x,
\n',x1);fclose(fid);使用时在DSP程序中采用fract16in[256]={#include“signal.dat”};也可以在DSP程序中编程得到信号#include<math.h>#i
nclude<math_const.h>*out=(fract16)(0.5*sin(2*PI*f*step)*32768.0);加噪声#include<stdlib.h>*out+=(fract16)((rand()-
0x20000000)>>15;成信院-ADI联合实验室29频谱分析的实现计算旋转因子voidInit_FFT(void)(需包含#include<filter.h>){twidfftrad2_fr16(fft_twid,VECTOR_SIZE);}获取循环缓冲区的指针(需包含#inc
lude<ccblkfn.h>)counter=__builtin_circindex(counter,INPUT_SIZE,current_size);给信号加窗(需包含#include<window.h>)fft_in[i]=mult_fr1x16(win_bart[i],input_a
rr[i]);FFT计算(需包含#include<filter.h>)rfft_fr16(fft_in,fft_temp,fft_out,fft_twid,(int)VECTOR_SIZE/current_size,current_size,1,1);计算
FFT的幅度谱(需包含#include<complex.h>)for(i=0;i<current_size;i++){fft_mag[i]=cabs_fr16(fft_out[i]);//fft_mag[i]=sqrt(fft_out[i].re*fft_out[i].re+fft_out[i
].im*fft_out[i].im);}成信院-ADI联合实验室30CircularaddressingA[i%n]Thecompilernowattemptstotreatarrayreferencesoftheformar
ray[i%n]ascircularbufferoperations.-force-circbufcanhelpthecompilertoacceptthesafetyofacircularbufferaccess.E
xplicitcircularaddressingofanarrayindex:longcircindex(longindex,longincr,unsignedlongnitems)Explicitcircularaddressingo
napointer:void*circptr(void*ptr,longincr,void*base,unsignedlongbuflen)成信院-ADI联合实验室31设备驱动库函数应用实时操作系统(可选)设备管理
器物理驱动物理驱动物理驱动系统服务程序设备驱动程序drivers\adi_dev.hdrivers\adi_uart.hservices\services.h成信院-ADI联合实验室32采用设备驱动这种方式,使应用程序不用考虑控制硬件设备的细节,对
应用程序而言,设备的控制与正常的调用函数没有什么不同。设备驱动程序位于系统服务程序的上方,设备驱动程序将调用系统服务程序,如中断。设备驱动库是ADI提供的部分器件的设备驱动程序集合。如果在系统中使用的是设备驱动库中的设备,则对BlackfinDSP来说直接调用设备驱动库中相应的
文件和函数即可;如果使用的设备不在设备驱动库中,也可以参照ADI的同类型器件的设备驱动程序来编写所用设备的驱动程序。使用时需要包含:#include<services\services.h>//系统服务程序#include<drivers\adi_dev.h>//
设备管理器#include<drivers\adi_uart.h>//UART驱动程序成信院-ADI联合实验室33#include<services\services.h>//系统服务程序包括了所有的系统服务程序,如DMA、中断
、接口控制等服务程序#include<drivers\adi_dev.h>//设备管理器包括了所有关于设备驱动程序的一般信息,如API、返回码、事件代码即所有的设备驱动程序一般信息#include<drivers\adi_xxx.h>//xxx设备的驱动程序特定的设备的驱动程序的
包含文件,应当包含设备驱动程序本身。相关文件所在位置如下:头文件在安装目录下Blackfin\include\drivers或services文件夹中各个驱动程序的源代码在安装目录下Blackfin\lib\src\drivers或services文件夹中库文件在安装目录下Bla
ckfin\lib文件夹中成信院-ADI联合实验室34设备管理adi_dev.hadi_dev_Open()–Opensadeviceforuseadi_dev_Close()–Closesdow
nadeviceadi_dev_Read()–Providesadevicewithbuffersforinbounddataadi_dev_Write()–Providesadevicewithbuffersforoutbounddataadi_dev_Control()–
Sets/detectscontrolandstatusparametersforadevice成信院-ADI联合实验室35系统服务:SystemInterruptControllerFunctions
adi_int_SICEnable–EnablesperipheralinterruptstobepassedtotheCECadi_int_SICDisable–DisablesperipheralinterruptsfrombeingpassedtotheCECadi_i
nt_SICSetIVG–SetstheIVGleveltowhichaperipheralinterruptismappedadi_int_SICGetIVG–DetectstheIVGleveltowhichaperipheralinterruptismappedadi_int
_SICWakeup–Establisheswhetherornotaperipheralinterruptwakesuptheprocessorfromanidledstateadi_int_SICInterruptAsserted()–Detectswhetherornotaperipher
alinterruptisasserted.成信院-ADI联合实验室36不同的开发板都有相应的驱动库的使用示例程序供参阅,位置在\AnalogDevices\VisualDSP4.5\Blackfin\Examples\ADSP-BF533EZ-Ki
tLite\Drivers关于系统服务的示例程序,位置在\AnalogDevices\VisualDSP4.5\Blackfin\Examples\ADSP-BF533EZ-KitLite\Services
外设驱动相关的文档在\AnalogDevices\VisualDSP4.5\Blackfin\docs\drivers中关于系统服务及设备驱动请参考:VisualDSP++4.5DeviceDriversandSystemServicesManualforBlackfi
nProcessors.pdf成信院-ADI联合实验室37C与汇编混合编程用C语言编程结构化程度高,易于编写,但执行速度相对较慢;与之相反,汇编程序速度快,但很难有较好的结构,且编写起来耗时,不易调试。C和汇编混合编程结合了各自的优势,往往能构造出结构化好且执行速度快的程序。C和汇编混
合编程,通常有两种基本方法:一是C代码中内嵌汇编代码;二是C代码中调用汇编语言写的子函数。在第一种方法中,采用C的库函数asm()内嵌代码,这比较简单,但不常用;第二种方法为常用的混合编程方法,通常在优化代码时使用,但这种方法比前一种复杂。成信院-A
DI联合实验室38C调用汇编要命名一个与C/C++标识符对应的汇编标识符,当在汇编程序中使用它们时在C/C++标识符前加下划线。在汇编程序和C/C++中公用(相互调用)的函数或变量,需要在汇编程序中用.GLOBAL伪指令声明该标识符,然后通过在C/C++程序中将该
标识符声明为extern型将其导出。C调用汇编函数时,前三个参数依次传给R0、R1、R2,多于三个参数时,多出的参数依次压入堆栈。返回时,返回值小于或等于32位用R0返回;入大于32位且小于等于64位,使用R0、R1返回。汇编中定义C中调用(C调
用汇编)externintasm_var;externvoidasm_func(void);.global_asm_var;.byte_asm_var=0x00,0x01,0x02,0x03;.global_asm
_func;_asm_func:…成信院-ADI联合实验室39BlackfinC编程注意事项如果在多个C文件中使用同一个符号,在符号的定义文件中定义为全局,然后在头文件中使用extern将其导出。使用时包含该头文件,这样就可以直接使用这个符号了。BF533片内外设寄存器(MMR寄存器)的地
址定义在cdefBF53x.h中(实际在cdefBF532.h中),使用外设时应该包含该文件,即#include<cdefBF53x.h>如果需要使用BF533的MMRs寄存器的一些预设值(即一些寄存器
中的位的位定义),例如DI_EN、MDSIZE_8等宏定义,需要包含defBF532.h如果需要使用内置的系统服务函数,例如ssync()、sysreg_read(),则需要包含ccblkfn.h成信院-A
DI联合实验室40def_LPBlackfin.h定义内核MMRs寄存器(例如核定时器、中断寄存器、状态寄存器、配置寄存器等)的地址及其位定义,需要使用内核寄存器时需要包含该文件注意:cdefBF53x.h文件中已经包含了defBF532.h、ccblkfn.h、def_LPBlackfin.
h等,所以如果文件中已经包含了cdefBF53x.h这个头文件,就不必再包含defBF532.h、ccblkfn.h、def_LPBlackfin.h等其它头文件了成信院-ADI联合实验室41sysreg.h中有访问系统寄存器(即外设寄存器)的寄存器名字的定义,例如reg_CYCLES,
可以通过sysreg_read、sysreg_write等这些系统函数来访问,使用sysreg.h时需要使用ccblkfn.h头文件。一般sysreg.h和ccblkfn.h这两个头文件一起出现,即#include<sysreg.h>#include<ccblkfn.h>
exception.h中包含了关于中断、异常的寄存器的宏定义,中断矢量表、中断类型定义、中断信息定义等,若使用EX_INTERRUPT_HANDLER()、register_handler()等这些宏,需要包含头文件excepti
on.h,即#include<sys/exception.h>成信院-ADI联合实验室42如果用户自己开发了扩展板,或使用CPLD,需要为一些外围设备分配地址(选通地址、芯片内的内部寄存器地址等),则需要编写一个用户自己的头文件来定义这些地址,例如北京迪码公
司的SSK板就采用了dm_bf5xx.h来定义板上的资源。如需要使用SSK板上的资源,则需要在文件头包含dm_bf5xx.h文件,即#include“../exception.h”一般习惯把所需要包含的所有
头文件、以及一些全局变量、常量、函数声明等都放在一个头文件里面,这样只需要在应用程序中包含这一个头文件就可以了。一般先使用idle()再使用ssync()使系统进入空闲模式;一般先访问MMRs,然后再使用csync()
,以防止不确定状态发生。成信院-ADI联合实验室44获取帮助最直接的方法:在VisualDSP++中选中不明白的错误提示或寄存器名,然后按F1键,或者直接点击菜单“HelpSearch”,输入关键词搜索。对包含的头文件的功
能不明白或对调用的库函数调用方法不清楚,可以在文件的开始部分选中头文件,然后点击右键,选中“OpenDocument<headfilename.h>”某个变量、宏或函数在哪里定义、相互直接如何调用的,如果对这些不明白,可以先选中该变量名、宏名或函数名,再通过菜单“EditFin
dinfiles…”搜索,其中“Infolds”可以指定搜索范围。这是一个很好的阅读、理解程序方法。专业论坛、QQ群、ADI官方网站、ADI第3方(相关公司)的网站等也是获取帮助的好办法成信院-ADI联合实验室45查看技术文档是学习DSP的好方法:开发环境VisualDS
P++4.5GettingStartedGuide.pdfvdsp.chmBF533EZ.chm硬件(内核、外设、中断、DMA等)ADSPBF533BlackfinProcessorHardwareReference.pdfBF533-hwr
.chm软件编程(C语言)VisualDSP++4.5C/C++CompilerandLibraryManualforBlackfinProcessors.pdfVisualDSP++4.5DeviceDriversandSystemServicesManualforBlackfinProc
essors.pdf45_cc_blackfin.chm软件编程(汇编语言)ADSP-BF53x-BF56xProcessorProgrammingReference.pdfbf53x-56x-pr.c
hmBLKFIN-ISR-30.chm应用设计App_note_articles.chm所有的*.chm文件在x:\ProgramFiles\AnalogDevices\VisualDSP4.5\Help路径下,其中
通过helphelp.chm可以知道如何获取帮助。成信院-ADI联合实验室/10/2946.