Vinx911 2016-06-23 12:58 采纳率: 0%
浏览 2051

DMA传输后,拷贝DMA缓冲区数据时出错

Windows下 WDM 驱动
应用程序需要读取PCI卡(PCI9054)的数据
在驱动的读请求处理例程中
1、启动DMA传输将卡中的数据读取到驱动的缓冲区A中,
2、然后将数据复制到读请求的缓冲区B,
3、并将缓冲区A中的最后四个字节记录到缓冲区C中。

为了调试方便,我将缓冲区A初始化为“#”
现在的问题是:
读请求处理完成后,缓冲区B中的数据有时候会是“#”,而缓冲区C中的数据是对的
在第2步之前加1ms的延时,出错的概率会减小

  • 写回答

1条回答 默认 最新

  • 幸福快乐fyf 2023-07-01 18:58
    关注

    根据您的描述,问题可能是由于DMA传输完成后,缓冲区B中的数据有时候会是初始化的"#"字符,而不是从缓冲区A正确复制过来的数据。为了解决这个问题,您可以尝试以下几个步骤:

    1. 确保DMA传输完成后再进行数据复制:在驱动的读请求处理例程中,确保DMA传输已经完成后再进行数据复制操作。您可以使用相应的DMA传输完成中断或者查询DMA传输状态的方式来确认。
    1. 检查数据复制的逻辑:确保在将数据从缓冲区A复制到缓冲区B时,使用正确的指针和长度进行数据复制操作。可以使用memcpy或者类似的函数来进行内存复制。
    1. 确保缓冲区A的数据正确:在启动DMA传输前,确保缓冲区A中的数据是正确的,而不是初始化的"#"字符。可以使用memset或者其他方式将缓冲区A初始化为0或其他有效数据。
    1. 考虑添加适当的延时:如果在第2步之前添加1ms的延时可以减小错误的概率,那么可以尝试增加适当的延时来确保DMA传输完成后再进行数据复制操作。您可以使用操作系统提供的延时函数或者定时器来实现延时。

    下面是一个示例代码片段,展示了如何在驱动的读请求处理例程中进行数据复制操作:

    // 确保DMA传输完成后再进行数据复制
    wait_for_dma_transfer_complete();
    
    // 复制数据从缓冲区A到缓冲区B
    memcpy(buffer_B, buffer_A, buffer_length);
    
    // 记录缓冲区A中的最后四个字节到缓冲区C
    memcpy(buffer_C, buffer_A + (buffer_length - 4), 4);
    

    请注意,以上代码仅为示例,您需要根据您的具体情况进行适当的修改和调整

    评论

报告相同问题?

悬赏问题

  • ¥15 链接问题 C++LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接