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 を使用しています。