DSP第三次实验报告
![DSP第三次实验报告](https://img.360docs.net/img49/027gqyimjjkrhmykr72b-91.webp)
![DSP第三次实验报告](https://img.360docs.net/img49/027gqyimjjkrhmykr72b-92.webp)
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++)
; {
; if(val_min>tmp[i])
; val_min = tmp[i];
; }
;
; return val_min;
;}
;------------------------------------------------ ld *SP(arg_val), A
mvmm SP, AR2 ;AR2=tmp
stm #8-1, BRC
rptb compare_loop-1
ld *AR2+, B
min A
compare_loop:
;比较???
frame #off_p
popm ST1
ret
四、程序流程图:
五、实验思考题
1、此程序实现的功能是什么?
答:此程序实现的函数功能是求最小值。分别可以用C语言和汇编语言两种编写方法。
2、C语言与汇编语言是如何调用的?有何不同?
编译器会自动在标识符的开头加上下划线,因此在汇编程序中访问C函数的变量和函数,只需要在此变量前加上下划线,例如,名为“x”的C变量在汇编程序中的名字为“_x”。对于志在汇编程序中使用的标识符,就不必在前面加下划线。
3、他们的参数是如何传递的?
答:汇编程序调用C函数,第一个参数(最左边的参数)必须置入累加器A 中,其他参数必须按逆序压入堆栈。
六、、实验结果分析
1. 实时运行库
实时运行库提供了标准C中的大部分函数,帮助建立C语言的环境,同时也提供一些基本的调试手段,如printf( )等。
2. 程序接口
参数传递是混合编程中非常重要的一部分:第一个参数放置在寄存器A中,其他参数按照逆序压入堆栈;返回的数据放置在寄存器A中。
3. 局部数据
局部数据是在堆栈中开设的,程序返回前消除。
4. 关于堆栈保护
在子程序addfun中,由于需要改变ST1中的数值,所以在子程序入口处先用语句pshm ST1 ; ST1的值在堆栈中保护起来;
在子程序返回前,再用语句popm AR1 ;恢复ST1原来的值。
七、实验心得
本次实验相对于前面两次试验来说又增加了一定的难度,可是在助教的帮助下还是顺利地完成了试验。这次试验使我对DSP有了进一步的了解,更加熟悉了ccs软件的使用。学习使用了实时运行库,熟悉用C和汇编混合编程的方法,弄懂了怎样用C调用汇编,怎样用汇编调用C语言,例如,在汇编中调用C函数就要加上相应的下划线,同时也掌握了混合编程的调试方法。虽然现在的我还不具备混合编写程序的能力,但我相信持之以恒的努力必有效果。
实验六数字图象处理实验
一、实验目的
1. 学习使用实时运行库并了解数字图象处理的基本原理;
2. 熟悉用C和汇编混合编程的方法及混合编程的调试方法;
3. 学习灰度图象反色处理技术及其二值化处理技术。
二、实验环境
1. 集成开发环境Code Composer Studio
2.0(简称CCS)
2. 实验程序DSP54X-28-Tuxiangchuli.c,DSP54X-28-Tuxiangchuli.cmd,
rts.lib,c5402.gel(说明同前)。
三、实验步骤
实验操作流程参照前面实验。
1. 建立新项目DSP54X-28-Tuxiangchuli.pjt,添加所需文件。双击打开源程序DSP54X-28-Tuxiangchuli.c,找到打开图片语句,根据源语句及Tupian文件夹所在位置,重新设置好图片的打开路径(保存时注意文件属性。必须修改好,否则会要求手动输入64*64个数据,如出现这种情况,通过任务管理器关闭CCS后重新打开修改)。
2. 改设置:Build option子菜单linker中Basic项Autoinit Model 改为load-time Initialization或Run-time Initialization(用No Initialization 得不到正确的图像)。
3. 编译连接Build后, 装载得到的.out程序。主程序中,在三个“i=0”处设置三个断点,如下图所示。选择Debug_>Go main,使程序从main处开始执行。单击“Run”,程序运行到第一个断点处停止;
4. 用View/Graph/Image打开一个图形观察窗口,以观察程序载入的“Lena64.bmp”图像,该图像在“....\Tupian”目录中;按下图设置该观察窗口,以观察变量y为64*64的二维数组(也可在程序执行前就打开图形窗口,设置完确定时对y选择“否”即可):
下图为“Lena64.bmp”在CCS环境下第一个断点处的显示图像;
单击“Run”,程序运行到第二个断点处停止,这时可在图形观察窗口中,观察原图像经反色处理后的结果图像,如下图:
再单击“Run”,程序运行到第三个断点处停止,这时可在图形观察窗口中,观察到原图像二值化处理后的结果图像,本程序中,二值化处理阀值设为128,见下图:
5.修改程序,对图像做其它处理(如反向显示,上下颠倒等),记录实验数据及结果,写出报告。
四、程序代码以及流程图:
/*********************************************************************** ** Main Function Program
***********************************************************************/
#include "math.h" //ye ke bu yao.
#include "stdio.h"
#define IMAGE_WIDTH 64
#define IMAGE_HEIGTH 64
main()
{
FILE *fi;
int i,j,k;
int y[IMAGE_HEIGTH][IMAGE_WIDTH];
unsigned char id[64];
k=128; /*k is Threshold Value*/
// fi=fopen("D:\\Tupian\\Lena64.bmp","rb");
fi=fopen("D:\\MyProjects
Workspace\\DSP_CCS\\Labs\\09lab\\lab56\\DSP54X-28-Tuxiangchuli\\Tupian\\Lena64. bmp","rb");
/* if(fi==NULL)
{
printf("can not open file Lena64.bmp.\n");
exit(1);
}
else
printf("open file Lena64.bmp succeeded.\n"); */
for (i=0; i<=16; i++)
{
fread((char *)id,sizeof(char),IMAGE_WIDTH,fi);
}
fread((char *)id,sizeof(char),54,fi);
for (i=0; i { fread((char *)id,sizeof(char),IMAGE_WIDTH,fi); for (j=0; j { y[i][j]=id[j]; } } fclose(fi); i=0; for (i=0; i { for (j=0; j { y[i][j] = (255-y[i][j]); } } i=0; for (i=0; i { for (j=0; j { y[i][j] = 255*((255-y[i][j])/k); } } i=0; i=0; } /*********************************************************************** ** End of File ***********************************************************************/ 程序流程图如下: 五、程序修改如下 增加的两段程序,实现左右颠倒和上下颠倒 i=0; for (i=0; i { for (j=0; j { yang = y[i][IMAGE_WIDTH-j]; y[i][IMAGE_WIDTH-j] = y[i][j]; y[i][j] = yang; } } //左右颠倒 i=0; for (j=0; j { for (i=0; i { yang = y[IMAGE_HEIGTH-i][j]; y[IMAGE_HEIGTH-i][j] = y[i][j]; y[i][j] = yang; } } //上下颠倒 六、实验现象相应截图 正常情况下: 左右颠倒: 上下颠倒: 反相: 二值化: 七、实验心得 本次实验更加熟悉了软件的使用,学习掌握了实时运行库并了解数字图象处理的基本原理,熟悉了用C和汇编混合编程的方法及混合编程的调试方法,学会了灰度图象反色处理技术及其二值化处理技术。这次实验使我加深了对DSP的理解,以及软件的操作应用。 虽然在试验过程中遇到一些问题,但经过助教的帮助加上自己的思考,还是感觉收获挺多。更使我充满惊奇的是,DSP的功能强大,觉得这样编写程序去处理图片感觉好有趣,更加对DSP这门课程更加感兴趣。