DSP第三次实验报告

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DSP第三次实验报告实验五、混合编程

实验六、数字图像处理试验

学院:信息工程学院

班级:08级电子信息工程2班

姓名:肖秀

学号:2008550503

指导老师:姚志强

完成日期:2011.11.22

实验五混合编程

一、实验目的

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. 看懂代码,比较结果,并画出程序流程图;

[C程序代码]

#include

#include "mix.h"

int mix_func_c(int *wl, int *wr, int val) // C函数

{

int i, 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];

}

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

}

void main()

{ int val, i, wl[8], wr[8];

int min_asm, 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 = %d\n", val); //输出val

//call asm function //调用汇编程序

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

//表赋初值 0 1 2 3 4 5 6 7

// 0 1 3 5 7 9 11 13

{

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

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

;int mix_func(int *wl, int *wr, int val)

;{

; int i, val_min, tmp[8];

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

var_tmp .set 0

;ST1

off_m .set -8

off_p .set 8

frame_size .set 9

;return address

arg_wr .set frame_size+1

arg_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; i<8; i++)

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

;------------------------------------------------ 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; i<8; i++)

相关文档
最新文档