2015-07-23 3 views
0

Кто-то про в рамках 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.

ответ

0

ATmega16U2 имеет только 512 байт ОЗУ. Вы не указали определение своей таблицы, но я думаю, что можно с уверенностью предположить, что ваша таблица занимает всю оперативную память. Жаль, что ваш линкер не дал вам предупреждения об этом. Вам нужно будет получить лучший микроконтроллер (например, ATmega32U4) или уменьшить размер таблицы.

Помните, что большинство локальных и глобальных переменных сохраняются в ОЗУ по умолчанию, поэтому вы не можете просто использовать всю ОЗУ для своей таблицы.

+0

Извините, что забыли упомянуть. Данные таблицы хранятся в памяти кучи. И, немного работая над своим кодом, я просто уменьшил большую таблицу до 256 байт, и эта же проблема все еще продолжается. Я думаю, что я не могу уменьшить ничего более. – JNeto06

+0

PS: Я уже обновил свой вопрос с размером таблицы и типом хранения. Спасибо, что указали это. – JNeto06

+0

ОК, похоже, что 256 байтов по-прежнему слишком велики. Возможно, для работы LUFA требуется более 256 байт. Действительно, вы должны получить свой компоновщик для создания файла карты, чтобы вы могли видеть, сколько оперативной памяти занято и почему. Вероятно, вы не должны использовать кучу; просто определите таблицу как глобальную переменную. Если вы используете кучу, убедитесь, что malloc не возвращает NULL. Интересно, почему вы еще не опубликовали код для определения/распределения таблицы, так как размер таблицы, по-видимому, является решающей частью вашей проблемы. –

Смежные вопросы