湘潭大学数字信号处理实验报告第三次混合编程.docx
《湘潭大学数字信号处理实验报告第三次混合编程.docx》由会员分享,可在线阅读,更多相关《湘潭大学数字信号处理实验报告第三次混合编程.docx(13页珍藏版)》请在冰豆网上搜索。
湘潭大学数字信号处理实验报告第三次混合编程
数字信号处理实验报告(第三次)
学院:
班级:
姓名:
学号:
指导老师:
完成日期:
内容:
实验五混合编程
实验五混合编程
一、实验目的
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!
!
!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求
欢迎您的下载,资料仅供参考