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);
    

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

    评论

报告相同问题?

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?