嵌入式C语言开发ADSP21XX系列DSP
> .ENDMOD;
如果汇编语言子程序中用到了参数,情况就复杂些。子程序中的入口参数前两个一定要保存在AR、AY1中。如果参数多于两个就要把其余的放在堆栈中。所有子程序的第一个返回值放在AR中。如果返回值不止一个,就要用到变量型参数或者指针来获得取所有的返回值了。下面是一个有5个输入参数、1个返回值的子程序例子。
add5_:
function_entry;
ar=ar+ay1;//前面的两个变量放在AR、AY1中
readsfirst(ay1);//从程序堆栈中读取第三个变量
ar=ar+ay1;
ay1=readsnext;//从程序堆栈中读取第四个变量
ar=ar+ay1;
ay1=readsnext;//从程序堆栈中读取第五个变量
ar=ar+ay1;//返回值放在AR中
exit;
注意其中的readsfirst和readsnext都是汇编语言接口宏。其功能是从堆栈中读取所有的参数。
4C运行库的汇编源代码
如果只用C语言来开发21XX程序,只要有C运行库的二进制版就够了。幸运的是,AD公司把所有C运行库的汇编源代码随VisualDSP提供给了用户,所以对那些用汇编语言开发的工程师来说,这些源代码也提供了很大的帮助。因此这代表很多功能的子程序不需要自己去编码、调试,用到某功能时只要把相应的汇编代码链接进自己的程序就可以。C运行库的源代码是扩展名为DSP的文本文件。基本上一个库函数对应一个文件,文件名就是函数名。比如说sin.dsp是正弦、余弦查找、使用都很方便,但是对于其中的交叉调用要注意。
反过来,用户也可以把自己已经调试、验证过的汇编子程序,做成二进制库文件,供C程序调用,这样可以大大提高软件的可重复利用率。要制作二进制库文件,只要用lib21.exe工具处理就行了。注意,生成的二制库文件的名字必须以.a作为文件扩展名。
笔者在实际的开发中,遇到这样的情况,自制的2181目标板上有一个自己开忍气吞声驻留程序,通过软件模拟的异步串口与PC通信,加载程序。但是这个驻留程序占据了0~0x500的空间,用户开发的程序只能加载到从0x500开始的空间内,而用C语言开发的程序起始地址都是从0开始的。为了解决这个问题,只能自己修改2181_hdr.dsp源文件。首先把第一行的.MODULE/ABS=0改成.MODULE/ABS=0x500,然后汇编成obj文件,代替原来的文件。另外,在自己的程序中定义一个从0开始0x500大小的PM区域,并初始化成0,就可以防止编译器在该区域内分配别的变量或程序代码,这样编译后的可执行文件的0~0x500空间都是0,加载时把它剔除,而其它有用的指令代码都在0x500之后,解决了这一个问题。
5总结
从实际开发的经验来看,VisualDSP的C语言开发功能十分丰富。虽然提供的库函数只是ANSI的一个不完备子集,但是对于一般的工程开发来说已经足够用了,而且VisualDSP还提供了C运行库的源代码,这对于解决函数不完备的问题也好处。用C语言开发的好处还包括开发时间大大减少,程序的稳定性大大提高,这对于面对激烈的市场竞争,对于 《嵌入式C语言开发ADSP21XX系列DSP(第4页)》
本文链接地址:http://www.oyaya.net/fanwen/view/174670.html
如果汇编语言子程序中用到了参数,情况就复杂些。子程序中的入口参数前两个一定要保存在AR、AY1中。如果参数多于两个就要把其余的放在堆栈中。所有子程序的第一个返回值放在AR中。如果返回值不止一个,就要用到变量型参数或者指针来获得取所有的返回值了。下面是一个有5个输入参数、1个返回值的子程序例子。
add5_:
function_entry;
ar=ar+ay1;//前面的两个变量放在AR、AY1中
readsfirst(ay1);//从程序堆栈中读取第三个变量
ar=ar+ay1;
ay1=readsnext;//从程序堆栈中读取第四个变量
ar=ar+ay1;
ay1=readsnext;//从程序堆栈中读取第五个变量
ar=ar+ay1;//返回值放在AR中
exit;
注意其中的readsfirst和readsnext都是汇编语言接口宏。其功能是从堆栈中读取所有的参数。
4C运行库的汇编源代码
如果只用C语言来开发21XX程序,只要有C运行库的二进制版就够了。幸运的是,AD公司把所有C运行库的汇编源代码随VisualDSP提供给了用户,所以对那些用汇编语言开发的工程师来说,这些源代码也提供了很大的帮助。因此这代表很多功能的子程序不需要自己去编码、调试,用到某功能时只要把相应的汇编代码链接进自己的程序就可以。C运行库的源代码是扩展名为DSP的文本文件。基本上一个库函数对应一个文件,文件名就是函数名。比如说sin.dsp是正弦、余弦查找、使用都很方便,但是对于其中的交叉调用要注意。
反过来,用户也可以把自己已经调试、验证过的汇编子程序,做成二进制库文件,供C程序调用,这样可以大大提高软件的可重复利用率。要制作二进制库文件,只要用lib21.exe工具处理就行了。注意,生成的二制库文件的名字必须以.a作为文件扩展名。
笔者在实际的开发中,遇到这样的情况,自制的2181目标板上有一个自己开忍气吞声驻留程序,通过软件模拟的异步串口与PC通信,加载程序。但是这个驻留程序占据了0~0x500的空间,用户开发的程序只能加载到从0x500开始的空间内,而用C语言开发的程序起始地址都是从0开始的。为了解决这个问题,只能自己修改2181_hdr.dsp源文件。首先把第一行的.MODULE/ABS=0改成.MODULE/ABS=0x500,然后汇编成obj文件,代替原来的文件。另外,在自己的程序中定义一个从0开始0x500大小的PM区域,并初始化成0,就可以防止编译器在该区域内分配别的变量或程序代码,这样编译后的可执行文件的0~0x500空间都是0,加载时把它剔除,而其它有用的指令代码都在0x500之后,解决了这一个问题。
5总结
从实际开发的经验来看,VisualDSP的C语言开发功能十分丰富。虽然提供的库函数只是ANSI的一个不完备子集,但是对于一般的工程开发来说已经足够用了,而且VisualDSP还提供了C运行库的源代码,这对于解决函数不完备的问题也好处。用C语言开发的好处还包括开发时间大大减少,程序的稳定性大大提高,这对于面对激烈的市场竞争,对于 《嵌入式C语言开发ADSP21XX系列DSP(第4页)》