嵌入式C语言开发ADSP21XX系列DSP
用sin库函数的汇编语言指令语句。
从嵌入式开发的角度讲,VisualDSP的C语言工具已经提供了一个操作系统雏形的功能。在AD公司的ADMC系列DSP中,已经把这些库函数和一些电机控制专用的函数,以及程序加载功能,集成在了DSP的片内ROM中。
3C语言与汇编语言混合编程方法
用C语言开发的缺点是不能精确控制程序运行的时间,对于实时性要求较高的应用,必须用汇编语言。VisualDSP为用户提供了两种与汇编语言的接口方法:用ASM()方法,直接嵌入汇编语言语句;用汇编语言编写子程序,供C语言程序调用。为了支持C语言与汇编程序程序的接口,VisualDSP预定义了诸如FUNCTION_ENTRY、EXIT、SAVE_REG、RESTORE_REG等13个宏。限于篇幅,不详细介绍其功能。使用这些宏以前,要包含asm_sprt.h头文件。
3.1使用ASM()嵌入行的方法
使用这一方法时,一定要注意各寄存器和堆栈当前的状态,以免破坏程序运行的环境,产生错误的结果。VisualDSP保留了一些内部寄存器供用户的汇编代码使用。用户可以自由地修改其内容,而不会对程序造成破坏。这些寄存器包括AR、AF、AY1、M5、11、16、MF、MR0等18个。如果不够用,可以用系统定义的宏save_reg和restore_reg保护现场,得到另外11个可用寄存器。另外要注意的是,在汇编语言中操作C语言中定义的变量时,要在变量名后加下划线。下面是一个嵌套汇编语言的例子:
intimg228;//定义C语言变量
asm("ax0=0x5c;")
asm("dm(ing228_)=ax0");//用汇编语言赋值要将Img228变成Img228_
img228=0x5c;//直接用C语言赋值
编译后的汇编语言代码是
ax0=0x5c;
dm(img228_)=ax0
my1=92;
dm(img228_)=my1;
注意前者可能会破坏程序结构,因为它使用了未经保护的寄存器AX0;而由C语言产生的汇编代码,则会自动选择合适的临时寄存器MY1。
3.2使用汇编子程序的方法
使用汇编子程序是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;//子程序结束标志,必须要的
《嵌入式C语言开发ADSP21XX系列DSP(第3页)》
本文链接地址:http://www.oyaya.net/fanwen/view/174670.html
从嵌入式开发的角度讲,VisualDSP的C语言工具已经提供了一个操作系统雏形的功能。在AD公司的ADMC系列DSP中,已经把这些库函数和一些电机控制专用的函数,以及程序加载功能,集成在了DSP的片内ROM中。
3C语言与汇编语言混合编程方法
用C语言开发的缺点是不能精确控制程序运行的时间,对于实时性要求较高的应用,必须用汇编语言。VisualDSP为用户提供了两种与汇编语言的接口方法:用ASM()方法,直接嵌入汇编语言语句;用汇编语言编写子程序,供C语言程序调用。为了支持C语言与汇编程序程序的接口,VisualDSP预定义了诸如FUNCTION_ENTRY、EXIT、SAVE_REG、RESTORE_REG等13个宏。限于篇幅,不详细介绍其功能。使用这些宏以前,要包含asm_sprt.h头文件。
3.1使用ASM()嵌入行的方法
使用这一方法时,一定要注意各寄存器和堆栈当前的状态,以免破坏程序运行的环境,产生错误的结果。VisualDSP保留了一些内部寄存器供用户的汇编代码使用。用户可以自由地修改其内容,而不会对程序造成破坏。这些寄存器包括AR、AF、AY1、M5、11、16、MF、MR0等18个。如果不够用,可以用系统定义的宏save_reg和restore_reg保护现场,得到另外11个可用寄存器。另外要注意的是,在汇编语言中操作C语言中定义的变量时,要在变量名后加下划线。下面是一个嵌套汇编语言的例子:
intimg228;//定义C语言变量
asm("ax0=0x5c;")
asm("dm(ing228_)=ax0");//用汇编语言赋值要将Img228变成Img228_
img228=0x5c;//直接用C语言赋值
编译后的汇编语言代码是
ax0=0x5c;
dm(img228_)=ax0
my1=92;
dm(img228_)=my1;
注意前者可能会破坏程序结构,因为它使用了未经保护的寄存器AX0;而由C语言产生的汇编代码,则会自动选择合适的临时寄存器MY1。
3.2使用汇编子程序的方法
使用汇编子程序是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;//子程序结束标志,必须要的
《嵌入式C语言开发ADSP21XX系列DSP(第3页)》