当前位置:

首页 > 软件教程 > PCIe中断驱动寄存器被覆盖问题排查与修复

PCIe中断驱动寄存器被覆盖问题排查与修复

在Windows环境下使用WDF框架开发PCIe驱动的DMA读写功能时,启动一次DMA传输需要两个步骤:初始化DMA传输对象:在初始化DMA传输对象时,应将本次DMA传输的数据缓冲区的地址和长度写入该对象,并向其注册用于配置并启动DMA传输的回调函数PCIeEvtProgramWriteDma。该回调函数会获取缓冲区地址和长度,通过PIO方式配置PCIeBar空间上的寄存器,以通知硬件启动DMA传输。执行DMA传输:在执行DMA传输时,驱动仅需调用WDF框架的WdfDmaTransactionExecu

本文目录

    在Windows环境下使用WDF框架开发PCIe驱动的DMA读写功能时,启动一次DMA传输需要两个步骤:

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

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

    通常情况下,驱动调用一次WdfDmaTransactionExecute函数,操作系统应调用一次回调函数进行硬件配置。然而,在我们更换了硬件平台(CPU+FPGA)后,DMA写流程出现了严重问题。具体表现为:驱动的一次调用可能会导致操作系统多次调用回调函数,且每次回调函数都会完整执行并触发DMA写完成中断。这种情况导致驱动的中断状态机被打乱,表现为后续的DMA写开始中断丢失,无法正常启动DMA写。

    如图1所示,图中显示了驱动调用WdfDmaTransactionExecute函数的次数与操作系统调用回调函数的次数不一致的情况。

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

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

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

    问题排查到此,我们无法深入到闭源的Windows操作系统内部去探究错误原因。因此,我们转而考虑能否为中断状态机提供一些保障机制。

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

    PCIe接口中断驱动寄存器被覆盖问题的发现与解决图2 日志打印记录

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

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

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    软件教程
    相关文章 更多
    .NET 获取图片宽高方法及性能对比
    .NET 获取图片宽高方法及性能对比

    在.NET框架中获取图片宽高有多种方法,本文将详细介绍四种方法,并对其性能进行评估。如果您需要处理大量图片,这些信息将非常有用。本文将评估以下四种方法来获取图片的宽高:System.Drawing.Imaging.Metafile不要误以为Metafile是图片的元数据,它实际上是微软Windows系统的一种图片格式,如WMF和EMF(WindowsMetafile和EnhancedMetafile)。虽然它可以读取其他格式的图片,但不适合通过读取元数据头来提升性能。varheader=Meta

    VS Code基础操作教程详解
    VS Code基础操作教程详解

    如何彻底卸载VSCode并清除所有用户数据?要实现此目的,您需要删除与VSCode相关的用户数据文件夹Code和.vscode。这样可以使您的系统恢复到安装VSCode之前的状态。如果您不打算卸载VSCode,也可以通过删除这些文件夹来重置所有设置。不同操作系统下的文件夹路径如下:Windows:删除%APPDATA%\Code和%USERPROFILE%\.vscode。macOS:删除$HOME/Library/ApplicationSupport/Code和~/.vscode。Linux:

    死磕 IO 流?你磕对了吗
    死磕 IO 流?你磕对了吗

    在日常开发中,我们经常会接触到IO流,例如在处理文件上传下载、数据传输以及设计模式等方面。IO流是这些操作的基础,因此今天我们将深入探讨Java中IO流的相关知识点。本文将涵盖以下主要内容:文件对象流概述字节流与字符流文件对象与文件路径Java标准库java.io提供了File对象,用于操作文件和目录。通过File对象,我们可以将文件和目录封装成对象。构造File对象时,需要提供文件或目录的路径名,常用的构造方法如下:方法描述File(StringpathName)通过给

    Pytest跳过用例技巧:skip与skipif详解
    Pytest跳过用例技巧:skip与skipif详解

    如果你还想从头学起Pytest,可以看看这个系列的文章哦!https://www.cnblogs.com/poloyy/category/1690628.html前言可以标记无法在某些平台上运行的测试功能,戒者您希望失败的测试功能pytest.mark.skip希望满足某些条件才执行某些测试用例,否则pytest会跳过运行该测试用例实际常见场景:跳过非Windows平台上的仅Windows测试,或者跳过依赖于当前不可用的外部资源(例如数据库)的测试@pytest.mark.skip跳过执行测试用例,有

    Qt数据看板布局另存方法详解
    Qt数据看板布局另存方法详解

    一、前言布局另存功能是数据可视化大屏界面电子看板系统中的一项便捷功能,旨在帮助用户在现有布局上进行微调后,直接将其保存为新的配置文件,从而避免从头开始重新构建布局的繁琐过程。此功能依赖于配置文件的保存机制,通过将现有布局另存为不同名称的配置文件,用户可以轻松管理和切换不同的布局设置。在代码实现上,Qt的QSettings类提供了极大的便利,不仅支持Windows注册表的读写操作,还支持跨平台的INI文件格式。个人而言,我更倾向于使用INI文件作为配置文件,因为其跨平台特性特别适合我在嵌入式Linux环境下

    Qt输入法V2019项目作品分享
    Qt输入法V2019项目作品分享

    一、功能特点本输入法未采用Qt系统层输入法框架,而是采用了独创的输入切换机制。完全基于QWidget编写,适用于任何目标平台(已测试Windows、Linux、嵌入式Linux等),兼容任意Qt版本(已测试从Qt4.6.0到Qt5.13),支持任意编译器(已测试mingw、gcc、msvc等),并能在任意控件中输入,包括网页中的输入控件。调用非常方便,只需在pro文件中包含pri文件,例如:include($$PWD/input2019/input2019.pri)。界面设计简洁明了,UI美观友好,模仿I

    MySQL解压版Windows安装教程
    MySQL解压版Windows安装教程

    MySQL解压版如何在Windows系统中安装1、请将压缩包中的软件包解压出来,并复制到所要安装的路径下面。2、在安装路径下面软件包内新建两个文件,data目录和my.ini文件。3、在my.ini内更改安装位置,注意版本,文件已放置于压缩包中。代码语言:javascript代码运行次数:0运行复制[client]port=3306default-character-set=utf8[mysqld]#设置mysql的安装目录basedir=E:\MySQL\mysql-5.7.26-winx64#设置

    报错:缺少 Microsoft.ReportViewer.Common 11.0.0.0 解决方法
    报错:缺少 Microsoft.ReportViewer.Common 11.0.0.0 解决方法

    在开发WinForm客户端软件时,使用rdlc进行报表生成并通过ReportViewer展示报表时,开发者的机器上运行正常,但部署到第三方机器上时可能会遇到以下几种错误:(1)未能加载文件或程序集“Microsoft.ReportViewer.Common,Version=11.0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91”或它的某一个依赖项。系统找不到指定的文件。文件名:“Microsoft.ReportViewer.Common,V

    NTLM协议工作原理详解
    NTLM协议工作原理详解

    NTLM协议在WindowsNT和Windows2000Server(或更高版本)的工作组环境中使用(Kerberos用于域模式下)。在AD域环境中,若需要验证WindowsNT系统,必须使用NTLM。与Kerberos相比,NTLM认证过程更为简单。NTLM采用挑战/响应(Challenge/Response)消息交换模式,以下是NTLM的认证流程:NTLM认证协议可用于多种协议中,例如HTTP、SMB等。以下通过HTTP协议来说明其具体认证流程:首先,

    Windows 8配置Eclipse与Hadoop2.2.0环境指南
    Windows 8配置Eclipse与Hadoop2.2.0环境指南

    图文详解如何在Windows8.0上的Eclipse4.4.0中配置CentOS6.5上的Hadoop2.2.0开发环境,供有需要的朋友参考学习。Eclipse的Hadoop插件下载地址:https://github.com/winghc/hadoop2x-eclipse-plugin下载压缩包后,解压并将hadoop-eclipse-kepler-plugin-2.2.0.jar文件放置到Eclipse的dropins目录中,重启Eclipse即可。进入Windows->Prefere

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。