LUFA USB 连接超时

LUFA USB Connection Timeout

有人精通 LUFA 框架和 AVR 微控制器吗?

我有一个函数可以构建一个 table(存储在堆内存中),在我的 USB 连接上接收到 256 个元素,程序需要很长时间才能生成这个 table,我的 USB 连接断开了(当您拔下设备时,我会听到 Windows 的声音)。我在 while 循环内的 HID_Device_USBTask() 和 USB_USBTask() 函数之后调用了这个函数,但正如您所想象的那样,它并没有很好地工作。

当我调用函数来计算数据的 256 个元素时,这种情况变得更糟。

我就是这么做的:我收到一个 8 字节的数据块,并将每个块附加到我的大屁股上 table!我的代码适用于 16 个字节左右的短 tables,但适用于 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。

ATmega16U2只有512字节的RAM。您没有显示 table 的定义,但我认为可以安全地假设您的 table 占用了整个 RAM。很遗憾你的链接器没有给你警告。您必须获得更好的微控制器(如 ATmega32U4)或使您的 table 更小。

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