湘潭大学数字信号处理实验报告第三次混合编程.docx

上传人:b****2 文档编号:2713771 上传时间:2023-05-04 格式:DOCX 页数:13 大小:245.92KB
下载 相关 举报
湘潭大学数字信号处理实验报告第三次混合编程.docx_第1页
第1页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第2页
第2页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第3页
第3页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第4页
第4页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第5页
第5页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第6页
第6页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第7页
第7页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第8页
第8页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第9页
第9页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第10页
第10页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第11页
第11页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第12页
第12页 / 共13页
湘潭大学数字信号处理实验报告第三次混合编程.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

湘潭大学数字信号处理实验报告第三次混合编程.docx

《湘潭大学数字信号处理实验报告第三次混合编程.docx》由会员分享,可在线阅读,更多相关《湘潭大学数字信号处理实验报告第三次混合编程.docx(13页珍藏版)》请在冰点文库上搜索。

湘潭大学数字信号处理实验报告第三次混合编程.docx

湘潭大学数字信号处理实验报告第三次混合编程

数字信号处理实验报告(第三次)

学院:

班级:

姓名:

学号:

指导老师:

完成日期:

内容:

实验五混合编程

 

实验五混合编程

一、实验目的

1.学习使用实时运行库;

2.熟悉用C和汇编混合编程的方法;

3.掌握混合编程的调试方法。

二、实验环境

1.集成开发环境CodeComposerStudio2.0(简称CCS)

2.实验程序mix.c,mix.h(由程序自动加载,可不加,后同),mix.cmd,addfun.s54,rts.lib(有C的混合编程需要有库文件),c5402.gel(要有,有C的混合编程要用gel初始设置。

选芯片时设置已自带,可不添加;如无则加)

三、实验步骤

1.改设置:

Buildoption子菜单linker中Basic项AutoinitModel改为load-timeInitialization或Run-timeInitialization(不同的设置,SP初始值将不同。

NoInitialization也可以,但效果不如前两个好)。

2.为使效果更明显,屏蔽前两条printf()语句(可与第三条对比,编译后将出现警告,可忽略),编译项目文件得到.out程序。

另外装载程序前,在Edit->Memory->Fill中,对DataMemory从0x0000到0xFFFF用全0x1111或0x2222等填充(注意:

填充后必须对Gel文件重新Load一次)。

然后装载程序,了解在混合编程环境下变量、函数的定义方法以及项目文件的编译方法。

屏蔽前两条printf()语句

//******************************************************************************

//SJTUDSPTech.Center

//Copyright(c)2001SJTUDSPTech.Center.AllRightsReserved.

//

//Description:

//TMS320C54xProgramforStudentsExperiment

//

//History:

//DateAuthors

//2003/07/23ZhengYigang

//******************************************************************************

#include

#include"mix.h"

intmix_func_c(int*wl,int*wr,intval)

{

inti,val_min,tmp[8];

for(i=0;i<8;i++)

tmp[i]=wl[i]*wr[i];

val_min=val;

for(i=0;i<8;i++)

{

if(val_min>tmp[i])

val_min=tmp[i];

}

returnval_min;

}

voidmain()

{intval,i,wl[8],wr[8];

intmin_asm,min_c;

//registersetting

asm("stm#0,SWWSR");

asm("stm#0x00A0,PMST");

//min_asm=1900;

//min_c=2000;

//callsystemfunction

val=-100;

val=abs(val);

printf("val=%d\n",val);

//callasmfunction

for(i=0;i<8;i++)

{

wl[i]=i;

wr[i]=2*i+1;

}

min_asm=mix_func(wl,wr,val);

printf("val=%d\n",min_asm);

min_c=mix_func_c(wl,wr,val);

printf("val=%d\n",min_c);

return;

}

DataMemory从0x0000到0xFFFF用全0x1111或0x2222等填充

3.打开ViewMemory,用SP值(Debug_>Gomain后的值)作为开始察看地址,从主程序main开始用SingleStep方式调试程序,观察程序的执行过程。

尤其是在C程序中调用汇编子函数以及返回的过程,注意当前SP和PC的变化。

SP和PC情形一

SP和PC情形二

4.看懂代码,比较结果,并画出程序流程图;

程序流程图

四、实验结果分析

1.实时运行库

实时运行库提供了标准C中的大部分函数,帮助建立C语言的环境,同时也提供一些基本的调试手段,如printf()等。

2.程序接口

参数传递是混合编程中非常重要的一部分:

第一个参数放置在寄存器A中,其他参数按照逆序压入堆栈;返回的数据放置在寄存器A中。

3.局部数据

局部数据是在堆栈中开设的,程序返回前消除。

4.关于堆栈保护

在子程序addfun中,由于需要改变ST1中的数值,所以在子程序入口处先用语句pshmST1;ST1的值在堆栈中保护起来;

在子程序返回前,再用语句popmAR1;恢复ST1原来的值。

注:

例程见目录\\71_mix.

mix.cmd中段设置说明:

1.The.cinitsectioncontainstablesforinitializingvariablesandconstants.

2.The.constsectioncontainsstringconstantsanddatadefinedwiththeC/C++qualifierconst(providedtheconstantisnotalsodefinedasvolatile).

3.The.textsectioncontainsalltheexecutablecodeaswellasstringliteralsandcompiler-generatedconstants.

4.The.bsssectionreservesspaceforglobalandstaticvariables.Whenyouspecifythe-clinkeroption,atprogramstartup,theC/C++bootroutinecopiesdataoutofthe.cinitsection(whichcanbeinROM)andstoresitinthe.bsssection.

5.The.datasectionisnormallyusedtocontaintablesofdataorpreinitializedvariables.

[C程序代码]

#include

#include"mix.h"

intmix_func_c(int*wl,int*wr,intval)//C函数

{

inti,val_min,tmp[8];

for(i=0;i<8;i++)//乘法

tmp[i]=wl[i]*wr[i];

val_min=val;

for(i=0;i<8;i++)//最小值

{

if(val_min>tmp[i])

val_min=tmp[i];

}

returnval_min;//最小值作为程序的返回值

}

voidmain()

{intval,i,wl[8],wr[8];

intmin_asm,min_c;

//寄存器设置

asm("stm#0,SWWSR");

asm("stm#0x00A0,PMST");

//汇编程序里面的最小值min_asm=1900;

//C程序里面的最小值min_c=2000;

//调用系统函数callsystemfunction

val=-100;

val=abs(val);//绝对值

printf("val=%d\n",val);//输出val

//callasmfunction//调用汇编程序

for(i=0;i<8;i++)?

//表赋初值01234567

//0135791113

{

wl[i]=i;

wr[i]=2*i+1;

}

min_asm=mix_func(wl,wr,val);//汇编最小值

printf("val=%d\n",min_asm);//输出

min_c=mix_func_c(wl,wr,val);//C最小值

printf("val=%d\n",min_c);//输出

return;

}

[汇编程序代码]

.mmregs

;------------------------------------------------

;intmix_func(int*wl,int*wr,intval)

;{

;inti,val_min,tmp[8];

;------------------------------------------------

var_tmp.set0

;ST1

off_m.set-8

off_p.set8

frame_size.set9

;returnaddress

arg_wr.setframe_size+1

arg_val.setframe_size+2

.global_mix_func;说明:

外部变量非私有

.text

;在变量名前加一下划线"_"

_mix_func:

pshmST1

frame#off_m

ssbxOVM

;置1

;如果OVM位为1,则8000000000h的绝对值为007FFFFFFFh

;如果OVM位为0,则8000000000h的绝对值为8000000000h

;表赋值----------------------------

;for(i=0;i<8;i++)

;tmp[i]=wl[i]*wr[i];

;------------------------------------------------

stm#8-1,BRC

mvdk*SP(arg_wr),AR3;AR3=wr

mvmmSP,AR4;AR4=tmp

stlmA,AR2;AR2=wl

rptbtmp_loop-1

mpy*AR2+,*AR3+,A

stlA,*AR4+

tmp_loop:

;查找最小值---------------------------------------

;val_min=val;

;for(i=0;i<8;i++)

;{

;if(val_min>tmp[i])

;val_min=tmp[i];

;}

;

;returnval_min;

;}

;------------------------------------------------

ld*SP(arg_val),A

mvmmSP,AR2;AR2=tmp

stm#8-1,BRC

rptbcompare_loop-1

ld*AR2+,B

minA

compare_loop:

;比较?

frame#off_p

popmST1

ret

五、实验思考题

1、此程序实现的功能是什么?

答:

此程序实现的函数功能是求最小值。

分别可以用C语言和汇编语言两种编写方法。

2、C语言与汇编语言是如何调用的?

有何不同?

编译器会自动在标识符的开头加上下划线,因此在汇编程序中访问C函数的变量和函数,只需要在此变量前加上下划线,例如,名为“x”的C变量在汇编程序中的名字为“_x”。

对于志在汇编程序中使用的标识符,就不必在前面加下划线。

3、他们的参数是如何传递的?

答:

汇编程序调用C函数,第一个参数(最左边的参数)必须置入累加器A中,其他参数必须按逆序压入堆栈。

 

六、实验心得

本次实验相对于前面两次试验来说又增加了一定的难度,可是在助教的帮助下还是顺利地完成了试验。

这次试验使我对DSP有了进一步的了解,更加熟悉了ccs软件的使用。

 

THANKS!

!

!

 

致力为企业和个人提供合同协议,策划案计划书,学习课件等等

打造全网一站式需求

欢迎您的下载,资料仅供参考

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2