FPGA+DSP SRIO通信(四)——中断系统(二)

本文详细介绍了如何配置DSP6678的中断系统,使得FPGA通过SRIO发送的Doorbell中断能够映射到CPU中断。首先,解释了系统事件号和系统中断号的概念,然后分别阐述了裸机和sysbios两种方式下,从FPGA的Doorbell中断到CPU中断的配置过程,包括中断服务函数的编写和中断映射配置。最后,提供了一些中断配置的技巧和参考文献。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“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);
}

下面一一解决上面这段代码中的疑问。
###2.1 CSL_CPINTC_disableHostInterrupt

### FPGADSP间基于SRIO的门铃中断机制 在FPGADSP间的通信中,为了确保高效的数据传输并及时通知DSP有新数据到达或特定事件发生,采用了门铃(Doorbell中断机制。当FPGA需要向DSP发送消息或指示某些条件已满足时,会触发这种特殊的中断。 #### 门铃中断的工作原理 门铃中断允许FPGA通过设置一个专门设计的状态位来告知DSP某个操作已完成或是存在待处理的任务。一旦状态位置位,就会激活连接到DSP的硬件线路,从而引起后者执行相应的服务程序[^1]。 具体来说,在支持SRIO协议的情况下,FPGA可以构建并向DSP发出一种称为“doorbell packet”的特殊报文。这类报文并不携带实际的有效载荷而是用来唤醒远端设备上的软件组件以便其能够查询新的情况或准备接受后续到来的信息流[^2]。 #### 实现方法 要实现在FPGA侧发起针对DSP的门铃中断请求,需遵循如下几个方面: - **配置CIC+INTC模块**:这是指完成对核心互联控制器(Core Interface Controller, CIC) 和内部嵌入式中断控制器(Internal Nested Vectored Interrupt Controller, INTC) 的初始化工作,使得它们准备好接收来自外部源如SRIO链路上产生的各类事件的通知。 - **编写Verilog/VHDL代码片段** 下面给出一段简单的VHDL伪码作为例子展示如何定义一个函数用于创建doorbell packets并通过指定通道将其传递给目标节点(DSP): ```vhdl -- 定义一个过程用于生成并发送doorbell包 procedure send_doorbell_packet ( signal srio_channel : out std_logic_vector; constant destination_id : integer := DESTINATION_ID; -- DSP ID constant doorbell_value : integer := DOORBELL_VALUE -- 自定义值 ) is begin -- 构造doorbell包头部信息 construct_header(srio_channel, "DOORBELL", destination_id); -- 添加doorbell有效负载 append_payload(srio_channel, to_stdlogicvector(doorbell_value)); -- 发送整个packet transmit_packet(srio_channel); end procedure; ``` 此段代码展示了怎样封装一个doorbell类型的事务,并经由选定的SRIO信道传送给预设的目的地址即DSP实例。每当调用`send_doorbell_packet()` 函数时,它会在两者之间建立一次单向通讯路径以传达即时性的控制指令或者同步信号。 #### 处理潜在问题 值得注意的是,在实践中可能会遇到一些挑战比如因持续不断地尝试写入而造成的资源争用现象。如果DSP一侧未能正常响应,则可能导致FPGA继续无休止地试图更新共享存储器区域进而影响整体性能甚至造成系统崩溃。因此建议加入必要的流量控制措施防止此类状况的发生[^3]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值