1、湘潭大学数字信号处理实验报告第三次混合编程数字信号处理实验报告(第三次) 学 院: 班 级: 姓 名: 学 号: 指导老师: 完成日期: 内容:实验五 混合编程实验五 混合编程一、实验目的1. 学习使用实时运行库;2. 熟悉用C和汇编混合编程的方法;3. 掌握混合编程的调试方法。 二、实验环境1. 集成开发环境Code Composer Studio 2.0(简称CCS)2. 实验程序mix.c,mix.h(由程序自动加载,可不加,后同),mix.cmd,addfun.s54,rts.lib(有C的混合编程需要有库文件),c5402.gel(要有,有C的混合编程要用gel初始设置。选芯片时设置
2、已自带,可不添加;如无则加)三、实验步骤1. 改设置:Build option子菜单linker中Basic项Autoinit Model 改为load-time Initialization或Run-time Initialization(不同的设置,SP初始值将不同。No Initialization也可以,但效果不如前两个好)。2. 为使效果更明显,屏蔽前两条printf( )语句(可与第三条对比,编译后将出现警告,可忽略),编译项目文件得到.out程序。另外装载程序前,在Edit-Memory-Fill中,对Data Memory从0x0000到0xFFFF用全0x1111或0x222
3、2等填充(注意:填充后必须对Gel文件重新Load一次)。然后装载程序,了解在混合编程环境下变量、函数的定义方法以及项目文件的编译方法。屏蔽前两条printf( )语句/*/ SJTU DSP Tech. Center/ Copyright (c) 2001 SJTU DSP Tech. Center. All Rights Reserved./ Description:/ TMS320C54x Program for Students Experiment/ History:/ Date Authors / 2003/07/23 Zheng Yigang /*#include #includ
4、e mix.hint mix_func_c(int *wl, int *wr, int val) int i, val_min, tmp8; for(i=0; i8; i+) tmpi = wli * wri; val_min = val; for(i=0; itmpi) val_min = tmpi; return val_min;void main() int val, i, wl8, wr8; int min_asm, min_c; /register setting asm( stm #0, SWWSR); asm( stm #0x00A0, PMST);/ min_asm=1900;
5、/ min_c=2000; /call system function val = -100; val = abs(val); printf(val = %dn, val); /call asm function for(i=0; iGo main后的值)作为开始察看地址,从主程序main开始用Single Step方式调试程序,观察程序的执行过程。尤其是在C程序中调用汇编子函数以及返回的过程,注意当前SP和PC的变化。SP和PC情形一SP和PC情形二4. 看懂代码,比较结果,并画出程序流程图;程序流程图四、实验结果分析1. 实时运行库实时运行库提供了标准C中的大部分函数,帮助建立C语言的环境
6、,同时也提供一些基本的调试手段,如printf( )等。2. 程序接口参数传递是混合编程中非常重要的一部分:第一个参数放置在寄存器A中,其他参数按照逆序压入堆栈;返回的数据放置在寄存器A中。3. 局部数据局部数据是在堆栈中开设的,程序返回前消除。4. 关于堆栈保护在子程序addfun中,由于需要改变ST1中的数值,所以在子程序入口处先用语句pshm ST1 ; ST1的值在堆栈中保护起来;在子程序返回前,再用语句popm AR1 ;恢复ST1原来的值。注:例程见目录 71_mix. mix.cmd中段设置说明: 1. The .cinit section contains tables for
7、 initializing variables and constants. 2. The .const section contains string constants and data defined with the C/C+ qualifier const (provided the constant is not also defined as volatile). 3. The .text section contains all the executable code as well as string literals and compiler-generated const
8、ants. 4. The .bss section reserves space for global and static variables. When you specify the -c linker option, at program startup, the C/C+ boot routine copies data out of the .cinit section (which can be in ROM) and stores it in the .bss section. 5. The .data section is normally used to contain t
9、ables of data or preinitialized variables.C程序代码#include #include mix.hint mix_func_c(int *wl, int *wr, int val) / C函数 int i, val_min, tmp8; for(i=0; i8; i+) /乘法 tmpi = wli * wri; val_min = val; for(i=0; itmpi) val_min = tmpi; return val_min; /最小值 作为程序的 返回值void main() int val, i, wl8, wr8; int min_as
10、m, min_c; /寄存器设置 asm( stm #0, SWWSR); asm( stm #0x00A0, PMST);/ 汇编程序里面的最小值 min_asm=1900;/ C程序里面的最小值 min_c=2000; /调用系统函数 call system function val = -100; val = abs(val);/绝对值 printf(val = %dn, val); /输出val /call asm function /调用汇编程序 for(i=0; i8; i+) ? /表赋初值 0 1 2 3 4 5 6 7 / 0 1 3 5 7 9 11 13 wli=i; w
11、ri=2*i+1; min_asm = mix_func(wl, wr, val); / 汇编 最小值 printf(val = %dn, min_asm); /输出 min_c = mix_func_c(wl, wr, val); / C 最小值 printf(val = %dn, min_c); /输出 return; 汇编程序代码 .mmregs;-;int mix_func(int *wl, int *wr, int val); int i, val_min, tmp8;-var_tmp .set 0;ST1off_m .set -8off_p .set 8frame_size .se
12、t 9;return address arg_wr .set frame_size+1arg_val .set frame_size+2 .global _mix_func ;说明:外部变量 非私有 .text; 在变量名前加一下划线_mix_func: pshm ST1 frame #off_m ssbx OVM;置 1;如果 OVM位为1,则 80 0000 0000h 的绝对值 为 00 7FFF FFFFh;如果 OVM位为0,则 80 0000 0000h 的绝对值 为 80 0000 0000h;表赋值-; for(i=0; i8; i+); tmpi = wli * wri;-
13、stm #8-1, BRC mvdk *SP(arg_wr), AR3 ;AR3=wr mvmm SP, AR4 ;AR4=tmp stlm A, AR2 ;AR2=wl rptb tmp_loop-1 mpy *AR2+, *AR3+, A stl A, *AR4+tmp_loop:;查找最小值-; val_min = val; for(i=0; itmpi); val_min = tmpi; ; ; return val_min;- ld *SP(arg_val), A mvmm SP, AR2 ;AR2=tmp stm #8-1, BRC rptb compare_loop-1 ld *
14、AR2+, B min A compare_loop:;比较? frame #off_p popm ST1 ret五、实验思考题1、此程序实现的功能是什么?答:此程序实现的函数功能是求最小值。分别可以用C语言和汇编语言两种编写方法。2、C语言与汇编语言是如何调用的?有何不同?编译器会自动在标识符的开头加上下划线,因此在汇编程序中访问C函数的变量和函数,只需要在此变量前加上下划线,例如,名为“x”的C变量在汇编程序中的名字为“_x”。对于志在汇编程序中使用的标识符,就不必在前面加下划线。3、他们的参数是如何传递的?答:汇编程序调用C函数,第一个参数(最左边的参数)必须置入累加器A中,其他参数必须按逆序压入堆栈。六、实验心得本次实验相对于前面两次试验来说又增加了一定的难度,可是在助教的帮助下还是顺利地完成了试验。这次试验使我对DSP有了进一步的了解,更加熟悉了ccs软件的使用。THANKS !致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2