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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

FPGA技術(shù)江湖 ? 來(lái)源:網(wǎng)絡(luò)交換FPGA ? 2023-01-29 15:16 ? 次閱讀

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

DMA寫(xiě)重復(fù)啟動(dòng)

我們?cè)赪indows下使用WDF框架開(kāi)發(fā)PCIe驅(qū)動(dòng)的DMA讀寫(xiě)功能。驅(qū)動(dòng)要啟動(dòng)一次DMA傳輸包括兩個(gè)步驟

初始化DMA傳輸對(duì)象

執(zhí)行DMA傳輸

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

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

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

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

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

圖1 DebugMonito監(jiān)測(cè)

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

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

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

驅(qū)動(dòng)的中斷狀態(tài)機(jī)

為了方便調(diào)試,我們?cè)谥袛嗵幚沓绦蛑刑砑恿嗽S多關(guān)鍵的調(diào)試日志信息,結(jié)果在其中發(fā)現(xiàn)了端倪。

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

圖2 日志打印記錄

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

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

審核編輯:湯梓紅

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

    關(guān)注

    31

    文章

    5295

    瀏覽量

    119837
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8451

    瀏覽量

    150731
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3521

    瀏覽量

    88320
  • PCIe
    +關(guān)注

    關(guān)注

    15

    文章

    1200

    瀏覽量

    82355
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    558

    瀏覽量

    100348

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

文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-控制傳輸中斷相關(guān)寄存器

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

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

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

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

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

    求教:關(guān)于DM8168的PCIe寄存器

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

    如何選擇51單片機(jī)的中斷寄存器

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

    中斷寄存器有哪幾種類型

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

    51單片機(jī)與中斷相關(guān)的寄存器

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

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

    (指南者)(二)寄存器、定時(shí)中斷寄存器定時(shí)時(shí)鐘定時(shí)寄存器0110代碼例程定時(shí)
    發(fā)表于 12-23 19:19 ?0次下載
    (指南者)(二)<b class='flag-5'>寄存器</b>、定時(shí)<b class='flag-5'>器</b>和<b class='flag-5'>中斷</b>

    STC學(xué)習(xí):中斷相關(guān)寄存器

    中斷允許寄存器IE、IE2和INT_CLKOIE:中斷允許寄存器(可位尋址)SFR namebitB7B6B5B4B3B2B1B0IEnameEAELVDEADCESET1EX1ET0
    發(fā)表于 12-23 19:50 ?0次下載
    STC學(xué)習(xí):<b class='flag-5'>中斷</b>相關(guān)<b class='flag-5'>寄存器</b>

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

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

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

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

    單片機(jī)工作寄存器作用 單片機(jī)常用專用寄存器

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

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

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

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

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

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

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