“It doesn’t matter where you are, you are nowhere compared to where you can go.”
经过上一篇博客FPGA+DSP SRIO通信(四)——中断系统(一)的学习,我们已经可以将FPGA端产生的doorbell中断变成INTDST,也就是系统中断,接下来要做的就是使系统中断和主机中断 相互关联起来,再将主机中断和CPU中断映射起来,最终编写程序以使CPU知道当某个主机中断发生时,应该做出什么操作。
DSP所做的行为只与CPU中断直接联系。
目录
文章目录
(本文的基础是FPGA能向DSP发送doorbell类型的包。)
上图所示为完整的FPGA到DSP的doorbell映射示意图,本文要实现的是上图右边红色箭头所指的蓝色框内的内容。
那么如何配置cpintc/CIC(CorePac Interrupt Controller)和Intc(Interrupt Controller),以生成主机中断呢?往下看。
##1、配置方法分类
笔者所接触的配置方法有两种,这两种方法的区别在于你的项目要使用sysbios程序还是裸机程序。
两种方法没有孰优孰劣,只是在代码实现方面,sysbios版本显得更加精简优雅。
在实现具体代码配置之前,我们先明确几个数字概念。
【系统事件号】
6678数据手册中的 Table7-38展示了6678的所有系统事件映射,也是一级中断映射,一级中断一共有128个,这128个中断可以被中断选择器选择,映射给12个CPU中断。笔者选择62号和63号系统事件,在表中的展示如下图:
【系统中断号】
##2、6678裸机中断配置
笔者所参照的6678裸机中断配置例程所在位置为C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\example\cpintc\cpintc_test.c,我会在文末将该例程共享出来供大家学习。该官方示例程序大家可以在读完本文后仔细阅读,会对6678的中断系统有更加详细的了解。
上图为一般中断系统的运行原理,DSP在执行指令时,如果遇到中断,会优先执行中断,而中断所要执行的内容就是ISR(中断服务函数)中的内容。如果同时接收到多个中断,会优先执行优先级高的中断。
根据以上说明,我们首先得编写一个中断服务函数,在DSP收到中断后,执行相应的功能,这里以打印出一串字符串为例。
CSL_CPINTC_Handle hnd;// 中断配置句柄
static void print_isr_handler (void* handle)
{
// 触发中断后编程者自定义的功能
printf("receive a interrupt from SRIO\n");
// 使主机中断失效
CSL_CPINTC_disableHostInterrupt (hnd, 2);
// 清除系统中断
CSL_CPINTC_clearSysInterrupt (hnd,116);
// 使能主机中断
CSL_CPINTC_enableHostInterrupt (hnd, 2);
// 获得正在等待的doorbell中断状态
CSL_SRIO_GetDoorbellPendingInterrupt (hSrio, 0, &doorbellStatus);
// 如果有doorbell中断正在等待,则清除正在等待的doorbell中断,以等待进入下一次中断
CSL_SRIO_ClearDoorbellPendingInterrupt (hSrio, 0, doorbellStatus);
}
下面一一解决上面这段代码中的疑问。
##