我正在使用基于Technexion发行版的Angtsrom嵌入式Linux内核v.2.6.37。 DM3730 SoC,TDM3730模块,定制基板。 CodeSourcery toolchain v.2010-09.50
这是我系统中的数据流: http://i.stack.imgur.com/kPhKw.png
FPGA生成递增数据,内核通过GPMC DMA读取。 GPMC包大小= 512个数据样本。缓冲区大小= 61440 32位样本(= 60个ram页面)。
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但没有成功。我完全不了解这种行为:(
P.S。当我从内核使用copy_to_user()而不是mmap()和零拷贝访问时,就没有这样的行为。