编写一个以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目录中的头文件类型不同。
如何利用C和汇编语言混合编程实现DSP软件设计内容摘要:除了调用约定和寄存器使用约定外,一些编译器在人工编写的汇编代码方面可能还会有一些额外的假设。
硬件寄存器绑定C变量:该功能经常与汇编指令内联功能结合在一起,帮助内联汇编代码访问C语言级的变量(见图3。
关键词:编程人员指令调度寄存器分配汇编语言 ARM-NB pushd 实现方案和函数 DSP应用 DSP处理器众所周知,汇编语言具有更高的性能优势,而用C语言编码则能更容易和快速地实现。
DSP处理器功能的不断增强以及编译器优化技术的提高,使得传统的用汇编语言编写DSP应用程序的做法逐渐被淘汰。
现在的DSP应用程序几乎都是由C代码和汇编代码混合组成的。
在那些对性能起决定性作用的关键功能中,DSP工程师将继续使用高度优化的汇编代码,同时转用C语言编写那些不太关键的功能,这将有利于代码维护和移植。
而C和汇编代码的这种结合要求DSP工程师具备专门的工具和方法。
正确混合C代码和汇编代码问题是在哪里划分C代码和汇编代码的界限。
这取决于跟踪器(profiler所能提供的性能分析结果。
然而在使用跟踪器之前,DSP工程师需要为应用程序定义清晰的目标,这些目标一般包括循环数、代码规模和数据量。
目标一旦确定后,应该先全部用C语言编写和创建应用程序,然后才使用跟踪器来分析性能。
在某些特定情况下,主要是控制应用中,C语言级的编码就足够了。
但在大多数情况下,初始编写的C语言应用程序是不能满足一个或更多目标要求的。
这通常意味着多少需要一些汇编代码。
在求助于汇编编程之前,强烈建议保存原始的C代码。
这样不仅方便调试,而且当条件成熟(比如采用更强大的平台,还可以返回到这些C语言的实现。
汇编部分代码应尽可能少。
为此,工程师需要认真分析跟踪器提供的性能结果,并确定应用程序中的关键函数。
关键函数是指占用大部分执行时间,而必须用汇编语言重写才能满足性能目标的那些函数。
重写其中的几个关键函数后,需要重新进行性能分析。
如何使用C语言开发DSP系统如何使用C语言开发DSP系统如何使用C语言开发DSP系统呢?下面是店铺收集整理的运用C 语言开发DSP系统的全过程,快来看看吧!更多内容请关注店铺!大家在开发嵌入式产品时首先会想到用控制器的汇编语言编写*程序,主要原因是:一、汇编语言生成的程序对应的二进制代码少,程序执行要比高级语言生成的程序快。
二、控制器刚问世时,没有相应的高级语言可供使用。
三、存储器的价格问题和寻址空间的限制。
以上所述问题目前都基本上解决了,在这就不阐述了。
实际情况是:在单片机的应用领域,开发者开始使用C语言进行开发了。
大家发现用高级语言开发嵌入式产品是如此轻松,并且C语言程序编译后的二进制代码也非常短小精练。
目前使用最多的数字信号处理器(DSP)是美国TI公司的TMS320家族,而工业控制上用的最多的又是TMS320F2XX系列,TI 公司为每一个DSP 芯片提供了汇编语言和C语言供开发者选用,本人一直使用C语言进行产品开发,而目前很少见到这方面的介绍,所以特撰此文以TMS320F240为例,向各位同行推荐用C语言开发DSP 嵌入式系统。
1、DSP的C语言的特殊性大家在使用51系列C语言时已经注意到,控制器的C语言和PC 机上使用的C有一个显著的特点:经常要对硬件操作,程序中有大量针对控制器内部资源进行操作的语句。
所以,开发者要明白怎样用C 语言来操纵控制器的内部资源,既怎样用C语句操作寄存器和内部存储器等。
举个例子,在51汇编中我们写 MOV A,#20H,汇编程序能够识别A是指累加器,而在51 C程序中我们写 ACC=32;,编译器能够识别ACC是指累加器而不是一般的变量。
即每一个寄存器都有一个专有名字供开发者使用,它们定义在一个头文件reg51.h 中,程序员只需在程序的开始部分用#include“reg51.h”语句将该文件包含进来即可。
注意:这些寄存器的名字不能用做变量名。
同样,在TMS320F240的C语言中也有一个头文件C240.H定义各个寄存器的名称,这里摘录几条语句进行介绍。
实验三:编写一个C语言和汇编混合的DSP程序一、实验目的1.学习在C工程中加入汇编编程混合编程的方法。
2.了解混合编程的注意事项。
3.了解混合编程的必要性和在什么情况下采用混合编程。
二、实验设备1.PC机一台:操作系统为Windows2000或WindowsXP。
2.ICETEK-F2812-EDU实验箱一台。
三、实验原理实验提供了一个使用C 与汇编程序混合编程的实例,是一个用汇编语言模块优化自己编制的应用程序的实例。
首先用户拿到的是一个纯用C 语言开发的工程,再根据假设,需要将其中一个模块改造成用汇编语言模块优化的模块。
通过实验过程,用户可充分了解混合编程可以采取的步骤和方法。
四、实验步骤1.实验准备:设置软件仿真模式,启动CCS。
2.如实验二建立工程文件,编辑输入C源程序及连接命令文件,程序如同实验二,此处工程文件名为CASM.pjt。
3.编译源文件、下载可执行程序。
4.运行程序,观察结果:在程序z=x + y语句上加软件断点;将变量z 加入变量观察窗口(watch window);运行程序到断点,观察变量z 的结果值。
5.修改程序(1)修改算法部分成单独子程序:我们假设在循环中进行的运算是需要用汇编语言程序模块优化的部分。
首先将“z=x+y;”语句修改成“z=add(x,y);”,在程序头上,变量定义之前加上一行“int add(int a,int b);”,在程序末尾,添加如下子程序。
int add(int a,int b){return(a+b);}如此,将算法搬移到一个C 语言的子程序模块中实现。
修改完成后,可以编译、下载、运行到断点,观察运行结果,判断是否子程序能完全与原程序一样完成算法。
(2)将子程序移入add.c:打开一个新的空的源文件窗口,将main 函数后的子程序复制到窗口中;注释main 函数后面的子程序(在子程序前一行加“/*”,在子程序结尾行后加“*/”);将新窗口中的内容保存为文件add.c。
广州大学学生实验报告
开课学院及实验室:物理与电子工程学院 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程序的运用,只要多加练习便可容易操作,但还是要注意一步一步的来,不可图快。