嵌入式C语言开发ADSP21XX系列DSPWord下载.docx

上传人:b****1 文档编号:14171179 上传时间:2022-10-19 格式:DOCX 页数:4 大小:18.99KB
下载 相关 举报
嵌入式C语言开发ADSP21XX系列DSPWord下载.docx_第1页
第1页 / 共4页
嵌入式C语言开发ADSP21XX系列DSPWord下载.docx_第2页
第2页 / 共4页
嵌入式C语言开发ADSP21XX系列DSPWord下载.docx_第3页
第3页 / 共4页
嵌入式C语言开发ADSP21XX系列DSPWord下载.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

嵌入式C语言开发ADSP21XX系列DSPWord下载.docx

《嵌入式C语言开发ADSP21XX系列DSPWord下载.docx》由会员分享,可在线阅读,更多相关《嵌入式C语言开发ADSP21XX系列DSPWord下载.docx(4页珍藏版)》请在冰豆网上搜索。

嵌入式C语言开发ADSP21XX系列DSPWord下载.docx

VisualDSP是AD公司的DSP开发工具,主要由可执行文件、库文件和各种帮助文档组成。

版本还带有一个基于图形界面,针对21XX系列DSP的软件仿真和调试工具。

VisualDSP的可执行文件包括汇编、编译、链接工具以及可执行文件重新格式化工具等,见表1。

表1VisualDSP的可执行文件及用途可执行文件名用途*汇编预处理程序*21XX系列汇编程序的汇编程序系列命令行汇编程序系列链接工具基于GNU的21XX系列C编译器系统编译工具,产生相应于不同硬件体系的.ACH文件系列的库管理工具把21XX系列可执行文件变成HIP口可加载的格式把21XX系列可执行文件变成PROM可烧写的格式

注:

“*”代表该程序一般不单独使用,而昌由或调用。

VisualDSP套件中的软件仿真调试工具DEBUGAPP,采用Windows图形界面,使用方便。

它的主要特点是:

可以仿真调试从ADSP2101~2189全系列的DSP;

支持断点、单步、全速运行等各种常见调试方法;

可以随时查询和修改DSP的程序RAM、数据RAM和各寄存器的内容;

可以仿真中断,进行可执行程序性能评估,因此可以进行时序仿真。

DEBUGAPP是调试程序和验证复杂算法的极好工具。

还提供了丰富的帮助文档,包括21XX系列的用户手册、汇编和C语言工具以及仿真调试程序的使用手册;

还有C运行库的参考手册,列出了所有可用的C库函数。

用C语言开发DSP的典型流程如图1所示。

2C语言运行库结构

C语言运行时间库是位于LIB目录下的*.a文件,是整个C开发工具的核心之一,提供了大量的可以直接调用的库函数。

这些库函数的函数原型包含在INCLUDE目录下的头文件中。

这些头文件有的还包含一些宏定义。

另外,VisualDSP还把这些库函数的汇编语言源代码提供给出了用户,方便了用户从中提取有用的代码,甚至修改源代码,生成新的库,来适应自己的要求。

利用LIB21程序,还可以把自己的常用汇编子程序做成库,或是将实时性要求较高的代码用汇编语言来写,做成库,供C语言程序调用。

VisualDSP的C语言运行库由两部分组成:

应用程序框架和预定义的各种库函数。

不同的DSP型号有不同的硬件结构、中断向量表,所以对应的应用程序框架库也不同,相应的文件是21*_其中*代表不同的DSP型号。

应用程序框架的主体是中断向量处理部分,把中断向量引到合适的地址。

其中最重要的是对系统复位的中断向量的处理

_Reset_vector:

CALL_lib_setup_everything;

CALLmain_;

JUMP_lib_prog_term;

NOP;

第一条指令是调用C库函数中的__lib_setup_everything函数作程序启动时的初始化工作。

接下来,调用C语言程序中的main_函数,进入C程序的主体,也就是进入用户自己程序,开始正常工作。

主程序结束后,再调用_lib_prog_term函数,作程序退出时的结尾工作。

由于嵌入式系统的特性,系统绝大多数都在主程序运行时被继电了,所以_lib_prog_term得到执行的机会很小。

其它的中断向量由C运行库来管理,汇编指令

_Interrupt2:

JUMP_lib_int2_ctrl;

NOP;

其中的_lib_int2_crtl就是C语言库中控制INT2的函数。

如果用户要使用该中断,应先把中断服务程序用一个C库函数Interrupt()把服务函数指针设定好,并打开相应的中断允许位,当该中断发生时,_lib_int2_ctr1函数就会控制DSP跳转到相应的指针位置。

  VisualDSP预定义的C语言库函数包括数学函数、FFT函数、ANSI标准内存管理和字符串管理函数的一个子集。

所有的函数列表可参考VisualDSP的联机文档。

这些库函数以二进制代码的形式,打包集合在lib*.a文件中,用户的C语言程序可以像使用自己的子程序一样方便地调用这些库函数。

下面是调用库函数的一个例子。

#//包含所需的头文件

……

floata,b,c;

//定义所需的变量

c=a*sin(b);

//数学运算

编译后产生的汇编源代码中有callsin_指令,就是调用sin库函数的汇编语言指令语句。

从嵌入式开发的角度讲,VisualDSP的C语言工具已经提供了一个操作系统雏形的功能。

在AD公司的ADMC系列DSP中,已经把这些库函数和一些电机控制专用的函数,以及程序加载功能,集成在了DSP的片内ROM中。

3C语言与汇编语言混合编程方法

用C语言开发的缺点是不能精确控制程序运行的时间,对于实时性要求较高的应用,必须用汇编语言。

VisualDSP为用户提供了两种与汇编语言的接口方法:

用ASM方法,直接嵌入汇编语言语句;

用汇编语言编写子程序,供C语言程序调用。

为了支持C语言与汇编程序程序的接口,VisualDSP预定义了诸如FUNCTION_ENTRY、EXIT、SAVE_REG、RESTORE_REG等13个宏。

限于篇幅,不详细介绍其功能。

使用这些宏以前,要包含asm_头文件。

使用ASM嵌入行的方法

使用这一方法时,一定要注意各寄存器和堆栈当前的状态,以免破坏程序运行的环境,产生错误的结果。

VisualDSP保留了一些内部寄存器供用户的汇编代码使用。

用户可以自由地修改其内容,而不会对程序造成破坏。

这些寄存器包括AR、AF、AY1、M5、11、16、MF、MR0等18个。

如果不够用,可以用系统定义的宏save_reg和restore_reg保护现场,得到另外11个可用寄存器。

另外要注意的是,在汇编语言中操作C语言中定义的变量时,要在变量名后加下划线。

下面是一个嵌套汇编语言的例子

intimg228;

//定义C语言变量

asm("

ax0=0x5c;

"

dm(ing228_)=ax0"

);

//用汇编语言赋值要将Img228变成Img228_

img228=0x5c;

//直接用C语言赋值

编译后的汇编语言代码是

dm(img228_)=ax0

my1=92;

dm(img228_)=my1;

注意前者可能会破坏程序结构,因为它使用了未经保护的寄存器AX0;

而由C语言产生的汇编代码,则会自动选择合适的临时寄存器MY1。

使用汇编子程序的方法

使用汇编子程序是C语言程序与汇编语言接口的另一种方法。

用户定义的子程序放在单独的汇编文件中,或是做成二进制的库文件,并将子程序的定义用GLOBEL输出,汇编后就可以供C语言程序调用。

下面是一个不需要参数的子程序的例子

.MODULE/RAM_delay_;

.externaldel_cycle;

//声明del_cycle是外部变量

.globaldelay;

//声明delay为全局函数

delay_:

runction_entry;

//子程序开始标志,必须要的

ar=dm(del_cycle_);

cntr=ar;

dod_loopuntilce;

d_loop:

nop;

exit;

//子程序结束标志,必须要的

.ENDMOD;

如果汇编语言子程序中用到了参数,情况就复杂些。

子程序中的入口参数前两个一定要保存在AR、AY1中。

如果参数多于两个就要把其余的放在堆栈中。

所有子程序的第一个返回值放在AR中。

如果返回值不止一个,就要用到变量型参数或者指针来获得取所有的返回值了。

下面是一个有5个输入参数、1个返回值的子程序例子。

add5_:

function_entry;

ar=ar+ay1;

//前面的两个变量放在AR、AY1中

readsfirst(ay1);

//从程序堆栈中读取第三个变量

ay1=readsnext;

//从程序堆栈中读取第四个变量

ar=ar+ay1;

//从程序堆栈中读取第五个变量

//返回值放在AR中

exit;

注意其中的readsfirst和readsnext都是汇编语言接口宏。

其功能是从堆栈中读取所有的参数。

4C运行库的汇编源代码

如果只用C语言来开发21XX程序,只要有C运行库的二进制版就够了。

幸运的是,AD公司把所有C运行库的汇编源代码随VisualDSP提供给了用户,所以对那些用汇编语言开发的工程师来说,这些源代码也提供了很大的帮助。

因此这代表很多功能的子程序不需要自己去编码、调试,用到某功能时只要把相应的汇编代码链接进自己的程序就可以。

C运行库的源代码是扩展名为DSP的文本文件。

基本上一个库函数对应一个文件,文件名就是函数名。

比如说是正弦、余弦查找、使用都很方便,但是对于其中的交叉调用要注意。

反过来,用户也可以把自己已经调试、验证过的汇编子程序,做成二进制库文件,供C程序调用,这样可以大大提高软件的可重复利用率。

要制作二进制库文件,只要用工具处理就行了。

注意,生成的二制库文件的名字必须以.a作为文件扩展名。

笔者在实际的开发中,遇到这样的情况,自制的2181目标板上有一个自己开忍气吞声驻留程序,通过软件模拟的异步串口与PC通信,加载程序。

但是这个驻留程序占据了0~0x500的空间,用户开发的程序只能加载到从0x500开始的空间内,而用C语言开发的程序起始地址都是从0开始的。

为了解决这个问题,只能自己修改2181_源文件。

首先把第一行的.MODULE/ABS=0改成.MODU

  LE/ABS=0x500,然后汇编成obj文件,代替原来的文件。

另外,在自己的程序中定义一个从0开始0x500大小的PM区域,并初始化成0,就可以防止编译器在该区域内分配别的变量或程序代码,这样编译后的可执行文件的0~0x500空间都是0,加载时把它剔除,而其它有用的指令代码都在0x500之后,解决了这一个问题。

5总结

从实际开发的经验来看,VisualDSP的C语言开发功能十分丰富。

虽然提供的库函数只是ANSI的一个不完备子集,但是对于一般的工程开发来说已经足够用了,而且VisualDSP还提供了C运行库的源代码,这对于解决函

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1