避免DMA缓冲错误
- 更新时间2025-05-20
- 阅读时长4分钟
DMA缓冲区可存储的元素数量(通常称为缓冲区深度)为设计鲁棒性应用的重要部分。缓冲区的元素数量对应用产生下列影响:
- 如缓冲区过小,读取和移除数据前缓冲区就被占满。即产生溢出。写入缓冲区的全部数据将丢失。
- 如缓冲区过大,它将占用FPGA和/或主控计算机的资源,这将降低应用的性能。
- 尝试从缓冲区读取超出缓冲区范围的元素时将产生下溢,且LabVIEW返回错误。
如要设计鲁棒性的应用,NI建议:
- 正确设置缓冲区的大小
- 设计应用程序检测并避免缓冲溢出
- 设计应用程序检测并避免缓冲下溢
- 设计应用程序避免在缓冲区累积并形成过期数据
下列场景提供了更多的策略信息。
正确设置缓冲区大小
下表介绍了组成DMA通道的两个缓存、如何配置缓存的大小、推荐的缓存大小及每个缓存的最大容量。
| 缓存的位置 | 如何配置 | 默认缓存容量 | 推荐缓存容量 | 最大缓存容量 |
|---|---|---|---|---|
| FPGA终端 | FIFO属性对话框的通用页面 | 1023个元素 | 1023个元素多数应用均无需更改FPGA缓存的大小。 | 取决于FPGA上的可用资源数及主机内存分配的字节数。如FPGA资源不足以处理指定的元素数量,FPGA VI编译将失败。关于DMA FIFO大小限制的详细信息,见指定FPGA终端的硬件文档。 |
| 主控计算机 | “调用方法”函数的“FIFO.配置”方法 | 10000个元素或2倍FPGA FIFO缓冲的大小,取两者中的较大者 | 指定待读取或写入元素数量的5倍 | 取决于FPGA上的可用资源数及主机内存分配的字节数。如FPGA资源不足以处理指定的元素数量,FPGA VI编译将失败。关于DMA FIFO大小限制的详细信息,见指定FPGA终端的硬件文档。 |
检测和避免缓冲溢出
使用FIFO方法节点的“获取待写入元素数量”方法可检测是否产生了缓冲溢出。该方法返回用户可写入数据的缓冲区的可用空元素数量。如该值为零则表示缓冲区已满;如继续写入数据至缓冲区可能导致数据丢失。
使用下列技术避免缓冲溢出:
- 降低用户写入缓冲区数据的速率。
- 增加主机上待读取的请求的元素数量。
- 增加主机读取数据的速率。
- 增加主机缓存容量、FPGA缓存容量或两者
- 降低主机CPU的处理负荷。CPU的速率及其当前的计算任务将降低从主机缓存至应用内存传输数据的速率。
检测和避免缓冲下溢
使用FIFO方法节点的“获取待读取元素数量”方法可检测是否产生了缓冲下溢。该方法返回可读取的缓存元素数量。如该数量小于用户从缓存中读取的元素数量,读取缓冲区可能导致缓冲区超时。
如要检测何时产生缓存下溢,可检查“FIFO.读取”方法是否发生错误–50400,如下图所示:
上述任一情况发生时,用户可能需要执行停止应用程序等类似的操作。产生溢出或下溢时,用户可使用配置为或的复合运算函数停止FPGA VI和主控VI的执行。
通过下列技术避免缓冲下溢:
- 增加“FIFO.读取”方法的的超时。
- 降低主机读取数据的速率。
- 通过减少连线至“FIFO.读取”函数的元素数量控件的值,减少VI从缓冲区读取的元素数量。
防止在缓冲区累积数据,形成过期数据
在FPGA终端执行VI、停止和重新启动VI时不会重置缓存。即下次运行FPGA VI时,数据仍保存在缓冲区内。
通过下列技术清空缓存:
- 重置FPGA VI
- 刷新缓存以读取FIFO中的剩余元素。