我正在开发一个运行在嵌入式ARM GNU/Linux系统用户空间的C程序。我需要从字符设备节点/dev/fpga_sram读取数据。在C程序中,已经使用malloc分配了一个缓冲区,如下所示。
uint16_t *buff;
uint32_t num = 4194304 * 3;
buff = (uint16_t *)malloc(num * sizeof(uint16_t));
使用read()函数,我想将数据读入缓冲区的特定索引中,如下面代码片段所示。
int ret;
int fd;
int ptr_loc;
ptr_loc = 0;
fd = open("/dev/fpga_sram", O_RDONLY);
ret = read(fd, &(buff[ptr_loc]), 4194304 * sizeof(uint16_t));
close(fd);
我想这样做的原因是因为缓冲区需要在不同时间从设备节点/dev/fpga_sram中填充不同的读取。缓冲区大小大于读取的总字节数,因此我预计将ptr_loc分配给另一个索引,如下所示。
ptr_loc = 4194304;
fd = open("/dev/fpga_sram", O_RDONLY);
ret = read(fd, &(buff[ptr_loc]), 4194304 * sizeof(uint16_t));
close(fd);
然而,当我尝试访问缓冲区中存储的数据时,我收到了一个段错误:
printf("i = 0, data = %u\n", buff[0]); // this line of code causes segfault
我在这里做错了什么?是否可能使用指向缓冲区位置的指针从设备节点读取数据?我认为从设备节点读取数据类似于在GNU/Linux中从文件中读取数据。
read()
操作吗?如果ptr_loc > 1
,看起来你是这样做了。 - Daveret = read(fd, buff, 4194304 * sizeof(uint16_t))
可以正常工作,但读取将从缓冲区的开头开始。 - Nicholas Kinar(4<<20)*2
才会出现问题。 - Dave