两次读取内存值不一致的问题

zy1306 2018-09-03 09:16:08
环境:
cpu:intel i7-3615QE
内存:ddr3 8G
系统:Ubuntu16.04,linux4.4.0 x64,
设备:pcie3.0x8,使用FPGA实现
现象描述:
1.这款pcie设备采用dma方式写内存,传输速度大概在6Gb/s,每次传输大小在512字节以内的数据包;
2.采用中断+轮询混合方式,由于每秒钟大概能完成100万+次数据包传输,因此估计还是轮询方式为主;
3.驱动里采用多buffer乒乓方式,10x4MB的buffer轮换,初步排除cache一致性问题
4.在内核层对内存里数据进行检查时,会发现某一次数据值不对。将该内存区域的值打印出来时,发现值是对的。也就是说同一地址,两次读取的值不一致;
5.上述情况发生时机不固定,短则在完成几千万个包时就会发生,长则几十亿个包时才发生;
6.如果完全采用中断方式,多个数据包完成给一次中断方式,在中断里唤醒等待对列来读取数据,未发现上述现象发生(1000+小时),怀疑与读取内存的时机有关;
7.该系统pcie不稳定,个别机器在link到pcie3.0x8时,跑上一段时间FPGA里的pcie核会死掉
...全文
861 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2018-09-03
  • 打赏
  • 举报
回复
可能是某一读取瞬间基准电压发生了问题。仔细检查供电电路。一般来说,软件逻辑不会导致偶然性的故障。

如果在硬件层面无法解决,那就只能是借助附加纠错码来防错了。比较麻烦。

如果出错概率很低,也可以采取多次读取比对的方式来处理。例如,读三次,如果有一次与另外两次比同,取另外两次的结果。当然,可靠性要比就错误低一些。

如果嫌纠错码算法太复杂,也可以用检错码,例如 CRC-32 等。发现错误就重读一次。

可以将实意数据与纠错码(检错码)连续存放,也可以将纠错码(检错码)另行存放,能够相互对应即可。

最后还有一招,降低芯片运行的速度(功耗密度),也就是包之间加一些延时,看能否避免出错。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧