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 に答える