dsp试验报告
实验一编写一个汇编和C 混合的 DSP 程序 一.实验目的 1.在了解纯 C 语言程序工程和汇编语言程序工程结构的基础上, 学习在 C 工程中加入汇 编编程的混合编程方法。 2.了解混合编程的注意事项。 3.理解混合编程的必要性和在什么情况下要采用混合编程。 二.实验设备 计算机,ICETEK-VC5416AE-S61 实验箱(或 ICETEK 仿真器ICETEK-VC5416-AE 系统板 相关连线及电源) 。 三.实验原理 1.使用 C 语言开发应用程序的优缺点 优点 易于开发和维护。由于用 C 语言书写接近自然语言,其可读性强、利于理解,在编制、 修改、实现算法方面比用汇编语言开发容易。 可移植性强。 不容易发生流水线冲突。编译器能提供完善的解决流水线冲突的结果。 有大量现存的算法可利用。 适用于人机界面的开发。 缺点 代码量大。 程序效率较低。 优化代码存在一定困难。 综上所述, 我们一般用 C 语言设计应用程序的总体框架、 解决人机接口和对速度效率要 求不太高的复杂算法。 2.使用汇编语言开发应用程序的优缺点 优点 更能发挥系统特点。 由于汇编语言掌控系统硬件的能力强于C 语言, 设计出来的程序更 加贴近硬件特性,往往能将硬件效能发挥到极致。 代码精练,效率高。用汇编语言设计的程序,代码短、不容易产生冗余。 代码量小。 缺点 可读性差。不利于复杂算法的开发和实现。 可移植性差。 容易产生流水线冲突。 由于排除冲突需要靠人来辅助完成, 这要求编程人员有较为丰富 的开发经验和对硬件工作机制的深刻理解。 3.如何混合编程 1混合工程在工程中可以同时包含C 语言程序和汇编语言程序,无需更改编译选项。一 般地,我们使用 C 程序为主,加入汇编语言程序模块。 2使用模块技术在应用程序中划分出比较清晰的模块,不同模块可采用不同语言设计。 强调效率和速度的模块采用汇编设计。尽量少用汇编语言设计程序。 3如何找出需要用汇编程序设计的模块 用 C 语言完成设计后,运用 CCS 的软件仿真功能,充分测试程序,找到程序运行中的瓶 颈速度方面的和空间方面的。 再使用分块仿真技术尽可能缩小模块。 找到的模块单独写成子程序,存入独立的文件中。 由于 CCS 编译器能产生 C 语言程序到汇编程序的中间文件, 观察需要优化的模块的汇编 结果,进行人工优化。 最后运用人工优化后形成的汇编程序模块, 代替原来需要优化的 C 语言模块, 进行编译。 程序中可使用内嵌汇编。比如asm“LDDP”;编译器可直接使用内嵌的汇编语句生 成最终代码。但需要语句中双引号中为合法的汇编语句,并且要以空格开头等等。 4.何时使用混合编程技术 当程序中需要操作与硬件密切相关的设备, 而用 C 语言较难实现时。比如在中断程序 设计时需要设置中断向量表, 向量表中空间有限用C 语言语句有困难, 且需向量表要在内存 中精确定位,这时可将设置中断向量表的部分用汇编语言代替。 当需要绕开 C 编译器的规定,进行特殊操作时。比如 C 语言规定,程序不能访问程序 代码区,而系统功能需要进行类似访问时可采用限制较小的汇编语言程序设计。 当需要提高模块的效率包括空间上和时间上两方面的, 而 C 语言程序无法达到要求时。 5.使用混合编程时的注意事项 在汇编程序中使用其他 C 语言模块中定义的变量或函数名称时, 需要在引用的名称前加 一下划线。如C 中定义的变量为 x,在汇编中引用时要用_x。 汇编语言写的子程序需要符合C 语言的调用规则, 尤其是在默认的辅助寄存器使用上和 栈的使用上要求兼容。 在汇编语言模块中,需要编程者自己消除流水线冲突。 在使用内嵌汇编技术时,需要考虑以下内容 要非常小心地处理,以免破坏 C 语言操作环境。编译器在遇到内嵌汇编语句时, 不会对 其中的汇编语句进行分析处理。 避免从内嵌汇编语句跳转到C 语言模块中, 那将极容易造成寄存器使用上的混乱, 从而 产生难以预料的结果。 不要在内嵌汇编语句中改变C 语言模块中变量的值,但可以安全地读取它们的值。 在汇编程序中不要使用内嵌汇编。 6.实验程序解释 实验程序提供了一个使用C 与汇编程序混合编程的实例, 是一个用汇编语言模块优化自 己编制的应用程序的实例。 首先用户拿到的是一个纯用C 语言开发的工程, 再根据假设, 需要将其中一个模块改造 成用汇编语言模块优化的模块。 通过实验过程, 用户可充分了解混合编程可以采取的步骤和 方法。 四.实验步骤 1.实验准备 设置软件仿真模式,启动CCS 2.打开工程、浏览程序内容、编译生成和下载可执行代码、 1打开工程选择菜单Project-Open,选择打开工程文件 C\ICETEK\VC5416AES61\VC5416AES61\Lab0104-CASM\CASM.pjt 2展开工程管理窗口中 CASM 工程,双击 Source 下的 CProgram.c 项,打开 CProgram.c 源 程序窗口。可以看到,程序完成了一个简单的运算,它先开设了三个全局变量x、y、z,然 后分别给 x 和 y 赋初值,再在循环中计算xy,结果赋值给 z。 3编译并下载程序 此设置完成在每次编译完成后将程序自动下载到DSP 上。 选择菜单 Project-BuildAll,编译、连接和下载程序。 4运行程序,观察结果在程序中有“在此加软件断点”注释的语句上加软件断点;将变 量 z 加入变量观察窗口;运行程序到断点,观察变量z 的结果值。 3.修改程序 1修改算法部分成单独子程序我们假设在循环中进行的运算是需要用汇编语言程序模块 优化的部分。首先将“zxy;”语句修改成“zaddx,y;”,在程序头上,变量定义之前 加上 一行“intaddinta,intb;”,在程序末尾,添加如下子程序。 intaddinta,intb { returnab; } 如此,将算法搬移到一个C 语言的子程序模块中实现。 修改完成后,可以编译、下载、运行到断点,观察运行结果,判断是否子程序能完全与 原程序一样完成算法。 2将子程序移入 add.c打开一个新的空的源文件窗口,将main 函数后的子程序复制到窗 口中; 注释 main 函数后面的子程序在子程序前一行加“/*”, 在子程序结尾行后加“*/”; 将新窗口中的内容保存为文件add.c。 3将 add.c 加入工程,编译、下载、运行,检查结果,保证运算无误。 4选择菜单 Project-BuildOptions,进行如下设置 5重新编译工程;打开C\ICETEK\VC5416AES61\VC5416AES61\Lab0104-CASM\add.asm; 在其中的“.line2”行、 “.line3”行、 “.line4”行头上分别加分号, 即注释这 3 个语句。 6将工程中的add.c换成add.asm 在工程管理窗口中用鼠标右键单击add.c, 选择“Remove fromProject”;用鼠标右键单击CASM.pjt,选择“AddFilestoProject”,选择 C\I