gpt4 book ai didi

c - 使用 read() 和指向缓冲区的指针从字符设备读取

转载 作者:太空狗 更新时间:2023-10-29 11:05:37 26 4
gpt4 key购买 nike

我正在开发一个 C 程序,它将在嵌入式 ARM GNU/Linux 系统的用户空间中运行。我需要从字符设备节点/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 返回的地址。

关于c - 使用 read() 和指向缓冲区的指针从字符设备读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com