LUFA USB-соединение истекло
Кто-то про в фреймворке LUFA и микроконтроллерах AVR?
У меня есть функция, которая создает таблицу (хранящуюся в динамической памяти) с 256 элементами, полученными по моему соединению USB, и программа занимает много времени, чтобы сгенерировать эту таблицу, которая ломает мое соединение USB (я слышу звук Windows, когда вы отключаете устройство). Я вызываю эту функцию после того, как функции HID_Device_USBTask() и USB_USBTask() внутри цикла while, но, как вы можете себе представить, это не сработало.
Эта ситуация ухудшается, когда я вызываю функцию для вычисления 256 элементов данных.
Вот что я делаю: я получаю блок из 8 байтов данных и добавляю каждый блок в свою таблицу с большой задницей! Мой код работает с короткими таблицами, такими как 16 байтов или около того, но с большой таблицей, такой как 256 байтов, он идет в ад!
Похоже, что на USB-коннекте он запустил тайм-аут или что-то.
Вот мой псевдокод:
uint8_t *p_data_to_save = NULL;
uint8_t *p_data_to_host = NULL;
int main(void)
{
p_data_from_host = (uint8_t*)calloc(8, sizeof(uint8_t));
p_data_to_save = (uint8_t*)calloc(256, sizeof(uint8_t));
SetupHardware();
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
GlobalInterruptEnable();
for (;;)
{
HID_Device_USBTask(&Generic_HID_Interface);
USB_USBTask();
if (new_bytes_recived == true )
{
// Append 8 bytes received to my 256 bytes table
if(indx_data < 255)
{
for(int i=0; i<8; i++)
{
p_data_to_save[indx_data] = p_data_from_host[i];
indx_data++;
}
}
new_bytes_recived = false;
}
if(table_completed == true)
{
// Process the 256 bytes of data
Process_table();
}
(...) // other smal if-cases
}
free(p_data_from_host);
p_data_to_host=NULL;
free(p_data_to_save);
p_data_to_save=NULL;
}
В CALLBACK_HID_Device_ProcessHIDReport():
void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
const uint8_t ReportID,
const uint8_t ReportType,
const void* ReportData,
const uint16_t ReportSize)
{
unsigned int i;
uint8_t* Data = (uint8_t*)ReportData;
for (i=0;i<8;i++)
{
p_data_from_host[i]=Data[i];
}
new_bytes_recived = true;
}
Любое решение этого?
Спасибо вам всем
PS: я использую Atmega16u2.
1 ответ
ATmega16U2 имеет только 512 байт оперативной памяти. Вы не показали определение своей таблицы, но я думаю, можно с уверенностью предположить, что ваша таблица занимает всю оперативную память. Жаль, что ваш компоновщик не предупредил вас об этом. Вам нужно будет приобрести лучший микроконтроллер (например, ATmega32U4) или уменьшить размер своего стола.
Имейте в виду, что большинство локальных и глобальных переменных хранятся в оперативной памяти по умолчанию, поэтому вы не можете просто использовать всю оперативную память для своей таблицы.