Chinaunix首页 | 论坛 | 博客
  • 博客访问: 168476
  • 博文数量: 109
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 147
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-23 16:12
文章分类

全部博文(109)

文章存档

2015年(109)

我的朋友

分类: 嵌入式

2015-02-12 15:57:23

原理:tilepro36外接pcie接口的fpga板卡,通过中断的方式通知系统数据接收完毕
现象:由于是高速数据采集,pcie中断次数较多,正常情况下每秒7000次左右,不知道网卡中断次数能达到多少,但是有时上电启动发现pcie次数远远多于预想值,造成linux没有时间去执行中断处理程序,fpga端显示死机。此现象随机出现。
分析原因:
通过认真分析hv/drivers/pcie/rootcomplex_default.c和pcie.c文件的得出pcie中断的原理如下是:
1.rc_init中注册pcie device model,同时注册中断回调函数intcall;
2.rc_service中一直都有一个mailloop函数在pcie dedicated tile上运行,作用是接收pcie接口的message,分析后调用回调函数intcall,根据分析后的参数不同,该回调函数发送ibound内部消息到linux驱动运行的tile,该tile再解析该内部消息并产生linux中断给OS。

问题是回调函数intcall中发送的ibound内部消息应该分为INTx assert和deassert两种,但在错误发生的情况下我一直收到assert消息,没有收到deassert消息,所以认为fpga根本没有发送对本次中断无效的消息,造成hv一直认为中断有效,次数比预想要多。

解决方法:
fpga之前在pc机上使用的是MSI中断,没有使用fpga内部的assert线,但在tilepro36系统中通过观察msi_enable线发现给line一直为低,说明tilepro36硬件部分不支持MSI中断。所以需要使用fpga的assert线来发送INTx的中断消息。

疑点是在hv/drivers/pcie/shim_config.c中ibound init时对pcie寄存器的配置中使能了assert INTA-INTD 4根中断,但没有使能deassert的4根中断。这样配置为什么deassert消息接收后仍然能正确识别呢?

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