我正在开发一个C程序,它将在嵌入式ARM GNU / Linux系统的用户空间中运行。我需要从char设备节点/ 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中的文件读取。
答案 0 :(得分:4)
忽略阅读业务,printf产生SEGV的唯一原因是buff指向进程有效内存之外的某个位置。因此,使用printf(“%p”,buff)并找出buff所指向的位置,并将其洒在代码中,直到找到它何时停止指向malloc返回的地址为止。