0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PCIe接口中断驱动寄存器被覆盖问题的发现与解决

FPGA技术江湖 来源:网络交换FPGA 2023-01-29 15:16 次阅读

最近调试Windows平台下的PCIe网络驱动程序时,发现了中断不被处理的情况,怀疑中断丢失。随后在调试过程中将问题定位在如下两个方面。

DMA写重复启动

我们在Windows下使用WDF框架开发PCIe驱动的DMA读写功能。驱动要启动一次DMA传输包括两个步骤

初始化DMA传输对象

执行DMA传输

初始化DMA传输对象时,应将本次DMA要传输的数据缓冲区的地址和长度写入该对象,并向其注册用于配置并启动DMA传输的回调函数PCIeEvtProgramWriteDma。该回调函数会获取缓冲区地址和长度,通过PIO方式配置PCIe Bar空间上的寄存器,以通知硬件启动DMA传输。

执行DMA传输时,驱动仅需调用WDF框架的WdfDmaTransactionExecute函数,操作系统就会调用上一步注册的回调函数对硬件进行配置并启动DMA传输。

正常来讲,驱动调用一次WdfDmaTransactionExecute函数,相应地操作系统应调用一次回调函数进行硬件配置。但我们更换硬件平台(CPU+FPGA)后,DMA写流程出现了严重问题,具体表现为:前者的一次调用可能会对应着后者的多次调用,且每次回调函数都会完整执行并触发DMA写完成中断,从而造成了驱动的中断状态机被打乱,直接表现是后续的DMA写开始中断丢失,无法正常启动DMA写。

如下,图1是驱动调用WdfDmaTransactionExecute函数的次数与操作系统调用回调函数的次数不一致的截图。

d46e8f36-96c6-11ed-bfe3-dac502259ad0.jpg

图1 DebugMonito监测

其中,5658(5576+82+0)为驱动调用WdfDmaTransactionExecute函数的次数,5664为操作系统调用回调函数的次数。二者之间差6就是操作系统重复调用的次数。

我们尝试将操作系统多出来的调用回调函数的次数跳过,即仅保留第一次调用。硬件侧可以正常完成这次DMA传输,并触发DMA写完成中断。但驱动去查询DMA传输对象时,发现此次DMA传输并未处于完成状态,即无法正常接收数据。至此,我们猜测,操作系统多次调用回调函数的原因是其认为配置过程出错才重新进行配置,直至最后一次成功。而硬件侧并不会感知到这种错误,每次都正常启动DMA写并触发DMA写完成中断,导致驱动的中断状态机跑飞。

问题排查到这里,我们无法深入到闭源的Windows操作系统内部去探究错误原因了。所以思路一转,我们尝试能否为中断状态机提供一些保障机制。

驱动的中断状态机

为了方便调试,我们在中断处理程序中添加了许多关键的调试日志信息,结果在其中发现了端倪。

d48e3b1a-96c6-11ed-bfe3-dac502259ad0.jpg

图2 日志打印记录

观察图2中的日志,发现两个中断延迟处理函数MPHandleInterrupt在并行执行。在这个过程中,用于临时拷贝中断寄存的变量Adapter->IsrCode_dpc被覆盖重写。覆盖的直接后果是,前者已读取到的寄存的中断,后者覆盖后就无法由中断延迟处理程序进行处理。

这种现象显然是不合理的。为了解决这个问题,我们为MPHandleInterrupt函数内部加锁,防止MPHandleInterrupt并行执行。通过这种方式,中断寄存被覆盖的现象不再发生。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5258

    浏览量

    119341
  • 接口
    +关注

    关注

    33

    文章

    8292

    浏览量

    150110
  • WINDOWS
    +关注

    关注

    3

    文章

    3504

    浏览量

    87972
  • PCIe
    +关注

    关注

    15

    文章

    1166

    浏览量

    82088
  • dma
    dma
    +关注

    关注

    3

    文章

    552

    浏览量

    99991

原文标题:PCIe接口中断驱动寄存器被覆盖问题的发现与解决

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于DWC2的USB驱动开发-控制传输中断相关寄存器

    本篇讲解Scatter/Gather DMA模式下控制传输相关的寄存器。控制传输是USB驱动的核心部分,控制传输调通了驱动就完成了一大半,而驱动的核心又是
    的头像 发表于 07-24 00:07 2124次阅读
    基于DWC2的USB<b class='flag-5'>驱动</b>开发-控制传输<b class='flag-5'>中断</b>相关<b class='flag-5'>寄存器</b>

    寄存器移位时,数据不会被覆盖吗?

    ;output Z ;parameter NUM_REG = 6;reg [1: NUM_REG] Q ;integer P ;always@ (negedge Clock) begin//寄存器右移一位
    发表于 11-08 18:49

    求教串口中断寄存器需要控制哪几个寄存器的哪几位?

    求教串口中断寄存器需要控制哪几个寄存器的哪几位?用寄存器写程序
    发表于 03-20 21:24

    求教:关于DM8168的PCIe寄存器

    :                1.如何将DM8168 PCIe寄存器(地址是0x51000000)映射到它的内核空间,这样我就可以在内核空间通过访问其对应的虚拟地址查看PCIe寄存器
    发表于 05-28 01:52

    如何选择51单片机的中断寄存器

    首先介绍一下51的寄存器组:通过设置PSW寄存器的第3位和第4位可以任意切换寄存器组。在进入中断前,切换寄存器组,可以方便的保护原
    发表于 04-17 17:27 0次下载
    如何选择51单片机的<b class='flag-5'>中断寄存器</b>组

    中断寄存器有哪几种类型

    中断寄存器包括定时/计数控制寄存器TCON和串行通信口控制寄存器SCON。
    的头像 发表于 05-01 17:18 8510次阅读
    <b class='flag-5'>中断</b>源<b class='flag-5'>寄存器</b>有哪几种类型

    51单片机与中断相关的寄存器

    51单片机与中断相关的寄存器简介中断控制寄存器IE中断优先级控制寄存器IP定时
    发表于 11-12 11:36 8次下载
    51单片机与<b class='flag-5'>中断</b>相关的<b class='flag-5'>寄存器</b>

    (指南者)(二)寄存器、定时中断

    (指南者)(二)寄存器、定时中断寄存器定时时钟定时寄存器0110代码例程定时
    发表于 12-23 19:19 0次下载
    (指南者)(二)<b class='flag-5'>寄存器</b>、定时<b class='flag-5'>器</b>和<b class='flag-5'>中断</b>

    STC学习:中断相关寄存器

    中断允许寄存器IE、IE2和INT_CLKOIE:中断允许寄存器(可位寻址)SFR namebitB7B6B5B4B3B2B1B0IEnameEAELVDEADCESET1EX1ET0
    发表于 12-23 19:50 0次下载
    STC学习:<b class='flag-5'>中断</b>相关<b class='flag-5'>寄存器</b>

    口中断服务函数的触发

    口中断服务函数的触发USART1_IRQHandler(void)1. 串口发送中断下图为状态寄存器(USART_SR)中的位7、位6说明,发送完一帧并且发送数据寄存器为空时,位6置
    发表于 12-28 19:01 19次下载
    串<b class='flag-5'>口中断</b>服务函数的触发

    STM32串口通信相关寄存器中断回调函数

    (USART_CR1)控制寄存器 2 (USART_CR2)控制寄存器 3 (USART_CR3)串口配置串口初始化GPIO配置,开启中断中断函数串口1
    发表于 12-28 19:11 7次下载
    STM32串口通信相关<b class='flag-5'>寄存器</b>和<b class='flag-5'>中断</b>回调函数

    单片机工作寄存器作用 单片机常用专用寄存器

    除了通用寄存器(如累加、通用寄存器等),单片机中还会有特定功能的寄存器,如定时寄存器
    的头像 发表于 04-08 14:46 7006次阅读

    U54内核中断控制和状态寄存器

    中断控制和状态寄存器 Machine Status Register (mstatus) mstatus 寄存器跟踪并控制 hart 的当前操作状态,包括是否启用中断。 通过设置 ms
    的头像 发表于 10-08 09:54 642次阅读
    U54内核<b class='flag-5'>中断</b>控制和状态<b class='flag-5'>寄存器</b>

    CPSR寄存器和APSR寄存器的组成

    程序状态寄存器的作用就是反映处理的状态信息。在程序运行期间我们可以通过查看程序状态寄存器的状态位来进行程序的分支跳转处理,或者我们可以设置程序状态寄存器的模式位来改变处理
    的头像 发表于 10-20 11:38 3829次阅读
    CPSR<b class='flag-5'>寄存器</b>和APSR<b class='flag-5'>寄存器</b>的组成

    gic的寄存器 gicv3的LPI中断

    0x100-0x17C — 》 GICD_ISENABLERn 这个地址范围内一共可以表示32个32bit的寄存器(n=0x7c/4+1) 所以n的值为0-31,共可以表示32*32=1024个中断 提供了2种访问方式: • 一种是memory-mapped的访问 •
    的头像 发表于 11-08 16:09 583次阅读