0

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。

4

1 回答 1

0

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

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

于 2015-07-23T20:30:11.290 回答