读写数据量不大,尤其是写。但是对实时性要求比较高。
win10/11,xilinx的ZYNQ7015的开发板,XDMA的驱动,H2C0写,C2H0读,小数据量读写,每次读或者写都要差不多70us(写一般只有几十个字节,读固定4096字节,重复256次,取平均时间)。增加数据长度的话时间延长不大。时间是用std::chrono来测量的,逻辑分析仪上抓波形得到的时间也基本与此一致。
用user进行几十个字节的数据量的写,似乎写的时间可以大幅降低。DMA反而比user还慢?
从这两点上来看,似乎时间不是消耗在了数据传输上。这个也不像TCPIP那样需要几次握手什么的,感觉纯粹就是准备DMA的过程消耗了比较多的时间。
以写为例,驱动这边(代码就不贴了,只说大概流程)EvtIoWriteDma这里,GetQueueContext,WdfDmaTransactionInitializeUsingRequest之后就是WdfRequestMarkCancelableEx这几个函数准备DMA,紧接着就WdfDmaTransactionExecute,EnginePollTransfer传输数据。
不知道这种现象算不算正常,有没有改善的思路?
zynq7015,PCIE读写延时偏大
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
25条回答 默认 最新
- 阿里嘎多学长 2024-09-10 16:33关注
获得0.30元问题酬金 AIGC生成:
Zynq7015 PCIe 读写延时偏大解决方案
你遇到的问题是 Zynq7015 开发板上的 PCIe 读写延时偏大,特别是在写操作中。为了解决这个问题,我们需要分析可能的原因和解决方案。
可能的原因
- XDMA 驱动的实现问题:XDMA 驱动可能存在实现问题,导致 PCIe 读写延时偏大。
- PCIe 总线的带宽限制:PCIe 总线的带宽限制可能会导致读写延时偏大。
- Zynq7015 处理器的性能限制:Zynq7015 处理器的性能限制可能会导致读写延时偏大。
解决方案
- 优化 XDMA 驱动:可以尝试优化 XDMA 驱动的实现,例如使用 DMA 的批量传输机制来提高传输速度。
- 优化 PCIe 总线配置:可以尝试优化 PCIe 总线的配置,例如使用 PCIe 3.0 的总线来提高传输速度。
- 优化 Zynq7015 处理器的配置:可以尝试优化 Zynq7015 处理器的配置,例如使用高性能的处理器核心来提高处理速度。
示例代码
以下是一个使用 XDMA 驱动实现 PCIe 读写操作的示例代码:
#include <xdma.h> #include <pcie.h> int main() { // 初始化 XDMA 驱动 xdma_init(); // 配置 PCIe 总线 pcie_config_t config; config.burst_size = 128; config.transfer_size = 1024; pcie_config(&config); // 读取数据 uint32_t data[1024]; xdma_read(data, 1024); // 写入数据 uint32_t write_data[1024]; xdma_write(write_data, 1024); // 关闭 XDMA 驱动 xdma_close(); return 0; }
示例输入和示例输出
输入:读取 1024 字节的数据
输出:读取的数据
流程图
以下是一个 PCIe 读写操作的流程图:
graph LR A[读取数据] -->|XDMA|> B[DMA 读取数据] B -->|PCIe|> C[PCIe 总线传输数据] C -->|Zynq7015|> D[处理器处理数据] D -->|XDMA|> E[DMA 写入数据] E -->|PCIe|> F[PCIe 总线传输数据] F -->|Zynq7015|> G[处理器处理数据]
希望这个解决方案能够帮助你解决 PCIe 读写延时偏大的问题。
解决 无用评论 打赏 举报
悬赏问题
- ¥30 关于#java#的问题,请各位专家解答!
- ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
- ¥20 pcf8563时钟芯片不启振
- ¥20 pip2.40更新pip2.43时报错
- ¥15 换yum源但仍然用不了httpd
- ¥50 C# 使用DEVMOD设置打印机首选项
- ¥15 麒麟V10 arm安装gdal
- ¥20 OPENVPN连接问题
- ¥15 flask实现搜索框访问数据库
- ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备