综合性、设计性实验报告
姓名 陶建敏 学号 201308002107
专业 通信工程 班级 通信1301
实验课程名称 数字信号处理
指导教师及职称 李玲香讲师
开课学期 2015 至_ 20## 学年上学期
上课时间 2015 年 12月10、17日
湖南科技学院教务处编印
第二篇:dsp实验报告五
DSP 实 验 报 告
(实验五)
班级:
学号:
姓名:
实验五 混合编程
一、实验目的
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初始设置。选芯片时设置已自带,可不添加;如无则加)
三、实验步骤
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或0x2222等填充(注意:填充后必须对Gel文件重新Load一次)。然后装载程序,了解在混合编程环境下变量、函数的定义方法以及项目文件的编译方法。
3. 打开View Memory,用SP值(Debug_>Go main后的值)作为开始察看地址,从主程序main开始用Single Step方式调试程序,观察程序的执行过程。尤其是在C程序中调用汇编子函数以及返回的过程,注意当前SP和PC的变化。
4. 看懂代码,比较结果,并画出程序流程图;
四、实验结果
1、从主程序main开始用Single Step方式调试程序,观察程序的执行过程。尤其是在C程序中调用汇编子函数以及返回的过程,观察到当前SP和PC的变化为:
PC从地址0X0000205D一直进行自加,单步执行一次就加1;SP值在从main开始就一直保持0X0C86保持不变,直到return语句执行完后才变为0X0C9D,跳出主程序后SP值开始自减执行push语句,执行完后,紧接着在执行POP时继续进行自加。执行过程如下:
开始执行Goto main:
执行return后:
由此可见:PC值反映当前执行地址值;SP值只有在调用PUSH或POP等语句时才发生相应的变化。
2、程序分析及流程图:
#include <stdio.h>
#include "mix.h"
int mix_func_c(int *wl, int *wr, int val) //定义求数组最小值的子函数;
{
int i, val_min, tmp[8]; //定义变量
for(i=0; i<8; i++)
tmp[i] = wl[i] * wr[i]; //两数相乘
val_min = val; //置初值,设定val_min最小值为val即100
for(i=0; i<8; i++) //比较,求出两数相乘后乘积的最小值
{
if(val_min>tmp[i])
val_min = tmp[i];
}
return val_min;
}
void main() //执行主函数
{ int val, i, wl[8], wr[8];
int min_asm, min_c;
//register setting //C中嵌套ASM语言
asm(" stm #0, SWWSR");
asm(" stm #0x00A0, PMST");
// min_asm=1900;
// min_c=2000;
//call system function
val = -100; //定义val值
val = abs(val);
printf("val = %d\n", val);
//call asm function
for(i=0; i<8; i++) //对wl与wr数组赋初值
{
wl[i]=i;
wr[i]=2*i+1;
}
min_asm = mix_func(wl, wr, val); //调用混合编程程序,在C中映射汇编
printf("val = %d\n", min_asm);
min_c = mix_func_c(wl, wr, val); //在C函数中输出C
printf("val = %d\n", min_c);
return;
}
五、实验结果分析
1. 实时运行库
实时运行库提供了标准C中的大部分函数,帮助建立C语言的环境,同时也提供一些基本的调试手段,如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 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 constants.
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 tables of data or preinitialized variables.
六、实验心得体会
本次实验目的是我们通过研究一个程序代码学习使用实时运行库、熟悉用C和汇编混合编程的方法;并掌握混合编程的调试方法。
在上课的时候,老师就告诉我们关于混合编程的几种方法,当时由于时间有限,老师只是简单的叙述了这几种方法,记忆力不好,所以做的过程中很吃力,在助教和同学的帮助下,最后成功的完成了本次实验。
本次实验,让我对DSP的混合编程有了更深刻的理解,更加熟练的使用DSP这个软件,让我受益匪浅。