使用EZ-Kit板上的两块DSP
使用EZ-Kit板上的两块DSP在Visual DSP++中建立了一个C语言工程,并选择主菜单的Tools->Expert Linker->Create LDF...建立了一个ldf文件,在建立ldf文件向导中,设置processor个数为2,并进行了一些相应的配置。我以为这样就OK了,新建两个C文件,分别写入main函数,编译,结果报错,说main重定义。看来通过向导建立的ldf文件还不能直接使用,需要修改。我在Visual DSP++的安装文件夹中找到了for TS201 EZ-Kit的例子,参考一个名为Spectrum Analyse例子的ldf文件,我对自己工程的ldf进行了一些修改,主要是定义了$OBJECTS_DSPA和$OBJECTS_DSPB,然后将它们加入到一些INPUT_SECTION什么的里面。感觉修改得基本一致了,可是编译仍然不能通过,说main重定义。
一点办法也没有,我把Spectrum Analyse的ldf文件直接拷贝到自己的工程中,才通过编译。先想使用Simulator试试,但是发现Simulator好像不支持双processor模式。那就连接上EZ-Kit,启动,发现很好使。
下图:工程的相关文件。MainA.c里放着写给DSPA的main函数,MainB.c里放着写给DSPB的main函数,test2.ldf是从Spectrum Analyse里复制过来的:
http://www.logicdsp.com/data/attachment/forum/201407/09/221755ulddnk7d112sdkk1.jpg
MainA.c和MainB.c里的main函数一模一样,是我于这个月2号写的一个C程序(参见《ADSP-TS201的计时器》),通过EZ-Kit上的按钮改变一个LED的亮度,使用IRQ0处理按钮动作,使用定时器来输出一定占空比的波形以控制LED亮度。
[*]<span style="line-height: 1.5;">#include <builtins.h></span>
[*]#include <sysreg.h>
[*]#include <defts201.h>
[*]<span style="line-height: 1.5;">#define RWRITE(reg,value) __builtin_sysreg_write(reg,value)</span>
[*]#define RREAD(reg) __builtin_sysreg_read(reg)
[*]<span style="line-height: 1.5;">typedef unsigned int uint;</span>
[*]<span style="line-height: 1.5;">void timer0h_isr(void); //计时器中断</span>
[*]void irq0_isr(void); //IRQ0
[*]<span style="line-height: 1.5;">uint g_bright=0; //亮度控制</span>
[*]int main( void )
[*]{
[*] int v;
[*] //将FLAG2设为输出模式
[*] RWRITE(__FLAGREGST,FLAGREG_FLAG2_EN);
[*] //设置IRQ0服务程序和计时器中断服务程序
[*] RWRITE(__IVIRQ0,(int)irq0_isr);
[*] RWRITE(__IVTIMER0HP,(int)timer0h_isr);
[*] //设置跳沿触发
[*] //RWRITE(__INTCTL,0);
[*] //允许外部IRQ0和计时器
[*] v=RREAD(__IMASKH);
[*] v|=((1<<INT_IRQ0_P)|(1<<INT_TIMER0H_P));
[*] RWRITE(__IMASKH,v);
[*] //设置计数
[*] RWRITE(__TMRIN0H,0);
[*] RWRITE(__TMRIN0L,50000);
[*] //开全局中断使能
[*] RWRITE(__SQCTLST,SQCTL_GIE);
[*] //启动计时器
[*] RWRITE(__INTCTL,INTCTL_TMR0RN);
[*] while(1);
[*] return 0;
[*]}
[*]
[*]#pragma interrupt
[*]void timer0h_isr(void)
[*]{
[*] static uint counter=0;
[*] counter++;
[*] counter&=0x0f;
[*] if(counter>g_bright)
[*] RWRITE(__FLAGREGCL,~FLAGREG_FLAG2_OUT);
[*] else
[*] RWRITE(__FLAGREGST,FLAGREG_FLAG2_OUT);
[*]}
[*]
[*]#pragma interrupt
[*]void irq0_isr(void)
[*]{
[*] g_bright++;
[*] g_bright&=0x0f;
[*]}
复制代码
编译好了以后,会弹出对话框,说明DSPA和DSPB对应的程序文件:
http://www.logicdsp.com/data/attachment/forum/201407/09/221929ccjcjrmwbmnmnsrb.jpg
调试的时候,可以查看各个DSP的状态:
http://www.logicdsp.com/data/attachment/forum/201407/09/221932gwmvym4dpm2vvmh2.jpg
两个DSP都运行的是通过按钮控制LED亮度的程序,所以运行结果如下:
http://www.logicdsp.com/data/attachment/forum/201407/09/222002ayw99oaodpzs8voh.jpg http://www.logicdsp.com/data/attachment/forum/201407/09/222006z8oa9gs6869scwfu.jpg
左起第一个按钮和左起第一个LED对应一个DSP,左起第四个按钮和左起第三个LED对应另外一个DSP。通过按钮,可以改变LED亮度。
这样,我们成功地在TS201的EZ-Kit上同时启动了两个DSP。但不能说本次实验是成功的,因为ldf文件的问题并没有解决,总不能每次都从Examle中拷贝ldf文件吧。怎样创建多DSP工程的ldf文件,还需要学习。
页:
[1]