编写一个以c语言或汇编为基础的DSP程序(千一)

合集下载

DSPC语言编程基础

DSPC语言编程基础
第11页/共53页
8.3.2 创建main( )函数
在C语言应用软件中,用户必须定义一个main( )函数作为自己应用程序 的开始。因为系统完成C语言环境设置后,boot.obj会自动调用main( )函数 作为程序的开始。因此,程序员在程序中编写main( )函数是一种预定,也 是一种强制。
第12页/共53页
第8页/共53页
8.2.2 指定初始化类型
用C语言编程时,会根据需要定义全局变量和静态变量。有些全局变量 和静态变量具有初始值,有些全局变量和静态变量没有初始值。C编译器对 C程序编译后,为具有初始值的全局变量和静态变量建立了一个专门的数据 块.cinit。该块在程序运行后调入到RAM的.bss中。 .cinit调入到RAM中有 两种方法: (1)在运行时,自动初始化全局变量和静态变量; (2)在加载时,自动初始化全局变量和静态变量。
第22页/共53页
1、C编译器生成的块
C汇编器对C语言程序编译生成7个可以进行重定位的代码和数据 块:.text、.cinit、.const、.switch、.bss、.stack、.sysmem。 (1).text块包含所有可执行代码和浮点常量。 (2).text块包含初始化变量和常量的表。 (3).const块包含字符串变量、明显初始化的全局和静态变量的定义和初 始化。 (4).switch块包含switch语句表。 (5).bss块为全局和静态变量保留空间。 (6).stack块为C系统堆栈。 (7).sysmem块为动态存储器分配保留空间。
为了使用一个库函数,用户必须首先使用#include来包含声明函数的 头文件。
第20页/共53页
8.5 TMS320C24x C语言程序开发
TMS320C24x C语言具有特定的运行环境,为了确保C语言程序正 确运行,C语言程序开发必须维护这个环境。

DSP汇编语言编程基础

DSP汇编语言编程基础

实验二 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_c2000_C语言编程要点

DSP_c2000_C语言编程要点
2> 全部采用小数,这样因为小数之间相乘永远是小数,永远不会溢出。取一个极限最 大值(最好使用 2 的 n 次幂),转换成 x/Max 的小数(如果 Max 是取的 2 的 n 次幂,就 可以使用移位代替除法)。
例 3、DSP 程序中比较通用的命名方法
1) 变量、常量和对象命名多用名词或形容词+名词,比如 ADC 的寄存器就可以命名为 “AdcRegs”。
例 2、Q 格式
由于 C2000 系列是定点 DSP,遇到小数时不能直接处理,所以就要想一些办法,通常 DSP 用 Q 格式来表示。当假定小数点位于第 0 位的右侧时,为 Q0;当小数电位于第 15 位的 右侧时为 Q15;若是 32 位处理器则最大可为 Q31。
浮点数和定点数转换的公示:
X 为浮点数, X 为定点数。
WDCR=0x0068; WDKEY=0X0055; WDKEY=0X00aa; printf(“hello,DSP world\n”); for(;;) ; } 首先,要禁止看门狗 watchdog。DSP 默认上电后看门狗会自动启动,时间一到就会令 DSP 复位。 其次,DSP 的 C 需要绝对定位,而主机的 C 的代码有操作系统定位。在“printf(“hello, DSP world\n”);”语句后,需要加设死循环语句“for(;;) ;”。标准 C 运行在操作系统下, 退出 main()函数后,控制权会交给操作系统。而一般 DSP 没有操作系统,退出 main() 函数即意味着程序跑飞了,所以要在主函数里加一个死循环。 在程序开头是通过宏定义去表示 watchdog 的寄存器,因为例子中用到的 DSP 芯片是 F240 系列的,而其 WDCR 和 WDKEYD7 寄存器的地址分别是 0x7029h 和 0x7025h,(volitial unsigned int*)表明 0x7029 是一个可被修改的无符号整型指针变量。

11313121颜伟DSP大作业

11313121颜伟DSP大作业

序言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)数字系统由耗电的有源器件构成,没有无源设备可靠。

DSP的C语言编程

DSP的C语言编程

72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37
DG ND B C L KX 1 DG ND HD 1 C V DD IN T3 IN T2 IN T1 IN T0 NM I HB IL IA C K B D X2 B D X0 HD 0 DG ND 3 .3 V HR DY B F SX2 B F SX0 C V DD HP INT DG ND B C LKX 2 B C LKX 0 BD R2 HC T1 BD R0 B F SR 2 B F SR 0 B C LKR 2 B C LKR 0 DG ND HC T0 B C L KR 1 DG ND
DSP的C语言程序入门
• 1、以最小系统板的LED灯闪烁程 序为例: 分别利用汇编语言、C语言、C语 言和汇编语言混合编程三种方法 实现DSP最小系统板LED灯D1闪烁。
C L KOU T TO UT
1 2
J1 C O N2 R2 4 .7 K DG ND
C LK OU T X1 H D3
D2 R ES ET D1 C LD 0IN K
H D7 A 11
A 10
A 12
A 13
A 14
A 15
NC
NC 36
1
2
3
4
5
6
7
8
9 10
11
12 13
14 15
16
17
18
19
20
21
22 23
24 25
26
27
28
29

编写一个以C 语言为基础的DSP程序

编写一个以C 语言为基础的DSP程序

实验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文件来观察结果。

DSP实验编写一个以C 语言为基础的DSP 程序

DSP实验编写一个以C 语言为基础的DSP 程序

编写一个以C 语言为基础的DSP 程序
实验结果:
通过实验可以发现,修改cmd文件可以安排程序和数据在DSP内存资源中的分配和位置;map文件中描述了程序和数据所占用的实际尺寸和地址。

C语言编制的程序,在经过编译器编译后,需要连接若干C 标准程序辅助运行。

以下是运行流程:
1.程序入口为_c_int00,执行标准C库中的程序,负责初始化C环境、申请堆栈、初始化有初始值的变量
2.程序最终转到用户编制的主函数运行。

3.程序在主函数中的无限循环中持续运行。

编写一个汇编和C 混合的DSP 程序。

DSP应用程序中C代码和汇编代码的结合

DSP应用程序中C代码和汇编代码的结合

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语言编程

DSP的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语言程序设计

DSP的C语言程序设计

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目录中的头文件类型不同。

第6章 C语言和汇编语言混合编程(C55x DSP)

第6章  C语言和汇编语言混合编程(C55x DSP)

第6章 C语言和汇编语言混合编程
2. 编译模式 使用C编译器,在进入汇编程序时,C55x的CPL(编译模 式位)自动被置1,相对寻址模式使用堆栈指针SP。如果在汇 编程序中需要使用相对直接寻址模式访问数据存储器,则必 须改成数据页DP直接寻址模式,这可以通过清CPL位实现。 在返回C调用程序前,CPL位必须重新置1。
序清单输入到这些文件当中,保存并将其添加到工程之中。
第6章 C语言和汇编语言混合编程
3. 编译链接工程和装载输出文件 编译链接工程,修改错误,直到无错误信息提示为止, 再装载输出文件。 4. 打开CPU寄存器视窗 在主菜单中选择View→Registers→CPU Registers命令, 打开CPU寄存器视窗,观察CPU寄存器的变化情况。
int s4; s4=sum(); s1=mac1(x,a,n); //*ar0=x[0],*ar1=a[0],t0=n,return is stored in t0
s2=mac2(x,a,n);
//*ar0=x[0],*ar1=a[0],t0=n,return is stored in ac0
第6章 C语言和汇编语言混合编程
“ _ ”。以下是C函数调用汇编子程序的例子。
第6章 C语言和汇编语言混合编程
//C源程序: extern int sum(int *); //参考一个汇编函数 int x[4]={0x1223,0x345,0x2345,0x3444}; //定义全局变量并初始化
int s;
void main() {
参数类型和寄存器安排顺序表。
第6章 C语言和汇编语言混合编程
表6-1 参数类型和寄存器安排顺序表
第6章 C语言和汇编语言混合编程

如何利用C和汇编语言混合编程实现DSP软件设计_百度文库(精)

如何利用C和汇编语言混合编程实现DSP软件设计_百度文库(精)

如何利用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语言的实现。

汇编部分代码应尽可能少。

为此,工程师需要认真分析跟踪器提供的性能结果,并确定应用程序中的关键函数。

关键函数是指占用大部分执行时间,而必须用汇编语言重写才能满足性能目标的那些函数。

重写其中的几个关键函数后,需要重新进行性能分析。

DSP系统中C语言和汇编语言的混合编程

DSP系统中C语言和汇编语言的混合编程
1 C语言的存储器模型 2 C语言的寄存器规则 3 C语言的函数调用规则 4 C与汇编语言的接口
2
C语言和汇编语言的混合编程 C语言的存储器模型
1 C语言的存储器模型
C编译器产生的段
段名称 .text 已初 始化 段 .cinit .switch .const .bss 未初 始化 段 .stack .system 段内容 可执行代码和浮点常数 已初始化的全局变量和静态变量 的列表 用于多开关语句的跳转列表 已初始化的字符串、全局常量和 静态常量 全局和静态变量 软件堆栈 动态存储空间 存储器类型 ROM或RAM ROM或RAM ROM或RAM ROM或RAM RAM RAM RAM 页 0 0 0 1 1 1 1
独立的C和汇编模块接口
在编写汇编语言时必须遵循有关的寄存器规则和调用规 则,否则可能会破坏C的运行环境 在编写独立的汇编程序时,必须注意以下几点:
无论是C函数还是汇编函数,都必须遵循寄存器使用规则 必须保护函数要用到的几个专用寄存器,专用寄存器包括: AR0(FP)、AR1(SP)、AR6和AR7;其中,如果SP正 常使用的话,则不必明确加以保护,即只要汇编函数在返回 时弹出压入的对象,实际上就已经保护了SP 其它寄存器可以自由使用
18
C语言和汇编语言的混合编程 C语言与汇编语言的接口
2
19
C语言和汇编语言的混合编程 C语言与汇编语言的接口
在汇编语言中访问C程序变量
在C程序中定义全局变量 在汇编语言中使用.global声明为外部变量,变量名前加 下划线“_” 在汇编程序中正常地对变量访问
20
C语言和汇编语言的混合编程 C语言与汇编语言的接口
寄存器 AR0 AR1 AR2 AR2~AR5 AR6~AR7 ACC累加器 P T 结构指针 堆栈指针 局部变量指针 表达式分析 寄存器变量 表达式分析/返回值 表达式分析 表达式分析 用处 被调函数保护 Yes Yes No No Yes No No No

如何使用C语言开发DSP系统

如何使用C语言开发DSP系统

如何使用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定义各个寄存器的名称,这里摘录几条语句进行介绍。

dsp实验三 编写一个C语言和汇编混合的DSP程序

dsp实验三 编写一个C语言和汇编混合的DSP程序

实验三:编写一个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。

实验1.2:编写一个以C语言为基础的DSP程序

实验1.2:编写一个以C语言为基础的DSP程序
实验1.2:编写一个以C语言为基础的DSP程序
一.实验目的 1.学习用标准C语言编制程序;了解常用的C语言程序设计方法和组成部分。 2.学习编制连接命令文件,并用来控制代码的连接。 3.学会建立和改变map文件,以及利用它观察DSP内存使用情况的方法。 4.熟悉使用软件仿真方式调试程序。 二.实验原理 1. 标准C语言程序
10.改变内存分配
修改 cmd 文件中的
PAGE 0 : PROG(R) 改为PAGE 0 : PROG(R)
: origin = 0x3E8000, length = 0x10000 : origin = 0x3E9000, length = 0x10000
重新编译工程,观察 map 文件中有何变化。 11.退出 CCS
打开 CProgram.cmd 文件。
(3)程序的入口地址:map 文件中“ENTRY POINT SYMBOL”中说明了程序入口地址
(_c_int00)。
(4)内存使用情况: -map 文件中“MEMORY CONFIGURATION”标明了程序占用 RAM 的使用情况,共占
用 aaH 个存储单元。
.text:{}>DARAM .bss:{}>DARAM .stack:{}>DARAM .cinit:{}>DARAM }
-如同第(1)步操作,将文件存为: C:\ICETEK-F2812-A-EDUlab\DSP281x_examples\Lab0102-CProgram \CProgram.cmd (3)将上述编译的源程序加入工程 CProgram.pjt。
(6)双击观察窗口中变量 x、y 在“Value”栏中的取值,并修改成 0;选择菜单
Debug->Restart,返回程序起点。

dsp的c语言编程

dsp的c语言编程

short、int和指针)都可以被定义为寄存器变量。但 在运行时,设置一个寄存器变量大约需要4条指 令,为了更有效地使用这个功能,仅当变量被访问 超过2次时,才使用寄存器变量。
程序优化编译器也会定义寄存器变量,但使用方式不 同。编译器会自己决定哪些变量作为寄存器变量, 程序中声明的寄存器变量会全部被忽略。
浮点到整数的转换取整数部分。
指针和整数可以自由转换。
(3)表达式
当两个有符号整数相除时,若其中一个为负,则其 商为负,余数的符号与分子的符号相同。斜杠 (/)用来求商,百分号(%)用来求余数。例如:
10/-3 = -3, -10%3 = -1
-10/3 = -3,
10%-3 = 1,
(4)声明 寄存器变量对所有char,short,int和指针类型 有效。 interrupt关键字仅可用于没有参量的void函数。
(5)预处理 预处理器忽略任何不支持的#pragma伪指令。预处 理器支持的伪指令包括: ·CODE_SECTOIN ·DATA_SECTION ·FUNC_EXT_CALLED
15.2.2 TMS320C2000 C语言的数据类型
注:在TMS320C2x/C2xx/C5x C语言中,字节长度为16位,sizeof操作符返回 的对象长度是以16位为字节长度的字节数。例如sizeof(int) = 1。
15.2 DSP C语言特性 15.2.1 TMS320C2000 C语言的特征 (1)标识符和常数 所有标识符的前100个字符有意义,区分大小写。
源(主机)和执行(目标)字符集为ASCII码,不 存在多字节字符。 具有多个字符的字符常数按序列中最后一个字符来编 码,例如:
‘abc’ == ‘c’ (2)数据转换
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

广州大学学生实验报告
开课学院及实验室:物理与电子工程学院 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程序的运用,只要多加练习便可容易操作,但还是要注意一步一步的来,不可图快。

相关文档
最新文档