我正在研究一个C程序,它将在embedded式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中的文件读取。
忽略阅读业务,printf生成SEGV的唯一原因是BUFF指向进程有效内存之外的某个地方。 所以使用printf(“%p”,buff)找出buff指向的地方,然后把它们在你的代码中直到你发现它什么时候停止指向malloc返回的地址。