编写一个以c语言或汇编为基础的DSP程序(千一)
- 格式:doc
- 大小:4.49 MB
- 文档页数:5
实验二 DSP汇编语言编程基础一、 实验目的1、了解DSP的寻址方式;2、了解DSP的汇编语言与C语言混合编程。
二、 实验器材1、安装有CCS的PC机一台;三、 实验内容1、建立一个工程;2、用汇编语言编程实现一个可被C程序调用的例程。
四、 实验步骤1、汇编语言和C语言混合编程:(1) 运行CCS,建立一个工程,取名exp2a,并保存到c:\ti\myprojects\xxx\Experiment2\目录下。
(2) 编辑如下C文件,取名exp2a.c并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
/* Assembly routine */extern int sum(int *);/* define x[] as global array */int x[2]={0x1234,0x4321};/* define result s as global variable */int s;void main(){s = sum (x); /* return sum product */}(3) 编辑如下汇编文件,取名exp2_sum.asm并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
* * * * * * * * * * * * * * * * * * * * * * * * * * * * ** exp2_sum.asm SUM subroutine* called by exp2a.c* Input: Array pointer* Output: Return sum result in T0* * * * * * * * * * * * * * * * * * * * * * * * * * * * *.global _sum_summov *AR0+,AC0 ; AC0 = x[1]add *AR0+,AC0 ; AC0 = x[1]+x[2]mov AC0,T0ret ; Return T0.end(4) 编辑如下链接命令文件,取名link.cmd并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。
序言DSP是Digital Signal Processing的缩写,表示数字信号处理器。
是以数字信号来处理大量信息的器件。
其工作原理是接收模拟信号,转换为0或1的数字信号。
再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。
信息化的基础是数字化,数字化的核心技术之一是数字信号处理,数字信号处理的任务在很大程度上需要由DSP器件来完成,DSP技术已成为人们日益关注的并得到迅速发展的前沿技术。
数字信号处理是围绕着数字信号处理的理论、实现和应用等几个方面发展起来的。
数字信号处理在理论上的发展推动了数字信号处理应用的发展。
反过来,数字信号处理的应用又促进了数字信号处理理论的提高。
而数字信号处理的实现则是理论和应用之间的桥梁。
DSP(digital signal processor)是一种独特的微处理器,是以数字信号来处理大量信息的器件。
它的强大数据处理能力和高运行速度,是最值得称道的两大特色。
DSP微处理器(芯片)一般具有如下主要特点:(1)在一个指令周期内可完成一次乘法和一次加法;(2)程序和数据空间分开,可以同时访问指令和数据;(3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;(4)具有低开销或无开销循环及跳转的硬件支持;(5)快速的中断处理和硬件I/O支持;(6)具有在单周期内操作的多个硬件地址产生器;(7)可以并行执行多个操作;(8)支持流水线操作,使取指、译码和执行等操作可以重叠执行。
当然,与通用微处理器相比,DSP微处理器(芯片)的其他通用功能相对较弱些。
主要有以下六个优点:(1)对元件值的容限不敏感,受温度、环境等外部参与影响小;(2)容易实现集成;(3)可以分时复用,共享处理器;(4)方便调整处理器的系数实现自适应滤波;(5)可实现模拟处理不能实现的功能:线性相位、多抽样率处理、级联、易于存储等;(6)可用于频率非常低的信号。
但是也存在一些缺点:(1)需要模数转换;(2)受采样频率的限制,处理频率范围有限;(3)数字系统由耗电的有源器件构成,没有无源设备可靠。
实验1.2 : 编写一个以C 语言为基础的DSP程序一.实验目的1.学习用标准C语言编制程序;了解常用的C语言程序设计方法和组成部分。
2.学习编制连接命令文件,并用来控制代码的连接。
3.学会建立和改变map文件,以及利用它观察DSP内存使用情况的方法。
4.熟悉使用软件仿真方式调试程序。
二.实验设备PC兼容机一台,操作系统为Windows2000(或Windows98,WindowsXP,以下默认为Windows2000),安装Code Composer Studio 2.0软件。
三.实验原理1.标准C语言程序CCS支持使用标准C语言开发DSP应用程序。
当使用标准C语言编制的程序时,其源程序文件名的后缀应为.c(如:volume.c)。
CCS在编译标准C语言程序时,首先将其编译成相应汇编语言程序,再进一步编译成目标DSP的可执行代码。
最后生成的是coff格式的可下载到DSP中运行的文件,其文件名后缀为.out。
由于使用C语言编制程序,其中调用的标准C的库函数由专门的库提供,在编译连接时编译系统还负责构建C运行环境。
所以用户工程中需要注明使用C的支持库。
2.命令文件的作用命令文件(文件名后缀为cmd)为链接程序提供程序和数据在具体DSP硬件中的位置分配信息。
通过编制命令文件,我们可以将某些特定的数据或程序按照我们的意图放置在DSP 所管理的内存中。
命令文件也为链接程序提供了DSP外扩存储器的描述。
在程序中使用CMD文件描述硬件存储区,可以只说明使用部分,但只要是说明的,必须和硬件匹配,也就是只要说明的存储区必须是存在的和可用的。
3.内存映射(map)文件的作用一般地,我们设计、开发的DSP程序在调试好后,要固化到系统的ROM中。
为了更精确地使用ROM空间,我们就需要知道程序的大小和位置,通过建立目标程序的map文件可以了解DSP代码的确切信息。
当需要更改程序和数据的大小和位置时,就要适当修改cmd文件和源程序,再重新生成map文件来观察结果。
编写一个以C 语言为基础的DSP 程序
实验结果:
通过实验可以发现,修改cmd文件可以安排程序和数据在DSP内存资源中的分配和位置;map文件中描述了程序和数据所占用的实际尺寸和地址。
C语言编制的程序,在经过编译器编译后,需要连接若干C 标准程序辅助运行。
以下是运行流程:
1.程序入口为_c_int00,执行标准C库中的程序,负责初始化C环境、申请堆栈、初始化有初始值的变量
2.程序最终转到用户编制的主函数运行。
3.程序在主函数中的无限循环中持续运行。
编写一个汇编和C 混合的DSP 程序。
DSP应用程序中C代码和汇编代码的结合◆ CEVA公司高级编译器项目经理Eran Balaish随着DSP处理器的功能日益强大,加上编译器的优化技术不断提高,以往只利用汇编语言编写DSP应用程序的普遍做法已逐渐被淘汰。
今天,几乎所有的DSP应用程序都是由C代码和汇编代码共同构成。
对于性能是核心的关键性功能,DSP工程师继续使用高度优化的汇编代码,而其它功能则采用C语言编写,以便于维护和移植。
C代码和汇编代码的结合需要DSP工程师在工具箱中备有专用工具和方法。
众所周知,汇编代码编程的性能更好,而C代码编程的优势在于编写更为方便、快捷。
为了解释清楚原因,让我们仔细对比一下汇编代码和C代码编程的优缺点。
汇编代码编程的优势● 汇编代码能够利用处理器独有的指令和各种专用硬件资源。
另一方面,C代码则是通用性的,必须支持不同的硬件平台,因此,对C代码来说,支持专用平台代码十分困难。
● 汇编代码的编程人员通常对应用非常熟悉,并可能做出编译器难以企及的设想。
● 汇编代码编程人员可以发挥人们的创造力;而编译器再先进也只是一个自动程序而已。
汇编代码编程的缺点:● 汇编代码编程人员不得不处理耗时的机器级问题,比如寄存器分配和指令调度。
而对C代码,这些问题都可交给编译器去做。
● 汇编代码编程需要拥有关于DSP架构及其指令集的专业知识,而C编码只需要掌握广为流行的C语言即可。
● 采用汇编代码,平台之间的应用移植极其困难和耗时。
而C应用程序的移植要简单得多。
图1显示了如何利用专用硬件机制来高度优化汇编代码。
左边的C代码实现方案利用模数运算创建了循环缓冲器。
右边的是高度优化的汇编代码,利用CEVA-TeakLite-III DSP核的模数机制来创建相同的缓冲器。
只要缓冲器指针(这里是r0)更新,该模数机制就自动执行模数算法。
这种运算和指针更新发生在同一个周期内,故汇编代码比C代码有效得多,其可为模数运算产生单独的指令。
在DSP应用中选择适当的C和汇编代码混合问题在于C 代码和汇编代码之间的界限究竟在哪里,答案由分析器提供的性能分析给出。
DSP的C语言开发一、流程步骤:main() {}下面是vectors.asm函数,该文件在每个DSP的project中(需手工加入),其中有对_c_int00的调用,而_c_int00在rts.lib中,在开发时要手工加入。
在reset 后,rom等外存中的程序已经转移到了L2 cache中,并且程序从0x0000 0000处开始执行,而0x0000 0000处的程序正是vectors.asm,以下就开始层层调用,进入main函数。
======== vectors.asm ========; Plug in the entry point at RESET in the interrupt vector table;;; ======== unused ========; plug inifinite loop -- with nested branches to; disable interrupts -- for all undefined vectors;unused .macro id.global unused:id:unused:id:b unused:id: ; nested branches to block interruptsnop 4b unused:id:nopnopnopnopnop.endm.sect ".vectors".ref _c_int00 ; C entry point.align 32*8*4 ; must be aligned on 256 word boundaryRESET: ; reset vectormvkl _c_int00,b0 ; load destination function address to b0mvkh _c_int00,b0b b0 ; start branch to destination functionmvc PCE1,b0 ; address of interrupt vectorsmvc b0,ISTP ; set table to point herenop 3 ; fill delay slotnopnop;; plug unused interrupts with infinite loops to; catch stray interrupts;unused 1unused 2unused 3unused 4unused 5unused 6unused 7unused 8unused 9unused 10unused 11unused 12unused 13unused 14unused 15Rts6000.lib来自于rts6000.src,该原文件是由多个.c和.cpp以及.asm组成的,其中关于int _args_main()的函数:这个函数就是void __interrupt c_int00()在初始化完成后调用的函数,int _args_main()函数中调用了main(argc, argv)从而正式转入main函数。
DSP的C语言程序设计一、为什么要使用C语言对DSP编程C语言是高级语言,易学易用。
C语言的编程效率极高,易于调试。
C语言的可移植性好。
二、C程序的结构及组成完整的C程序是由一个主函数main()和其它的子函数组成的,每一个子函数完成特定的功能。
DSP的C 语言的入口地址固定为c_int00,在中定义。
C语言支持丰富的数据类型和数据结构,在ccs集成开发环境中,为C语言提供了完整的支持硬件的底层函数库和支持算法的DSP函数库。
在使用C语言的库函数时,在工程中必须包括相应的函数库和运行时支持库。
下面是一般C语言程序的结构和组成框架。
一般C程序的结构如下:h头文件#include “函数库1”#include <函数库2>#include “函数库3”…*//* *//* Parameters: *//* - port - port address (HEX) *//* *//* Return: *//* - returns value read from port. *//* *//* Notes: *//* *//*****************************************************************************/s16 portRead(u16 port);/*****************************************************************************//* portWrite(u16 port, s16 value) *//* *//* This routine writes a word to the specified port. */ /* *//* Parameters: *//* - port - port address (HEX) *//* - value - 16 bit word to write. *//* *//* Return: *//* - none *//* *//* Notes: *//* *//*****************************************************************************/void portWrite(u16 port, s16 value);#endif /* end of #ifndef _PORTIO_H */使用时,先使用宏替换或枚举定义I/O端口的地址,然后使用portRead()和portWrite()函数访问I/O端口例如:#includeVariable=portRead(portA);c5400\cgtools\include目录与c5400\dsk5402\include目录中的头文件类型不同。
广州大学学生实验报告
开课学院及实验室:物理与电子工程学院 2015年3月22日
班级光信121 姓名学号指导老师
实验课程名称数字信号处理实验Ⅰ成绩
实验项目名称编写一个以c语言或汇编为基础的DSP程序
一、实验目的
二、使用仪器、材料
三、实验原理
四、实验步骤
五、实验过程原始记录(数据、图案、计算等)
六、实验结果及分析
一. 实验目的
1.学习用汇编语言编制程序;了解汇编语言程序与C 语言程序的区别和在设置上的不同。
2.了解TMS320C55x 汇编语言程序结果和一些简单的汇编语句用法。
3.学习在CCS 环境中调试汇编代码
二. 实验设备
PC 兼容机一台,操作系统为Windows2000(或Windows98,WindowsXP,以下默认为Windows2000),安装Code Composer Studio 2.2 软件。
三. 实验原理
1.汇编语言程序:
汇编语言程序除了程序中必须使用汇编语句之外,其编译选项的设置与C 语言编制的程序也稍有不同。
其区别为:
⑴汇编语言程序在执行时直接从用户指定入口开始,常见的入口标号为“start”,而C 语
言程序在执行时,先要调用 C 标准库中的初始化程序(入口标号为“_c_init00”),完成设置之后,才转入用户的主程序main()运行。
⑵由于CCS 的代码链接器默认支持C 语言,在编制汇编语言程序时,需要设置链接参数,
选择非自动初始化,注明汇编程序的入口地址。
2.程序设计要求:
程序框图:
四.实验步骤
1.实验准备:
设置软件仿真模式,参看:第三部分、四、1。
2.建立新的工程文件:(1)启动Code Composer Studio 2.21。
⑵进行以下设置:建立TASM.pjt。
3.设置工程文件:
4.编辑输入源程序:
⑴汇编语言程序:
-先新建源程序窗口:
输入源程序:
.mmregs sect “.text”
.model call=c55_std .align 4
.model mem=large .global start
.global x .sym start,start, 36, 2, 0
.bss x,1,0,0 start:
.sym x,x, 4, 2, 16 MOV #2, *(#y)
.global y MOV #1, *(#x)
.bss y,1,0,0 L1:
.sym y,y, 4, 2, 16 MOV *(#y), AR1
.global z ADD *(#x), AR1, AR1
.sym z,z, 4, 2, 16 MOV AR1, *(#z)
B L1
C语言
main()
{
int x,y,z;
x=1; y=2;
while ( 1 )
{
z=x+y;
} }
注意:在输入汇编语言源程序时,除了标号以外的程序行必须以一个空格或退格字符开始。
-保存源程序为TASM.asm。
⑵连接命令文件:如同第⑴步操作,建立空的源程序窗口。
-输入连接命令文件内容:
MEMORY
{
DARAM: o=0x100, l=0x7f00
DARAM2: o=0x8000, l=0x8000
}
SECTIONS
{
.text: {} > DARAM
.bss: {} > DARAM
.stack :{} > DARAM
}
注意:第3、4 行中等号前边字母是小写的“L”。
-将文件存为C:\ICETEK-VC5509-EDULab\Lab0103-ASM\TASM.cmd
⑶将上述编译的源程序加入工程TASM.pjt,具体操作可请参考实验一、四、4、⑵。
5.编译源文件、下载可执行程序:
⑴选择菜单Project->Rebuild All。
⑵执行File?Load Program,在随后打开的对话框中选择刚刚建立的C:\ICETEK-
VC5509-EDULab\Lab0103-TASM\debug\TASM.out 文件。
完成后,系统自动打开TASM.asm 源程序窗口,并在其中指示程序的入口地址为标号“start”后的语句。
6.打开观察窗口:
⑴选择菜单View->Disassembly。
注意程序运行指针停留的位置。
⑵开启CPU 寄存器观察窗口:单击菜单View->Registers->CPU Registers。
请看PC 指针取值与当前程序运行地址对应。
⑶将变量x、y、z 分别加入观察窗口:
在源程序中双击变量名,再单击鼠标右键,选择“Add to Watch Window”。
这时,这 3 个变量还未作初始化。
⑷开启内存观察窗口:
选择“View”菜单中“Memory…”项,在“Memroy Window Options”窗口中的“Adress”项中输入&x,单击“OK”完成设置;“Memory”窗口中x 的当前取值显示在第 1 个地址的后。
而且y 和z 的存储单元跟在其后。
7.观察程序运行结果:
⑴单步运行2 次,在观察窗中观察到变量x、y 被赋值。
变化的值被显示成红色。
同时在“Memory”窗口中也能观察到x 和y 值的改变。
⑵单步运行,观察CPU 寄存器窗口中“XAR1”寄存器存储值的变化。
程序利用XAR1 进行运算。
⑶再单步运行,可观察到z 的值被计算出来。
双击“Memory”窗口中变量x、y 相应的存储单元,将其修改成其他取值,单步运行后观察结果。
8.对照观察map 文件和cmd 文件的内容:
⑴选择菜单File->Open…,将找到C:\ICETEK-VC5509-EDULab\Lab0103-ASM\Debug 目录,将文件类型改为“Memory Map Files”,选择TASM.map 文件、打开。
⑵打开TASM.cmd 文件。
⑶程序的入口地址:map 文件中“ENTRY POINT SYMBOL”中说明了程序入口地址(start)。
⑷内存使用情况:
-map 文件中“MEMORY CONFIGURA TION”标明了程序占用DARAM 的使用情况,共占用25H 个存储单元。
比较一下,这比用C 编制的程序占用的要小得多。
-观察map 文件中的“SECTION ALLOCATION MAP”段,可以看出TASM.obj 的入口地址为100H,这也是程序的入口地址。
-用户定义的变量从120H 开始,共占用了3 个单元(Word)。
9.退出CCS
五、实验数据记录
六、数据结果及分析
图1 图2
数据分析
图1中,可以从“MEMORY CONFIGURATION”中可以看到used为000025H,程序占用了DARAM的25H个存储单位。
这比起C语言占用的单位少很多。
从“SECTION ALLOCATION”中,看到TASM.obj地址为0000100H,。
而我们定义的变量的地址从120H,总共占用了3个单位。
图2是修改程序后,对0f000h+0e000h的相加运算,结果是0x1D00.
总结
经过这次的实验课程,我学会了和更熟悉了以C语言或为汇编为基础的DSP程序的运用,只要多加练习便可容易操作,但还是要注意一步一步的来,不可图快。