我有一个 Terasic-SoCKIT(fpga 和 arm cortex a9),我在 HPS 上运行 Linux。我正在尝试访问内存映射 I/O,编写了一个带有函数“request_mem_region”和“ioremap”的简单字符驱动程序。
内存映射 IO 是 AXI 总线,我可以使用它向 FPGA 传输数据。我看到每次写入大约需要 6us,对于我的应用程序,我需要它小于 1us。此外,驱动程序在几次写入后停止写入映射的 IO(看不到 fpga 中的数据正在更改;驱动程序中的缓冲区是否已满??)。
问题是我是否遗漏了什么,或者因为写入是从虚拟地址到物理地址发生的,所以它不能再快了?如果从虚拟地址写入速度变慢,有没有办法加快速度?我知道,ARM 有一个 DMAC,但我还没有探索它。
谢谢你,卡西克
对不起,我没说我正在测量用户空间代码中的时间。后来查了一下驱动写入的时间,是纳秒级。所以,我认为大部分时间是从用户空间写入内核。
所以,我做了一些进一步的阅读并了解到 ioremap() 将物理地址映射到内核虚拟地址,而 remap_pfn_range() 将物理地址/IO 内存映射到用户虚拟空间(这就是我需要的;从用户写入 IO 内存空间)。我使用了简单的 mmap 示例 - http://web.cecs.pdx.edu/~jrb/ui/linux/examples.dir/simple/simple.c作为内核驱动程序。以下代码是我的用户空间代码:
using namespace std;
#include <iostream>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <ctime>
#define PAGE_SIZE 4096
#define HPS2FPGA_BRIDGE_BASE 0xc0000000
#define BLINK_OFFSET 0x0
volatile unsigned char *blink_mem;
void *bridge_map; …Run Code Online (Sandbox Code Playgroud)