LUFA USB连接超时

时间:2015-07-23 20:24:12

标签: usb avr hid atmega16

LUFA框架和AVR微控制器的专业人员?

我有一个构建一个表(存储在堆内存中)的函数,在我的Usb连接上接收到256个元素,程序需要很长时间来生成我的USB连接断开的表(当你拔掉一个电源时,我会听到Windows的声音)设备)。我在while循环中的HID_Device_USBTask()和USB_USBTask()函数之后调用了这个函数,但是你可以想象,它不能正常工作。

当我调用函数来计算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 个答案:

答案 0 :(得分:0)

ATmega16U2只有512字节的RAM。您没有显示表的定义,但我认为假设您的表占用整个RAM是安全的。你的链接器没有给你一个关于此的警告太糟糕了。你必须得到一个更好的微控制器(比如ATmega32U4)或者让你的桌子更小。

请记住,默认情况下,大多数本地和全局变量都存储在RAM中,因此您不能简单地用完表中的所有RAM。