问题描述
设置
我在zync-7000芯片的PL(可编程逻辑/ FPGA)侧上有一堆RAM。可以通过PL和PS(处理系统/ CPU)端访问该内存。该计划是让CPU加载大的GiB缓冲区并将其交给PL。
在修改设备树后,Linux会从RAM突发到RAM
当我修改设备树以便Linux可以看到ram时,我观察到了快速的读写速度; 硬件/固件能够突发读取/写入。
memory {
device_type = "memory";
// The 512 MiB memory at 0x60000000
reg = <0x0 0x40000000 0x60000000 0x20000000>;
};
mmap设备树内存
修改了设备树以防止linux使用RAM(因此可以将其用作PL的缓冲区)
memory {
device_type = "memory";
reg = <0x0 0x40000000>;
};
mmap即使在玩弄标志后也很慢
我尝试了几种设置mmap()
int* addr_start = mmap(NULL,mmap_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,address);
int* addr_start = mmap(NULL,MAP_PRIVATE | MAP_POPULATE,address);
尽管可靠,但在进行迭代-写入/读取测试时,它们都无法给出快速结果
// words_per_page is on the order of 2**20/4
case TEST_WRITE:
for( int ii=0; ii < words_per_page; ii++)
*waddr++=count++;
break;
case TEST_READ:
for( int ii=0; ii < words_per_page; ii++)
sum += *raddr++;
break;
问题
是否有任何用户空间方法可以创建直接突发到内存或从内存直接进行的事务?如果没有,相关的Linux内核链接将不胜感激。
解决方法
您绝对需要将区域映射为可缓冲的,以便最大化传输速度。您可能需要使用与/ dev / mem不同的设备驱动程序。
如果使用DMA到Zynq主机存储器,则更容易控制从可编程逻辑端的传输。在Zynq上,我发现一次需要8个最大长度的读取请求正在运行中,以最大化链接的吞吐量。
如果需要与用户空间保持高速缓存一致性,则需要使用ACP端口,以便处理器的高速缓存会监听来自可编程逻辑(PL)的内存写入。