Я изучаю, как общаться с USB-устройствами с помощью IOKit, и я написал этот фрагмент кода:
// Global variable
char *dataBuffer;
- (void)startPolling {
if (!shouldPoll) { // Prevent polling twice
shouldPoll = YES;
timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(poll) userInfo:nil repeats:NO];
[self performSelectorInBackground:@selector(poll) withObject:nil];
}
}
- (void)poll {
dataBuffer = (char *)malloc(numBytes);
numBytes = 64;
returnCode = (*usbInterface)->ReadPipe(usbInterface, 2, dataBuffer, &numBytes);
// Handle received data in dataBuffer
free(dataBuffer);
[timer fire];
}
Работает это так: другая часть кода, которая работает нормально, ищет устройство, открывает его, а затем открывает нужный интерфейс. После этого, когда пользователь нажимает кнопку, он вызывает startPolling
, который устанавливает таймер, запускающий метод poll
каждые 0,5 секунды (вроде как, таймер будет срабатывать снова и снова).
В методе poll
программа будет считывать канал USB и сохранять данные на dataBuffer
. Сначала я думал, что могу выделить его память один раз и повторно использовать указатель на каждой итерации, но по незнакомым мне причинам второй вызов ReadPipe
завершится ошибкой. Всегда.
В отчаянии я придумал эту (ужасную?) идею: выделять и освобождать буферную память на каждой итерации. К моему удивлению, это сработало, и я смог успешно прочитать устройство.
Проблема в том, что время от времени программа вылетает с ошибкой:
malloc: *** error for object 0x610000005890: Heap corruption detected, free list canary is damaged
*** set a breakpoint in malloc_error_break to debug
Я действительно не знаю, что это значит, не говоря уже о том, как это решить. Я установил размер буфера равным 64, чтобы убедиться, что любые прочитанные данные поместятся в памяти. Фактические данные имеют длину 18 байт.
Любые подсказки?