打印

C6000系列DSP的中断系统分析

[复制链接]
920|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
C6000系列DSP的中断模块框图



仔细观察上图,可以看出C6455有一下几种中断:


•1. Reset
•2. NMI 不可屏蔽中断
•3. EXCEP 硬件异常
•4. 12个普通中断INT[15:4]


我们使用的最多的也就是普通中断,所以这也是本文的重点。

接下来,沿着INT[15:4]往后退,看到的是Interrupt Selector,它的功能好比一个筛子(shuffle),对所有中断事件进行选择性映射。如下图示:



看了这个图,我们又不难发现,中断选择器是一个128-->12的映射,这也就意味着,有116个系统事件被过滤掉了。
接着往回走,可以看到,中断选择器有三个输入,分别是:
•RESET
•Event[3:0]
•Event[127:4]



相关帖子

沙发
huangfeng33|  楼主 | 2014-9-10 15:00 | 只看该作者
RESET不看了,硬件重启。
EVENT[127:4]是系统事件,这个事件的编号根据芯片的不同而不同,拿6455来说,部分映射情况如下面两个图片所示:


不难看出,这些编号都是固定的,基本囊括了芯片上所有模块的事件。
最后,比较特别的是Event[3:0],它是组合事件,通过下图的介绍应该就一目了然了。



可见,Event0对应 4-31号事件的组合事件,Event2对应32-63号事件的组合事件,以此类推。


使用特权

评论回复
板凳
huangfeng33|  楼主 | 2014-9-10 15:02 | 只看该作者
那么,怎么组合呢?
这就不得不从寄存器开始说起了。首先,先看如下3个寄存器组:


(注:每组都是4个32位寄存器,每一组的EVTxxx0[3:0]都不使用,故这里不涉及到组合事件)
系统事件发生时(124个),它们在事件标志寄存器中(EVTFLAGx)的对应位会被置1,此时可以通过向EVTCLR寄存器中对应位写入1来清除中断标志,然后执行中断服务程序。若不清除,那么相同事件再次发生时会产生问题。故,手动清除中断标志是必须的!且只能通过向EVTCLR寄存器中写入1来清除,不能直接向EVTFLAG寄存器写入0,因为EVTFLAG寄存器是Read Only的。

另外,EVTSET寄存器的存在意义就是我们可以手动产生中断,这一点可以让我们测试中断服务程序的功能。

介绍完上面三个基本的寄存器组,我们可以开始讨论组合事件的机制了。先看下图:


可以明显的看出,124个事件被分成了4组。然后经过两个寄存器的运算,产生组合事件。
下面介绍EVTMASK和MEVT FLAG两个寄存器组。
•EVT MASK寄存器组用于决定每一个组中的哪些事件被屏蔽掉。默认情况下,没有事件被屏蔽(全0)。


•鉴于最终的组合事件EVTx的发生机制是对Group中所有事件进行或运算,即只要Group中有一个事件发生,就代表组合事件发生。




举个例子:

假如EVTMASK3=0x0FFFFFFF,那么代表只有事件124,125,126,127参与组合。其他事件96-123都被忽略。





•MEVT FLAG寄存器同EVT FLAG寄存器的值相同,表示事件是否发生。这样一旦知道了EVTMASK和MEVT FLAG两个寄存器的值就可以断定组合事件EVTx(0<=x<=3)是否发生了。



使用特权

评论回复
地板
huangfeng33|  楼主 | 2014-9-10 15:05 | 只看该作者
通过上面的介绍,应该已经很清楚C6455的中断机制了,再贴一张图来巩固一下上面所说的内容:



说到这里,我们对上图中红色框以及它之前的东西了解的很清楚了,下面就是Interrupt Selector的机制了。
其实很简单,为12个中断分别配置对应的事件编号即可。只需要3个寄存器就OK啦。


分别是INTMUX1,INTMUX2,INTMUX3。贴一个图就应该很明了了。
[attachimg]340268[/attac举个例子:
假设我要让INT4映射到GPIO4,那么通过查找前面的图,发现GPINT4的事件编号是55,那么只要把INTMUX1的低7位设置成0x37即可。

此外,官方文档里还说了下面一段话

可见,INT4优先级最高,INT15优先级最低


中断模块CSL库使用
上面介绍了很多,其实就是想说清楚C6455的中断机制。实际使用还是CSL比较方便。
使用CSL配置中断需要如下几个步骤:


•1. 初始化中断模块
•2. 使能NMI
•3. 全局中断使能
•4. 打开中断模块
•5. 绑定中断服务程序
•6. 使能相应事件



2.jpg (23.55 KB )

2.jpg

使用特权

评论回复
5
huangfeng33|  楼主 | 2014-9-10 15:05 | 只看该作者
完整中断配置例子----把GPIO4事件映射到INT4

[mw_shl_code=c,false]CSL_Status intStat;
CSL_IntcContext gpiocontext;
CSL_IntcEventHandlerRecord isr_gpio;
CSL_IntcEventHandlerRecord record[1];
CSL_IntcGlobalEnableState state;
CSL_IntcParam vectId;
CSL_IntcHandle gpioIntcHandle;
CSL_IntcObj gpioIntcObj;
static void HANDLE_INTR4(void *arg)
{        //中断服务程序
}


//
//=============初始化外部中断4============
//
void InitAndEnableIntc4(void)
{
         //初始化
         gpiocontext.numEvtEntries = 1;
         gpiocontext.eventhandlerRecord = record;
         intStat = CSL_intcInit(&gpiocontext);
         //使能NMI(不可屏蔽中断)
         intStat = CSL_intcGlobalNmiEnable();
         //全局中断使能
         intStat = CSL_intcGlobalEnable(&state);
         //打开中断模块(把GPIO4中断事件映射到系统中断INT4)
         vectId = CSL_INTC_VECTID_4;
         gpioIntcHandle = CSL_intcOpen(&gpioIntcObj, CSL_INTC_EVENTID_GPINT4, &vectId, &intStat);
         //绑定中断服务程序
         isr_gpio.handler = (CSL_IntcEventHandler)&HANDLE_INTR4;
         CSL_intcPlugEventHandler(gpioIntcHandle, &isr_gpio); //绑定
         //使能该事件(开始监听)
         CSL_intcHwControl(gpioIntcHandle, CSL_INTC_CMD_EVTENABLE, NULL);
}[/mw_shl_code]

使用特权

评论回复
6
小木欧尼| | 2014-9-10 21:40 | 只看该作者
不错  支持一下

使用特权

评论回复
7
edishen| | 2014-9-10 22:16 | 只看该作者
果断支持

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

506

主题

2446

帖子

8

粉丝