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。
答案 0 :(得分:0)
ATmega16U2只有512字节的RAM。您没有显示表的定义,但我认为假设您的表占用整个RAM是安全的。你的链接器没有给你一个关于此的警告太糟糕了。你必须得到一个更好的微控制器(比如ATmega32U4)或者让你的桌子更小。
请记住,默认情况下,大多数本地和全局变量都存储在RAM中,因此您不能简单地用完表中的所有RAM。