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。
有人精通 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。