USBHostのメモリ使用量 節約方法

青mbed用のライブラリでUSBHostがあり、キーボードやマウスなどを青mbedに接続して使うことができます。

USB Hubにも対応していたりと大変ありがたいことなのですが、USB Hostの機能を使用すると メモリが12KB程度使われてしまい、他にもスレッドを建てたりするとすぐメモリ不足に陥ってしまうことがわかりました。

USB Host機能を使用しつつも、メモリ使用量を削減できないか調査を行いました。

メモリ使用量の推定

まずはUSB Hostに関連するクラスのサイズを調べてみました。

include the mbed library with this snippet

  pc.printf("USBEndpoint\t%d byte\r\n",sizeof(USBEndpoint));
    pc.printf("USBHostHub\t%d byte\r\n",sizeof(USBHostHub));
    pc.printf("INTERFACE\t %d byte\r\n",sizeof(INTERFACE));
    pc.printf("HubDescriptor %d\r\n",sizeof(HubDescriptor));
    pc.printf("USBDeviceConnected %d\r\n",sizeof(USBDeviceConnected));

結果は以下の通りです。

  • USBEndpoint 108byte
  • USBHostHub 56byte
  • INTERFACE 56byte
  • HubDescriptor 10byte
  • USBDeviceConnected 252byte

USBEndpointと、USBDeviceConnected が大きめですね。

さらに、USBHost.h の240行目あたりに

include the mbed library with this snippet

   USBEndpoint  endpoints[MAX_ENDPOINT];
   ~中略~
    // devices connected
    USBDeviceConnected devices[MAX_DEVICE_CONNECTED];

とあります。 標準では MAX_ENDPOINT=60, MAX_DEVICE_CONNECTED=5,となっていますので この部分だけで7KB近く使われることになります。

青mbedは利用可能なメモリが32KBなので、この部分を削ってやればメモリ使用量を削減できることが分かります。

実際どうやるの

  • USBデバイスを一つしか接続しないのであれば、 MAX_DEVICE_CONNECTED を 1にする
  • MAX_HUB_NBを0 にする(USBHostHub.h 内で USBDeviceConnected * MAX_HUB_PORT が宣言されています)
  • インターフェース数、インターフェースごとのエンドポイント数も既知であれば、 数値を調節する

結果

空きメモリが3KB程度だったプログラムが、 上記の対策を行うことで12KB程度まで空き容量が増えました! 今のところ問題なく動いていますので、USB Host使用時にメモリ不足で苦しんでいる方は試してみてはいかがでしょうか。

 
       //メモリ空き容量チェック。メモリ割り当てに失敗したら
    //HardFaultで落ちるので、その直前までの結果を空き容量とする
    int blockSize = 64;
    while (true) {
        char *p = (char *) malloc(blockSize);
        if (p != NULL) {
            free(p);
            pc.printf("Allocated! %d\r\n",blockSize);
            blockSize = blockSize + 64;
        }
    }


Please log in to post comments.