Violin11 发表于 2017-11-13 10:36

使用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]
查看完整版本: 使用EZ-Kit板上的两块DSP