Чтение с устройства char с использованием read () с указателем на буфер - PullRequest
3 голосов
/ 15 января 2012

Я работаю над программой на 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.

1 Ответ

4 голосов
/ 15 января 2012

Не обращая внимания на бизнес чтения, единственная причина, по которой printf создает SEGV, заключается в том, что положительный эффект указывает где-то за пределами действительной памяти процесса.Поэтому используйте printf ("% p", buff) и узнайте, куда указывает buff, и добавляйте их в свой код, пока не узнаете, когда он перестанет указывать на адрес, возвращенный malloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...