实验四 混合编程实验实验报告.docx
- 文档编号:14280263
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:17
- 大小:864.90KB
实验四 混合编程实验实验报告.docx
《实验四 混合编程实验实验报告.docx》由会员分享,可在线阅读,更多相关《实验四 混合编程实验实验报告.docx(17页珍藏版)》请在冰点文库上搜索。
实验四混合编程实验实验报告
《混合编程实验》实验报告
姓名:
赵广元
学号:
1428403058
学院:
电子信息学院
班级:
电子信息工程
混合编程实验
一实验目的
1.学习使用实时运行库
2.熟悉用C和汇编混合编程的方法
3.掌握混合编程的调试方法
二实验环境
1.TMS320VC5416DSK实验板
2.Ccs软件
3.PC机
三实验原理
1.混合编程基础:
高级语言(例如C语言)编程灵活自由,可以提高编程效率
汇编语言可以充分利用DSP的硬件结构,运算性能优于高级语言
所以可以用高级语言来编写主流程,汇编语言编写数据量大的数据处理模块
这样的优点在于:
既可以保证程序良好的运算能力,又可以给程序升级和维护带来方便所以在实际编程中,可以采用混合编程
2.C语言调用汇编语言编写的函数时的编程规范:
(1)变量和函数的命名规则:
在C语言和汇编语言中均需要声明为全局变量
对函数而言,还必须在C语言中给出准确的函数原型说明
汇编语言中该名字需要加一个下划线作为前缀,但C语言中保持“自然”的命名
(2)C语言调用汇编函数的函数调用规则
C语言的程序主要是由编译器完成资源的分配,对于编程人员可以看做是一个黑盒,不必追究其内在细节
汇编语言是由汇编人员手工安排资源,所以要特别注意其使用规则要与C语言保持一致
(3)与C语言接口的汇编程序子函数而言,汇编语言中寄存器使用规则:
在子程序中自由使用的有AR0,AR2-AR5,A,B,BRC,T等
对于AR1,AR6,AR7,ST0,ST1这些寄存器,子子程序中如果要改变他们,需要先将他们在堆栈中保护起来,在程序结束时再从堆栈中弹出他们,恢复调用前的数值
在C语言中,状态标志有固定的缺省数值,可以通过查表获得。
建议不要使用缺省数值,在汇编程序中最好按照自己的要求显示的设置状态位
(4)C语言调用汇编程序子函数时,分析参数传递的规则:
C语言和汇编的相互调用主要通过累加器A和堆栈来传递参数(c-int00函数将CPL置一,利用SP进行直接寻址)
在没有调用函数时,堆栈中先压入第二个参数以后的其他参数(包括第二个参数),最后一个参数压在堆栈的最下方,即按照逆序压栈
然后将第一个参数放在A中并调用函数,这时程序的返回地址将自动被压入堆栈
当函数有返回值时,在返回前被放在A中
在函数返回时,按照反方向依次调整堆栈指针
3.根据参数传递的规则,汇编函数设计方法:
(1)保护现场(如ST0,ST1)
举例:
pshmST1
(2)调整SP指针,为函数局部变量申请空间
Frame#-8
(3)获取调用函数的传入函数
第一个传入参数从A累加器获取
MVDK*SP(8+1+1),AR3;第二个参数
MVDK*SP(8+1+2),AR3;第三个参数
(4)编写处理程序
(5)将返回值赋给A累加器
(6)恢复SP指针
Frame#8
(7)恢复现场
popmST1
(8)RET
四实验步骤
1.用USB线连接PC和DSK5416,利用板上Emulator进行调试
2.启动CCS,建立一个工程。
3.建立混合汇编源程序文件。
–mix.h;汇编函数在C语言中函数原型声明头文件
–Mix.c;主程序文件,调用汇编函数mix_func函数
–Addfun.s54;汇编函数_mix_func定义的汇编文件
–mix.cmd;链接配置文件
4.将mix.c、addfun.s54和cmd文件加入到工程。
5.设置工程的Buildoption,在链接选项中Includelibraries(-l)项输入rts.lib,使用近调用方式调用函数。
6.Buidall
7.LoadProgram→Run
8.结果测试:
利用View->CPURegister和View->Memory注意参数传递和SP、PC指针的变化
如果采用远调用,程序应该做哪些修改?
1.运行时支持库将rts.lib换为rts_ext.lib
2.Buildoption的编译选项选用-mf(远调用选项)
3.调用时返回地址占2个word,所以要访问输入参数(参
数2、3)应该与近调用时偏移量再加1
第一个传入参数从A累加器获取
MVDK*SP(8+2+1),AR3;第二个参数
MVDK*SP(8+2+2),AR3;第三个参数
4.RET要改为FRET
5.在函数调用汇编语句处加入断点,编译下载后点击运行按钮,之后使用stepinto单步执行命令,用register观察指针变化如下图所示:
从函数处开始:
(sp=sp+11):
转到调用的汇编语句处:
顺序向下执行:
过程中指针变化如图:
循环:
跳出循环继续向下执行,指针变化如下图:
跳出汇编调用,返回c程序:
五感悟与体会
1.远调用时要修改运行时支持库以及编译选项,在混合编程中根据参数传递的规则,要特别注意调整sp指针地址,并尽量使地址偶对齐。
2.在用register观察指针变化时,由于系统支持流水线操作,所以在单步执行之后,在下一步才能看见相应的指针发生变化。
3.利用asm函数直接调用汇编语句,注意stm指令前的空格是必须要的,为什么?
变量和函数的命名规则规定汇编语句中命名时需要在名字前加入空格作为前缀,而在C语言中保持自然的命名。
远调用参考汇编程序:
Description:
;TMS320C54xProgramforStudentsExperiment
;
;History:
;DateAuthorsChanges
;2014/7/12HuJianlingRevised.
;******************************************************************************
.mmregs
;------------------------------------------------
;intmix_func(int*wl,int*wr,intval)
;{
;inti,val_min,tmp[8];
;------------------------------------------------
var_tmp.set0
;ST1
off_m.set-9
off_p.set9
frame_size.set11
;returnaddress
arg_wr.setframe_size+1
arg_val.setframe_size+2.global_mix_func;makethefunctionlabeltobeglobal
.text
_mix_func:
pshmST1
frame#off_m
ssbxOVM
;------------------------------------------------
;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
fret
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验四 混合编程实验实验报告 实验 混合 编程 报告