1

我正在使用基于 Technexion 发行版的 Angtsrom 嵌入式 linux 内核 v.2.6.37。DM3730 SoC、TDM3730 模块、定制基板。CodeSourcery 工具链 v. 2010-09.50

这是我系统中的数据流:http: //i.stack.imgur.com/kPhKw.png

FPGA 生成递增数据,内核通过 GPMC DMA 读取它。GPMC 包大小 = 512 个数据样本。缓冲区大小 = 61440 个 32 位样本(=60 个内存页)。

DMA 缓冲区由 dma_alloc_coherent 分配并通过 mmap() 调用映射到用户空间。用户应用程序直接从 DMA 缓冲区读取数据并使用 fwrite() 调用保存到 NAND。用户一次读取 4096 个样本数据。

我在文件中看到了什么?http://i.stack.imgur.com/etzo0.png 红线表示环形缓冲区的第一个边界。哎呀!小包(约 16 个样本)在边框后开始隐藏。它们的值是准确的 = 相应缓冲区位置的“旧”值。但为什么?16 个样本远小于 DMA 包大小和用户读取包大小,因此不会出现指针不匹配。

我想有一些 mmap() 功能隐藏在某处。我为 mmap() 尝试了不同的标志 - 例如 MAP_LOCKED、MAP_POPULATE、MAP_NONBLOCK,但没有成功。我完全误解了这种行为:(

PS 当我从内核使用 copy_to_user() 而不是 mmap() 和零拷贝访问时,没有这样的行为。

4

0 回答 0