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。