Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30241
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 29
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-24 10:57
文章分类
文章存档

2014年(11)

我的朋友

分类: 嵌入式

2014-03-24 17:18:37

原文地址:DSPBIOS的HWI线程应用 作者:xjf616

前言:  因为omapl138linux时采用的是使用dsplink控制dsp核,dsplink是基于dspbios的,所以要想使用dsplink控制dsp核产生中断就必须先了解dspbios的原理和机制。

 

使用dspbiosdsp裸跑有何不同之处,在配置和写代码方面有何不同。如果是裸跑dsp需要写好main.ccmd文件和intvecs.asm即可。而dspbios则更方便易用。在main.c文件基础上再用CCS创建tcfDSP/BIOS configuration file)即可,而cmd文件和intvecs.asm(中断向量表的声明)在编译的时候有tcf文件自动生成。

 

 

话说习惯了在linux下用字符界面封装、配置、编译、链接、调试xdctoolsdspbiosdsplinkcmemCE等工具链。回过头来用ccs来配置这些,突然发现ccs配置感觉很爽,非常友善。也感慨于ccs的强大,是怎么把这些工具链都集成在一起的。。。。

 

 

下面以一个具体例子说明下如何从裸跑dsp核触发中断切换到使用dspbios实现这些功能。本例是在omapl138quickStartOMAPL1x_rCSL基础上修改的,原工程是裸跑触发中断的,将改成使用dspbiosHWI线程方式来实现中断。


如上图,此工程最简单的触发中断的例程,一个main.c文件,OMAPL1x_common.c文件是各寄存器声明文件,invecs.asm文件申明了中断向量表。Inlcude包含了编译器的路径和omapl138CSL库的路径。其cmd文件是在build Properties中手动指定的,因为用不到所以忽略它。

 

现在新建一个空的dspbios工程test7






再把刚才的main.cinvecs.asmOMAPL1x_common.c文件拷贝到test7目录下,CCS4会自动识别并加载到现在的test7工程下。




可以看出bios工程要比一般工程Include路径多了3个专用的dspbios目录。把CSL目录也include起来。

 

1、  invecs.asm文件从工程remove掉。

2、  新建dspbios configuration file,开始配置tcf文件, Scheduling->HWI-Hardware Interrupt Service Routine Manager->HWI_INT4右键单击选择Propertieinterrupt selection number中选择4,function填上中断相应函数的名称,如果是C语言实现的要在前面加下划线这里是_TIMER0_12_isr,Dipatcher选项卡中选中Use Dispatcher,如图


其中interrupt selection number是指事件号,在TIC6000系列中,有128个事件和15个中断源,需要通过配置把需要用到的事件号和中断源映射起来。而本例程中使用的定时器事件源号为4,和INT4的“4”一致是一种巧合。这样就配置好了HWI

3、  接下来配置SWIScheduling->SWI-Software Interrupt Manager右键单击Insert SWI,名字默认为SWI0,配置SWI0相应函数为_swiFxn0,如图



4、  配置LOGInstrumentation->LOG 右键单击选择Insert LOG,命名为trace


到此tcf配置完毕。

 

 

 

接下来是main.c的修改

 

 

1、  在头文件中添加dspbios声明的头文件,其中test7cfg.h文件是编译tcf文件生成的,test7cfg.h文件声明了各个线程如HWISWILOG等。

 

#include

 

#include

#include

#include

#include

#include "test7cfg.h"

#include

2、  修改main函数

原来的main函数内容

    init_OMAPL138();

    setup_Timer0();

    setup_DSP_INTC();

    TIMER_interrupt_DSPexample();

将以上内容转到swiFxn0函数中

Void swiFxn0(Void)

{

    init_OMAPL138();

    setup_Timer0();

    C64_enableIER(C64_EINT4);

    TIMER_interrupt_DSPexample();

    LOG_printf(&trace,"SWI0 done!\n")

}  

Main函数修改为

void main (void)

{

    LOG_printf(&trace,"Main posts SWI0\n");

   SWI_post(&SWI0);

    LOG_printf(&trace,"Main done!\n");

}/* End of main */

 

修改中断响应函数

interrupt void TIMER0_12_isr (void)

void TIMER0_12_isr (void)

这里必须去掉interrupt前缀。因为dspbios不需要关键字interrupt来注明这是中断响应函数,如果加上interrupt关键字有时会造成很大麻烦。

 

整个dspbios工程建立完毕,编译直接把.out下载dsp核中就可触发中断。

整个工程视图:



使用dspbios确实方便很多,裸跑dsp不但要声明中断向量表,写cmd文件分配存储器空间地址,配置全局中断寄存器,使用dspbios只需要在图形界面配置好tcf文件,它自动会生成相应的cmd文件和中断向量表。  裸跑dsp时配置全局中断寄存器需要直接操作寄存器,如下:

 

 

    ISTP = (unsigned int)intcVectorTable;

    ICR = DSPINTC_IST_ALL_MASK_INT;

    IER |= DSPINTC_IST_NMI | DSPINTC_IST_INT4;

 

使用dspbios只需要包含了头文件#include

然后调用中断使能函数:C64_enableIER(C64_EINT4);

 

 参考资料: spru007h.pdf   DSP/BIOS 5.30 Textual Configuration (Tconf) User’s Guide


MS320C6000 DSP/BIOS 5.x Application Programming Interface  (API) Reference Guide

TMS320 DSP/BIOS v5.41 User’s Guide




阅读(1724) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~