分类: 嵌入式
2012-11-15 09:28:42
前言: 因为omapl138跑linux时采用的是使用dsplink控制dsp核,dsplink是基于dspbios的,所以要想使用dsplink控制dsp核产生中断就必须先了解dspbios的原理和机制。
使用dspbios和dsp裸跑有何不同之处,在配置和写代码方面有何不同。如果是裸跑dsp需要写好main.c、cmd文件和intvecs.asm即可。而dspbios则更方便易用。在main.c文件基础上再用CCS创建tcf(DSP/BIOS configuration file)即可,而cmd文件和intvecs.asm(中断向量表的声明)在编译的时候有tcf文件自动生成。
话说习惯了在linux下用字符界面封装、配置、编译、链接、调试xdctools,dspbios,dsplink,cmem,CE等工具链。回过头来用ccs来配置这些,突然发现ccs配置感觉很爽,非常友善。也感慨于ccs的强大,是怎么把这些工具链都集成在一起的。。。。
下面以一个具体例子说明下如何从裸跑dsp核触发中断切换到使用dspbios实现这些功能。本例是在omapl138的quickStartOMAPL1x_rCSL基础上修改的,原工程是裸跑触发中断的,将改成使用dspbios的HWI线程方式来实现中断。
如上图,此工程最简单的触发中断的例程,一个main.c文件,OMAPL1x_common.c文件是各寄存器声明文件,invecs.asm文件申明了中断向量表。Inlcude包含了编译器的路径和omapl138的CSL库的路径。其cmd文件是在build Properties中手动指定的,因为用不到所以忽略它。
现在新建一个空的dspbios工程test7
再把刚才的main.c、invecs.asm、OMAPL1x_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右键单击选择Propertie,interrupt selection number中选择4,,function填上中断相应函数的名称,如果是C语言实现的要在前面加下划线这里是_TIMER0_12_isr,在Dipatcher选项卡中选中Use Dispatcher,如图
其中interrupt selection number是指事件号,在TI的C6000系列中,有128个事件和15个中断源,需要通过配置把需要用到的事件号和中断源映射起来。而本例程中使用的定时器事件源号为4,和INT4的“4”一致是一种巧合。这样就配置好了HWI。
3、 接下来配置SWI,Scheduling->SWI-Software Interrupt Manager右键单击Insert SWI,名字默认为SWI0,配置SWI0相应函数为_swiFxn0,如图
4、 配置LOG,Instrumentation->LOG 右键单击选择Insert LOG,命名为trace。
到此tcf配置完毕。
接下来是main.c的修改
1、 在头文件中添加dspbios声明的头文件,其中test7cfg.h文件是编译tcf文件生成的,test7cfg.h文件声明了各个线程如HWI、SWI、LOG等。
#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