0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

PCIe接口中斷驅(qū)動寄存器被覆蓋問題的發(fā)現(xiàn)與解決

FPGA技術江湖 ? 來源:網(wǎng)絡交換FPGA ? 2023-01-29 15:16 ? 次閱讀

最近調(diào)試Windows平臺下的PCIe網(wǎng)絡驅(qū)動程序時,發(fā)現(xiàn)了中斷不被處理的情況,懷疑中斷丟失。隨后在調(diào)試過程中將問題定位在如下兩個方面。

DMA寫重復啟動

我們在Windows下使用WDF框架開發(fā)PCIe驅(qū)動的DMA讀寫功能。驅(qū)動要啟動一次DMA傳輸包括兩個步驟

初始化DMA傳輸對象

執(zhí)行DMA傳輸

初始化DMA傳輸對象時,應將本次DMA要傳輸?shù)臄?shù)據(jù)緩沖區(qū)的地址和長度寫入該對象,并向其注冊用于配置并啟動DMA傳輸?shù)幕卣{(diào)函數(shù)PCIeEvtProgramWriteDma。該回調(diào)函數(shù)會獲取緩沖區(qū)地址和長度,通過PIO方式配置PCIe Bar空間上的寄存器,以通知硬件啟動DMA傳輸。

執(zhí)行DMA傳輸時,驅(qū)動僅需調(diào)用WDF框架的WdfDmaTransactionExecute函數(shù),操作系統(tǒng)就會調(diào)用上一步注冊的回調(diào)函數(shù)對硬件進行配置并啟動DMA傳輸。

正常來講,驅(qū)動調(diào)用一次WdfDmaTransactionExecute函數(shù),相應地操作系統(tǒng)應調(diào)用一次回調(diào)函數(shù)進行硬件配置。但我們更換硬件平臺(CPU+FPGA)后,DMA寫流程出現(xiàn)了嚴重問題,具體表現(xiàn)為:前者的一次調(diào)用可能會對應著后者的多次調(diào)用,且每次回調(diào)函數(shù)都會完整執(zhí)行并觸發(fā)DMA寫完成中斷,從而造成了驅(qū)動的中斷狀態(tài)機被打亂,直接表現(xiàn)是后續(xù)的DMA寫開始中斷丟失,無法正常啟動DMA寫。

如下,圖1是驅(qū)動調(diào)用WdfDmaTransactionExecute函數(shù)的次數(shù)與操作系統(tǒng)調(diào)用回調(diào)函數(shù)的次數(shù)不一致的截圖。

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

圖1 DebugMonito監(jiān)測

其中,5658(5576+82+0)為驅(qū)動調(diào)用WdfDmaTransactionExecute函數(shù)的次數(shù),5664為操作系統(tǒng)調(diào)用回調(diào)函數(shù)的次數(shù)。二者之間差6就是操作系統(tǒng)重復調(diào)用的次數(shù)。

我們嘗試將操作系統(tǒng)多出來的調(diào)用回調(diào)函數(shù)的次數(shù)跳過,即僅保留第一次調(diào)用。硬件側(cè)可以正常完成這次DMA傳輸,并觸發(fā)DMA寫完成中斷。但驅(qū)動去查詢DMA傳輸對象時,發(fā)現(xiàn)此次DMA傳輸并未處于完成狀態(tài),即無法正常接收數(shù)據(jù)。至此,我們猜測,操作系統(tǒng)多次調(diào)用回調(diào)函數(shù)的原因是其認為配置過程出錯才重新進行配置,直至最后一次成功。而硬件側(cè)并不會感知到這種錯誤,每次都正常啟動DMA寫并觸發(fā)DMA寫完成中斷,導致驅(qū)動的中斷狀態(tài)機跑飛。

問題排查到這里,我們無法深入到閉源的Windows操作系統(tǒng)內(nèi)部去探究錯誤原因了。所以思路一轉(zhuǎn),我們嘗試能否為中斷狀態(tài)機提供一些保障機制。

驅(qū)動的中斷狀態(tài)機

為了方便調(diào)試,我們在中斷處理程序中添加了許多關鍵的調(diào)試日志信息,結果在其中發(fā)現(xiàn)了端倪。

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

圖2 日志打印記錄

觀察圖2中的日志,發(fā)現(xiàn)兩個中斷延遲處理函數(shù)MPHandleInterrupt在并行執(zhí)行。在這個過程中,用于臨時拷貝中斷寄存的變量Adapter->IsrCode_dpc被覆蓋重寫。覆蓋的直接后果是,前者已讀取到的寄存的中斷,后者覆蓋后就無法由中斷延遲處理程序進行處理。

這種現(xiàn)象顯然是不合理的。為了解決這個問題,我們?yōu)镸PHandleInterrupt函數(shù)內(nèi)部加鎖,防止MPHandleInterrupt并行執(zhí)行。通過這種方式,中斷寄存被覆蓋的現(xiàn)象不再發(fā)生。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5359

    瀏覽量

    120819
  • 接口
    +關注

    關注

    33

    文章

    8674

    瀏覽量

    151555
  • WINDOWS
    +關注

    關注

    4

    文章

    3554

    瀏覽量

    89012
  • PCIe
    +關注

    關注

    15

    文章

    1247

    瀏覽量

    82892
  • dma
    dma
    +關注

    關注

    3

    文章

    566

    瀏覽量

    100765

原文標題:PCIe接口中斷驅(qū)動寄存器被覆蓋問題的發(fā)現(xiàn)與解決

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于DWC2的USB驅(qū)動開發(fā)-控制傳輸中斷相關寄存器

    本篇講解Scatter/Gather DMA模式下控制傳輸相關的寄存器??刂苽鬏斒荱SB驅(qū)動的核心部分,控制傳輸調(diào)通了驅(qū)動就完成了一大半,而驅(qū)動的核心又是
    的頭像 發(fā)表于 07-24 00:07 ?2721次閱讀
    基于DWC2的USB<b class='flag-5'>驅(qū)動</b>開發(fā)-控制傳輸<b class='flag-5'>中斷</b>相關<b class='flag-5'>寄存器</b>

    寄存器移位時,數(shù)據(jù)不會被覆蓋嗎?

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

    求教串口中斷寄存器需要控制哪幾個寄存器的哪幾位?

    求教串口中斷寄存器需要控制哪幾個寄存器的哪幾位?用寄存器寫程序
    發(fā)表于 03-20 21:24

    求教:關于DM8168的PCIe寄存器

    : ?????????????? 1.如何將DM8168 PCIe寄存器(地址是0x51000000)映射到它的內(nèi)核空間,這樣我就可以在內(nèi)核空間通過訪問其對應的虛擬地址查看PCIe寄存器
    發(fā)表于 05-28 01:52

    如何選擇51單片機的中斷寄存器

    首先介紹一下51的寄存器組:通過設置PSW寄存器的第3位和第4位可以任意切換寄存器組。在進入中斷前,切換寄存器組,可以方便的保護原
    發(fā)表于 04-17 17:27 ?0次下載
    如何選擇51單片機的<b class='flag-5'>中斷寄存器</b>組

    中斷寄存器有哪幾種類型

    中斷寄存器包括定時/計數(shù)控制寄存器TCON和串行通信口控制寄存器SCON。
    的頭像 發(fā)表于 05-01 17:18 ?8846次閱讀
    <b class='flag-5'>中斷</b>源<b class='flag-5'>寄存器</b>有哪幾種類型

    51單片機與中斷相關的寄存器

    51單片機與中斷相關的寄存器簡介中斷控制寄存器IE中斷優(yōu)先級控制寄存器IP定時
    發(fā)表于 11-12 11:36 ?8次下載
    51單片機與<b class='flag-5'>中斷</b>相關的<b class='flag-5'>寄存器</b>

    (指南者)(二)寄存器、定時中斷

    (指南者)(二)寄存器、定時中斷寄存器定時時鐘定時寄存器0110代碼例程定時
    發(fā)表于 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
    發(fā)表于 12-23 19:50 ?0次下載
    STC學習:<b class='flag-5'>中斷</b>相關<b class='flag-5'>寄存器</b>

    口中斷服務函數(shù)的觸發(fā)

    口中斷服務函數(shù)的觸發(fā)USART1_IRQHandler(void)1. 串口發(fā)送中斷下圖為狀態(tài)寄存器(USART_SR)中的位7、位6說明,發(fā)送完一幀并且發(fā)送數(shù)據(jù)寄存器為空時,位6置
    發(fā)表于 12-28 19:01 ?19次下載
    串<b class='flag-5'>口中斷</b>服務函數(shù)的觸發(fā)

    STM32串口通信相關寄存器中斷回調(diào)函數(shù)

    (USART_CR1)控制寄存器 2 (USART_CR2)控制寄存器 3 (USART_CR3)串口配置串口初始化GPIO配置,開啟中斷中斷函數(shù)串口1
    發(fā)表于 12-28 19:11 ?7次下載
    STM32串口通信相關<b class='flag-5'>寄存器</b>和<b class='flag-5'>中斷</b>回調(diào)函數(shù)

    單片機工作寄存器作用 單片機常用專用寄存器

    除了通用寄存器(如累加、通用寄存器等),單片機中還會有特定功能的寄存器,如定時寄存器、
    的頭像 發(fā)表于 04-08 14:46 ?7679次閱讀

    U54內(nèi)核中斷控制和狀態(tài)寄存器

    中斷控制和狀態(tài)寄存器 Machine Status Register (mstatus) mstatus 寄存器跟蹤并控制 hart 的當前操作狀態(tài),包括是否啟用中斷。 通過設置 ms
    的頭像 發(fā)表于 10-08 09:54 ?1027次閱讀
    U54內(nèi)核<b class='flag-5'>中斷</b>控制和狀態(tài)<b class='flag-5'>寄存器</b>

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

    程序狀態(tài)寄存器的作用就是反映處理的狀態(tài)信息。在程序運行期間我們可以通過查看程序狀態(tài)寄存器的狀態(tài)位來進行程序的分支跳轉(zhuǎn)處理,或者我們可以設置程序狀態(tài)寄存器的模式位來改變處理
    的頭像 發(fā)表于 10-20 11:38 ?4791次閱讀
    CPSR<b class='flag-5'>寄存器</b>和APSR<b class='flag-5'>寄存器</b>的組成

    接口的控制與狀態(tài)寄存器什么作用

    接口的控制與狀態(tài)寄存器(Control and Status Registers,簡稱CSR)是計算機系統(tǒng)中用于控制和監(jiān)控硬件設備操作的寄存器。它們是硬件設備與其驅(qū)動程序之間的橋梁,允
    的頭像 發(fā)表于 10-17 10:42 ?536次閱讀