Кто-то про в рамках LUFA и микроконтроллерах AVR?LUFA Время ожидания подключения к сети
У меня есть функция, которая строит таблицу (хранящуюся в памяти кучи) с 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.
Извините, что забыли упомянуть. Данные таблицы хранятся в памяти кучи. И, немного работая над своим кодом, я просто уменьшил большую таблицу до 256 байт, и эта же проблема все еще продолжается. Я думаю, что я не могу уменьшить ничего более. – JNeto06
PS: Я уже обновил свой вопрос с размером таблицы и типом хранения. Спасибо, что указали это. – JNeto06
ОК, похоже, что 256 байтов по-прежнему слишком велики. Возможно, для работы LUFA требуется более 256 байт. Действительно, вы должны получить свой компоновщик для создания файла карты, чтобы вы могли видеть, сколько оперативной памяти занято и почему. Вероятно, вы не должны использовать кучу; просто определите таблицу как глобальную переменную. Если вы используете кучу, убедитесь, что malloc не возвращает NULL. Интересно, почему вы еще не опубликовали код для определения/распределения таблицы, так как размер таблицы, по-видимому, является решающей частью вашей проблемы. –