




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CCS混合编程方法简介一、C语言编程和汇编语言编程优缺点分析1使用 C 语言开发应用程序的优缺点:*优点:-易于开发和维护。由于用 C 语言书写接近自然语言,其可读性强、利于理解,在编制、 修改、实现算法方面比用汇编语言开发容易。-可移植性强。-不容易发生流水线冲突。编译器能提供完善的解决流水线冲突的结果。-有大量现存的算法可利用。-适用于人机界面的开发。*缺点:-代码量大。-程序效率较低。-优化代码存在一定困难。综上所述,我们一般用 C 语言设计应用程序的总体框架、解决人机接口和对速度效率要求 不太高的复杂算法。2使用汇编语言开发应用程序的优缺点:*优点:-更能发挥系统特点。由于汇编语言掌控系统硬件的能力强于 C 语言,设计出来的程序更加贴近硬件特性,往往能将硬件效能发挥到极致。-代码精练,效率高。用汇编语言设计的程序,代码短、不容易产生冗余。-代码量小。*缺点:-可读性差。不利于复杂算法的开发和实现。-可移植性差。-容易产生流水线冲突。由于排除冲突需要靠人来辅助完成,这要求编程人员有较为丰富的开发经验和对硬件工作机制的深刻理解。3如何混合编程: 混合工程:在工程中可以同时包含 C 语言程序和汇编语言程序,无需更改编译选项。一 般地,我们使用 C 程序为主,加入汇编语言程序模块。 使用模块技术:在应用程序中划分出比较清晰的模块,不同模块可采用不同语言设计。 强调效率和速度的模块采用汇编设计。尽量少用汇编语言设计程序。 如何找出需要用汇编程序设计的模块:-用 C 语言完成设计后,运用 CCS 的软件仿真功能,充分测试程序,找到程序运行中的 瓶颈(速度方面的和空间方面的)。-再使用分块仿真技术尽可能缩小模块。-找到的模块单独写成子程序,存入独立的文件中。-由于 CCS 编译器能产生 C 语言程序到汇编程序的中间文件,观察需要优化的模块的汇 编结果,进行人工优化。-最后运用人工优化后形成的汇编程序模块,代替原来需要优化的 C 语言模块,进行编译。-程序中可使用内嵌汇编。比如:asm(“ MOV T1, *SP(#1)”); 编译器可直接使用内嵌的汇 编语句生成最终代码。但需要语句中双引号中为合法的汇编语句,比如要以空格开头等 等。4何时使用混合编程技术:-当程序中需要操作与硬件密切相关的设备,而用 C 语言较难实现时。比如:在中断程序设 计时需要设置中断向量表,向量表中空间有时用 C 语言语句有困难,且向量表要在内存中 精确定位,这时可将设置中断向量表的部分用汇编语言代替。-当需要绕开 C 编译器的规定,进行特殊操作时。比如:C 语言规定,程序不能访问程序代码区,而系统功能需要进行类似访问时可采用限制较小的汇编语言程序设计。-当需要提高模块的效率(包括空间上和时间上两方面的),而 C 语言程序无法达到要求时。5使用混合编程时的注意事项:-在汇编程序中使用其他 C 语言模块中定义的变量或函数名称时,需要在引用的名称前加一 下划线。如:C 中定义的变量为 x,在汇编中引用时要用_x。-汇编语言写的子程序需要符合 C 语言的调用规则,尤其是在默认的辅助寄存器使用上和栈 的使用上要求兼容。-在汇编语言模块中,需要编程者自己消除流水线冲突。-在使用内嵌汇编技术时,需要考虑以下内容:.要非常小心地处理,以免破坏 C 语言操作环境。编译器在遇到内嵌汇编语句时,不会对其中的汇编语句进行分析处理。.避免从内嵌汇编语句跳转到 C 语言模块中,那将极容易造成寄存器使用上的混乱,从而产生难以预料的结果。.不要在内嵌汇编语句中改变 C 语言模块中变量的值,但可以安全地读取它们的值。.在汇编程序中不要使用内嵌汇编。二、以TMS320VC5509的FIR程序为例讲解怎样使用C和汇编语言混合编程(1)用汇编语言编写一个64阶FIR滤波器程序* fir64.asmv1.00 64阶FIR滤波器程序 */.ref _mtmp,_Type.mmregs.global _FIR321,_FIR_Init.data.bss f32_p,1.bss temp,1.align 256COFF1_FIR32: ;3K低通.word -15, -28, -6, 31, 37, -10, -64, -44, 54.word 115, 28, -140, -166, 46, 269, 178, -206, -422.word -97, 477, 551, -149, -872, -576, 679, 1429, 345.word -1842, -2412, 803, 6794, 11599, 11599, 6794, 803, -2412.word -1842, 345, 1429, 679, -576, -872, -149, 551, 477.word -97, -422, -206, 178, 269, 46, -166, -140, 28.word 115, 54, -44, -64, -10, 37, 31, -6, -28,-15;1K 高通 .word 11, 22, 33, 43, 48, 45, 29, 0 .word -43, -95, -148, -190, -206, -185, -116, 0, 156.word 332, 499, 622, 663, 587, 369, 0, -511, -1134.word -1823, -2517, -3149, -3656, -3983, 28676, -3983, -3656, -3149.word -2517, -1823, -1134, -511, 0, 369, 587, 663, 622 .word 499, 332, 156, 0, -116, -185, -206, -190, -148.word -95, -43, 0, 29, 45, 48, 43, 33, 22, 11, 0;带通1k-3K .word -10, -12, 20, 67, 80, 34, -28, -29, 35.word 50, -90, -305, -361, -149, 117, 115, -134, -183 .word 317, 1041, 1201, 488, -378, -374, 441, 620, -1128.word -4019, -5264, -2624, 2949, 7534, 7534, 2949, -2624, -5264 .word -4019, -1128, 620, 441, -374, -378, 488, 1201, 1041 .word 317, -183, -134, 115, 117, -149, -361, -305, -90.word 50, 35, -29, -28, 34, 80, 67, 20, -12,-10 DATA_P .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .text_FIR_Init:PSHM AR6MOV#DATA_P,AR6MOV #0, AC0RPT #63MOVAC0,*AR6+MOV #DATA_P,AC0MOV AC0,*(f32_p)POPM AR6RET_FIR321: BSET C54CM PSHM T2PSHBOTH XAR2PSHBOTH XAR3PSHM AR5PSHM T3PSHM T0.asg AR2,FIR_DATA_P.asg AR3,FIR_COFF_PBSET SXMD;data sign ext. before usage BCLR SATD;no saturation of accu if overflowBSETFRCTMOV#COFF1_FIR32,DPRSBXCPLAMOV #0, XAR2AMOV #0, XAR3MOV #63,BK03 ; FIR circular bffr sizeMOV#1,AR0MOV *(f32_p),FIR_DATA_PNOPNOPMOV *(_Type),AC0ADD #COFF1_FIR32,AC0MOV AC0,FIR_COFF_PNOPNOPMOV *(_mtmp),AC0 fir_filter:MOV AC0,*FIR_DATA_P ; replace oldest sample with newest; sample;MOV FIR_DATA_P,*(f32_p) NOPNOPMOV #0, AC0RPT #63MACM *FIR_DATA_P+,*FIR_COFF_P+,AC0 ; filteringNOPNOPNOPNOPMOV #DATA_P+63,FIR_DATA_PMOV #DATA_P+62, FIR_COFF_PNOPNOPNOPNOPRPT #62MOV *FIR_COFF_P-,*FIR_DATA_P- MOV HI(AC0), *(_mtmp) NOPNOPPOPMT0POPMT3POPMAR5POPBOTHXAR3POPBOTHXAR2POPM T2BCLR C54CM NOPNOPNOPNOPNOPRET.end(2)编写FIR滤波器主程序main.c/* main1.cv1.00 FIR滤波器主程序 */#include stdio.h#define LowPass 0#define HighPass 1#define BandPass 2extern void CLK_init(void);extern void EMIF_init(void);extern void INTR_init(void);ioport volatile unsigned int *DRR20 = (unsigned int *)0x2800;ioport volatile unsigned int *DRR10 = (unsigned int *)0x2801;ioport volatile unsigned int *DXR20 = (unsigned int *)0x2802;ioport volatile unsigned int *DXR10 = (unsigned int *)0x2803;ioport volatile unsigned int *SPCR20 = (unsigned int *)0x2804;ioport volatile unsigned int *SPCR10 = (unsigned int *)0x2805;ioport volatile unsigned int *RCR20 = (unsigned int *)0x2806;ioport volatile unsigned int *RCR10 = (unsigned int *)0x2807;ioport volatile unsigned int *XCR20 = (unsigned int *)0x2808;ioport volatile unsigned int *XCR10 = (unsigned int *)0x2809;ioport volatile unsigned int *SRGR20 = (unsigned int *)0x280A;ioport volatile unsigned int *SRGR10 = (unsigned int *)0x280B;ioport volatile unsigned int *MCR20 = (unsigned int *)0x280C;ioport volatile unsigned int *MCR10 = (unsigned int *)0x280D;ioport volatile unsigned int *RCERA0 = (unsigned int *)0x280E;ioport volatile unsigned int *RCERB0 = (unsigned int *)0x280F;ioport volatile unsigned int *XCERA0 = (unsigned int *)0x2810;ioport volatile unsigned int *XCERB0 = (unsigned int *)0x2811;ioport volatile unsigned int *PCR0 = (unsigned int *)0x2812;int *SetExtAddrPort = (int *)(0x803810 1);int *CPLDPortAddr = (int *)(0x802000 1);int mtmp;int Type;void Delay() int temp,ft; for(ft=0;ft100;ft+) for (temp=0;temp1000;temp+) ;void ShortDelay()int tmp;for(tmp=0;tmp100;tmp+) ;void MainDelay(unsigned int count)int tmp;for(tmp=0;tmp DARAM .vectors: VECT .trcinit: DARAM .gblinit: DARAM frt: DARAM .cinit: DARAM .pinit: DARAM .sysinit: DARAM .data: DARAM2 .bss: DARAM2 .far: DARAM2 .const: DARAM2 .switch: DARAM2 .sysmem: DARAM2 .cio: DARAM2 .MEM$obj: DARAM2 .sysheap: DARAM2 .sysstack DARAM2 .stack: DARAM2 (5)建立FIR工程,并将以上编写的文件考到工程文件下。将以上几个文件添加到工程中,编译下载。通过以上的5个步骤可以建立一个C和汇编混编的工程。该工程可以很好的体现混编的优点,通过C语言搭建整体程序设计框架,同时将64阶fir的算法通过汇编语言实现可以很好的体现出汇编语言直接控制硬件的便利性。三、典型算法在TMS320VC5509上的C语言实现。下面对TMS320VC5509的典型算法编程进行举例。(1) 快速傅里叶变换 (FFT) 实现傅里叶变换是一种将信号从时域变换到频域的变换形式,是信号处理的重要分析工具。离散傅里叶变换(DFT)是傅里叶变换在离散系统中的表示形式。但是DFT的计算量非常大, FFT就是DFT的一种快速算法, FFT将DFT的N2 步运算减少至 ( N/2 )log2N步。离散信号x(n)的傅里叶变换可以表示为,式中的WN 称为蝶形因子,利用它的对称性和周期性可以减少运算量。一般而言,FFT算法分为时间抽取(DIT)和频率抽取(DIF)两大类。两者的区别是蝶形因子出现的位置不同,前者中蝶形因子出现在输入端,后者中出现在输出端。本实验以时间抽取方法为例。时间抽取FFT是将N点输入序列x(n) 按照偶数项和奇数项分解为偶序列和奇序列。偶序列为:x(0), x(2), x(4), x(N-2);奇序列为:x(1), x(3), x(5), x(N-1)。这样x(n) 的N点DFT可写成:考虑到WN的性质,即因此有:或者写成:由于Y(k) 与Z(k) 的周期为N/2,并且利用WN的对称性和周期性,即:可得:对Y(k) 与Z(k) 继续以同样的方式分解下去,就可以使一个N点的DFT最终用一组2点的DFT来计算。在基数为2的FFT中,总共有log2(N) 级运算,每级中有N/2 个2点FFT蝶形运算。单个蝶形运算示意图如下:以N8为例,时间抽取FFT的信号流图如下:从上图可以看出,输出序列是按自然顺序排列的,而输入序列的顺序则是“比特反转”方式排列的。也就是说,将序号用二进制表示,然后将二进制数以相反方向排列,再以这个数作为序号。如011变成110,那么第3个输入值和第六个输入值就要交换位置了。本实验中采用了一种比较常用有效的方法完成这一步工作雷德算法。在5509的算法实现/* Program for FFT */#include #include const float pi=3.1415926;int N;/* FFT点数 */float x_re300, x_im300; /* 输入信号序列 */float y_re300, y_im300;/* 输出频谱序列 */float w_re, w_im;/* 蝶形因子 */int m;/* 蝶形运算的级数,即Log2(N) */float t_re, t_im, v_re, v_im; /* 临时变量 */int j,i,k,f,n; int a, b, c;main() N=64;/* 初始化数据空间 */for(i=0; i300; i+)x_rei=0;x_imi=0;/* 设定输入信号序列为单边指数函数 */* 考虑到实际衰减很快,因此可以忽略后面大半部分数值 */for(i=0;i=N;i+) x_rei=exp(-i); x_imi=0;/* 复制到输出数组 */for(i=0; i300; i+)y_rei=x_rei;y_imi=x_imi;/* 用雷德算法对输入信号序列进行倒序重排 */ j=0; for(i=0;iN;i+) if(ij) t_re=y_rej; t_im=y_imj; y_rej=y_rei; y_imj=y_imi; y_rei=t_re; y_imi=t_im; k=N/2; while(k0) j=j-k; k=k/2; j=j+k; /* 计算蝶形运算的级数log2(N) */f=N;for(m=1; (f=f/2)!=1; m+); /* FFT */ for(n=1; n=m; n+) a=1;/* a=2的n次方 */ for(i=0;in;i+) a=a*2; b=a/2; v_re=1.0; /* 蝶形因子 */ v_im=0.0; w_re=cos(pi/b); w_im=-sin(pi/b); for(j=0;jb;j+)/* 蝶形运算 */ for(i=j;iN;i=i+a) c=i+b; t_re=y_rec*v_re-y_imc*v_im; t_im=y_rec*v_im+y_imc*v_re; y_rec=y_rei-t_re; y_imc=y_imi-t_im; y_rei=y_rei+t_re; y_imi=y_imi+t_im; t_re=v_re*w_re-v_im*w_im; t_im=v_re*w_im+v_im*w_re; v_re=t_re; v_im=t_im; (2) 离散余弦变换 (DCT) 实现尽管傅里叶变换具有很多优点,得到了广泛的应用,但是它也有缺点。例如:傅里叶变换需要计算的是复数而不是实数,一般进行复数运算要比进行实数运算费时得多。如果采用其它合适的完备正交函数系来代替傅里叶变换所利用的正、余弦函数构成的完备正交函数系,就可以避免这种复数运算。离散余弦变换就是基于实数的正交变换。一维的离散余弦变换的定义如下:式中F(k)为第k个余弦变换系数,f(x)为时域中的N点序列。要进行离散余弦变换可以从它的定义出发,但这样做的计算量相当大,在实际应用中非常不便,因此需要一种快速算法。首先,将f(x)进行延拓:按照一维离散余弦变换的定义有:由于是fe(x)的2N点离散傅里叶变换,因此,在作离散余弦变换时,可以把长度为N的序列f(x)的长度延拓为2N的序列,然后对延拓的结果进行离散傅里叶变换,最后提取离散傅里叶变换的实部便是离散余弦变换的结果。在作离散傅里叶变换时可以采用快速傅里叶变换方法(FFT)。本实验就是在实验5.4的基础上完成的,程序主体部分利用了上一个实验的FFT算法,最后对FFT变换的结果提取实部并乘上系数即可。在5509的算法实现/* Program for DCT */#include #include const float pi=3.1415926;int N;/* FFT点数 */int N2;/* N2=2*N */float x_re300, x_im300; /* 输入信号序列 */float y_re300, y_im300;/* 输出频谱序列 */float ck300;/* 离散余弦变换系数 */float w_re, w_im;/* 蝶形因子 */int m;/* 蝶形运算的级数,即Log2(N) */float t_re, t_im, v_re, v_im; /* 临时变量 */int j,i,k,f,n; int a, b, c;main() N=8;N2=2*N;/* 初始化数据空间 */for(i=0; i300; i+)x_rei=0;x_imi=0;cki=0;/* 设定输入信号序列为单边指数函数 */* 考虑到实际衰减很快,因此可以忽略后面大半部分数值 */for(i=0;iN;i+) x_rei=exp(-i); x_imi=0;/* 对信号序列进行延拓 */for(i=N;iN2;i+);/* 复制到输出数组 */for(i=0; i300; i+)y_rei=x_rei;y_imi=x_imi;/* 用雷德算法对输入信号序列进行倒序重排 */ j=0; for(i=0;iN2;i+) if(ij) t_re=y_rej; t_im=y_imj; y_rej=y_rei; y_imj=y_imi; y_rei=t_re; y_imi=t_im; k=N2/2; while(k0) j=j-k; k=k/2; j=j+k; /* 计算蝶形运算的级数log2(N) */f=N2;for(m=1; (f=f/2)!=1; m+); /* FFT */ for(n=1; n=m; n+) a=1;/* a=2的n次方 */ for(i=0;in;i+) a=a*2; b=a/2; v_re=1.0; /* 蝶形因子 */ v_im=0.0; w_re=cos(pi/b); w_im=-sin(pi/b); for(j=0;jb;j+)/* 蝶形运算 */ for(i=j;iN2;i=i+a) c=i+b; t_re=y_rec*v_re-y_imc*v_im; t_im=y_rec*v_im+y_imc*v_re; y_rec=y_rei-t_re; y_imc=y_imi-t_im; y_rei=y_rei+t_re; y_imi=y_imi+t_im; t_re=v_re*w_re-v_im*w_im; t_im=v_re*w_im+v_im*w_re; v_re=t_re; v_im=t_im; /* 提取实部作为离散余弦变换的系数 */ for(i=0;iN;i+) ck0=ck0+x_rei; ck0=ck0/sqrt(float)N); for(i=1;iN;i+) cki=cos(i*pi)/N2)*y_rei-sin(-(i*pi)/N2)*y_imi; cki=sqrt(2.0/N)*cki; (3) 无限冲击响应滤波器 (IIR) 实现数字滤波器的输入xk和输出yk之间的关系可以用如下常系数线性差分方程及其z变换描述:系统的转移函数为:设计一个IIR滤波器就是要根据所给定的指标确定上式中的分子和分母系数。设计IIR数字滤波器可以先设计一个合适的模拟滤波器,然后变换成满足给定指标的数字滤波器。这种方法很简便,因为模拟滤波器有多种设计方法,如巴特沃思型滤波器、切比雪夫型滤波器、椭圆函数型滤波器等,并且已经具有很多简单而又现成的设计公式。采用这种方法需要把s平面映射到z平面,使模拟系统函数H(s)变换成所需的数字滤波器的系统函数H(z)。映射方法主要有冲激响应不变法、阶跃响应不变法和双线性变换法。前两种方法会因为多值映射关系产生混叠失真,双线性变换法克服了这一缺点。双线性变换法的映射关系式是:本实验采用的是巴特沃思型滤波器,并用双线性变换法转换成数字滤波器。在5509的算法实现/* Program for IIR */#include math.h#include #define pi 3.1415925float fp,fr,fs;/* 通带截止频率、阻带截止频率、抽样频率 */float ap, ar;/* 容限(dB) */float ptr_a50,ptr_b50; /* 系统函数H(z)的分母系数和分子系数 */float hwdb50;/* 幅频响应值 */float b_real50,b_imag50;float b1_real50,b1_imag50,b2_real50,b2_imag50;float d50,e50,g50;float f12,f22,h50;/* 函数定义 */void bcg(float ap,float as,float wp,float ws,int *n,float *h) /*求H(s)分母系数*/ int i,k; float a,p,wc,cs1,cs2; float c; c=(pow(10.0,0.1*as)-1.0)/(pow(10.0,0.1*ap)-1.0); *n=(int)(fabs(log10(c)/log10(ws/wp)/2.0)+0.99999); /*求N*/ wc=wp; a=pow(wc,(double)(*n); for(i=0;i*n;i+) /*求极点*/ p=pi*(0.5+(2.0*i+1.0)/(2.0*(*n); b_reali=wc*cos(p); b_imagi=wc*sin(p); b1_real0=-(b_real0); b1_imag0=-(b_imag0); b1_real1=1.0; b1_imag1=0.0; if(*n!=1) for(i=1;i*n;i+) for(k=0;ki;k+) cs1=b1_realk-b1_realk+1*b_reali; cs2=b1_imagk-b1_realk+1*b_imagi; b2_realk+1=cs1+b1_imagk+1*b_imagi; b2_imagk+1=cs2-b1_imagk+1*b_reali; b2_real0=-(b1_real0*b_reali-b1_imag0*b_imagi); b2_imag0=-(b1_real0*b_imagi+b1_imag0*b_reali); b2_reali+1=b1_reali; b2_imagi+1=b1_imagi; for(k=0;k=i+1;k+) b1_realk=b2_realk; b1_imagk=b2_imagk; b2_realk=0.0; b2_imagk=0.0; for(i=0;i=*n;i+) hi=b1_reali/a;void pnpe(float *a,int m,int n,float *b,int *mn) /*多项式相乘的展开系数*/ int i,j,k,nk; float c50; *mn=m*n; for(i=0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新兴领域文化产业管理试题及答案
- 破解西医临床考试常见疑惑试题及答案
- 激光系统低噪声设计试题及答案
- 乐理考期中试题及答案
- 医生医院面试试题及答案
- 保护冰淇淋测试题及答案
- 药剂类考试复习技巧与试题及答案
- 药学教育的国际比较与借鉴考试试题及答案
- 药剂考试问题解析试题及答案
- 医学基础知识挑战性题目试题及答案
- 地下室顶板预留洞口施工方案标准版
- 儿童常见病中医治疗
- 演讲与口才2.4劝慰与道歉
- 中国古代建筑历史图说
- 2022年宁夏粮食和物资储备局所属事业单位考试真题及答案
- 川09J139 居住建筑油烟气集中排放建筑构造(DBJT20-65)
- 浙江工商大学论文答辩汇报通用ppt模板
- 2023届湖北省武汉市高三毕业生4月调考英语试卷及参考答案
- SMT失效模式分析PFMEA
- GB/T 35856-2018飞机电气设备绝缘电阻和耐电压试验方法
- GB/T 26774-2011车辆运输车通用技术条件
评论
0/150
提交评论