設計上の考慮事項¶
Design Considerations
オーディオデータ形式に応じて、可逆、非可逆、または圧縮される場合があります。 WAV、MP3、またはFLACと、サンプリングレートとビットレートで表される品質の場合、プロジェクトには、メモリ、ストレージスペース、入出力スループット、処理能力など、さまざまなリソースが必要になります。 リソースは、プロジェクトの種類とプロジェクトの設計で説明されている機能によっても異なります。
Depending on the audio data format, that may be lossless, lossy or compressed, e.g. WAV, MP3 or FLAC and the quality expressed in sampling rate and bitrate, the project will require different resources: memory, storage space, input / output throughput and the processing power. The resources will also depend on the project type and features discussed in Project Design.
このセクションでは、必要なデータ形式、オーディオ品質、および機能を満たすようにオーディオプロジェクトを設計するときに考慮する必要がある、ESP32システムリソースの容量とパフォーマンスについて説明します。
This section describes capacity and performance of ESP32 system resources that should be considered when designing an audio project to meet required data format, audio quality and functionality.
メモリ¶
Memory
予備の内部データRAMは、「hello_world」の例で約290kBです。 オーディオシステムの場合、これでは不十分な場合があるため、ESP32には最大4MBの外部SPI RAM(つまり、PSRAM)メモリを使用する機能が組み込まれています。 外部メモリはメモリマップに組み込まれており、特定の制限内で、内部データRAMと同じように使用できます。
The spare internal Data-RAM is about 290kB with “hello_world” example. For audio system this may be insufficient, and therefore the ESP32 incorporates the ability to use up to 4MB of external SPI RAM (i.e. PSRAM) memory. The external memory is incorporated in the memory map and is, within certain restrictions, usable in the same way internal Data-RAM is.
詳細については、IDFドキュメントの外部SPI接続RAMセクションを参照してください。特に、非常に重要な制限セクションに注意してください。
Refer to External SPI-connected RAM section in IDF documenation for details, especially pay attention to its Restrictions section which is very important.
PSRAMを使用できるようにするには、ボードにインストールされている場合、menucofigの[Component config] > [ESP32-specific] > [SPI RAMconfig]で有効にする必要があります。 同じメニューでデフォルトで設定されているオプションCONFIG_SPIRAM_CACHE_WORKAROUNDは、有効のままにしておく必要があります。
To be able to use the PSRAM, if installed on your board, it should be enabled in menucofig under Component config > ESP32-specific > SPI RAM config. The option CONFIG_SPIRAM_CACHE_WORKAROUND, set by default in the same menu, should be kept enabled.
Note
BluetoothとWi-Fiは、オーディオアプリケーションに十分なメモリを残さないため、PSRAMなしでは共存できません。
Bluetooth and Wi-Fi can not coexist without PSRAM because it will not leave enough memory for an audio application.
内部RAMの最適化とPSRAMの使用¶
Optimization of Internal RAM and Use of PSRAM
PSRAMにはいくつかの制限があるため、内部RAMはより価値のある資産です。 内部RAMを最適化するためのヒントをいくつか紹介します。
Internal RAM is more valuable asset since there are some restrictions on PSRAM. Here are some tips for optimizing internal RAM.
- PSRAMを使用している場合は、[コンポーネントの構成] > [Wi-Fi]ですべての静的バッファーを最小値に設定します。 PSRAMを使用しない場合は、メモリを節約するために動的バッファを選択する必要があります。 詳細については、IDFドキュメントの「Wi-Fiバッファの使用」セクションを参照してください。
If PSRAM is in use, set all the static buffer to minimum value in Component config > Wi-Fi; if PSRAM is not used then dynamic buffer should be selected to save memory. Refer to Wi-Fi Buffer Usage section in IDF documentation for details.
- PSRAMとBTを使用する場合は、CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRSTとCONFIG_BT_BLE_DYNAMIC_ENV_MEMORYを[Component config] > [Bluetooth] > [Bluedroid Enable]で「yes」に設定して、より多くの40kBメモリをPSRAMに割り当てる必要があります。
If PSRAM and BT are used, then CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST and CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY should be set as “yes” under Component config > Bluetooth > Bluedroid Enable, to allocate more of 40kB memory to PSRAM
- PSRAMとWi-Fiを使用する場合は、[コンポーネント構成] > [ESP32固有] > [SPI RAM構成]でCONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRSTを「yes」に設定して、PSRAMにメモリを割り当てる必要があります。
If PSRAM and Wi-Fi are used, then CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST should be set as “yes” under Component config > ESP32-specific > SPI RAM config, to allocate some memory to PSRAM
- [コンポーネント構成] > [ウェアレベリング]でCONFIG_WL_SECTOR_SIZEを512に設定します
Set CONFIG_WL_SECTOR_SIZE as 512 in Component config > Wear Levelling
Note
セクターのサイズが小さいほど、書き込み/読み取り速度が遅くなり、その逆も同様ですが、サポートされるのは512と4096のみです。
The smaller the size of sector be, the slower the Write / Read speed will be, and vice versa, but only 512 and 4096 are supported.
- PSRAMを使用するには
malloc(1024 * 10)
ではなくchar *buf = heap_caps_malloc(1024 * 10, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT)
を呼び出し、内部RAMを使用するにはchar *buf = heap_caps_malloc(512, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
を呼び出します。Call
char *buf = heap_caps_malloc(1024 * 10, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT)
instead ofmalloc(1024 * 10)
to use PSRAM, and callchar *buf = heap_caps_malloc(512, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
to use internal RAM. - PSRAMを自動的に割り当てるために
malloc()
に依存しないことで、メモリを完全に制御できます。 他のmalloc()
呼び出しによる内部RAMの使用を回避することにより、PSRAMをタスクスタックメモリとして使用できないため、高効率の使用とタスクスタックのためにより多くのメモリを予約できます。Not relying on
malloc()
to automatically allocate PSRAM allows to make a full control of the memory. By avoiding the use of the internal RAM by othermalloc()
calls, you can reserve more memory for high-efficiency usage and task stack since PSRAM cannot be used as task stack memory. - タスクスタックは常に内部RAMに割り当てられます。 一方、PSRAM上のスタックでタスクを作成できる
xTaskCreateStatic()
関数を使用できます(PSRAMおよびFreeRTOS menuconfigのオプションを参照)が、そのヘルプ情報に注意してください。The task stack will always be allocated at internal RAM. On the other hand you can use of the
xTaskCreateStatic()
function that allows to create tasks with stack on PSRAM (see options in PSRAM and FreeRTOS menuconfig), but pay attention to its help information.
Important
xTaskCreateStatic
タスクでROMコードを使用しないでください:ROMコード自体はcomponents/esp32/ld/esp32.rom.ld
にリンクされています。 ただし、Wi-FiライブラリやBluetoothライブラリなど、ROM関数を呼び出す他のコードや、CONFIG_SPIRAM_CACHE_WORKAROUNDパッチに対して再コンパイルされないコードも考慮する必要があります。 一般に、これはIDFライブラリ(libcを含む)を呼び出さないスレッドでのみ使用し、計算のみを実行し、FreeRTOSプリミティブを使用して他のスレッドと通信することをお勧めします。
Don’t use ROM code inxTaskCreateStatic
task: The ROM code itself is linked incomponents/esp32/ld/esp32.rom.ld
. However, you also need to consider other pieces of code that call ROM functions, as well as the code that is not recompiled against the CONFIG_SPIRAM_CACHE_WORKAROUND patch, like the Wi-Fi and Bluetooth libraries. In general, we advise using this only in threads that do not call any IDF libraries (including libc), doing only calculations and using FreeRTOS primitives to talk to other threads.
コンポーネント別のメモリ使用量の概要¶
Memory Usage by Component Overview
以下は、ESP-ADFコンポーネントとそのメモリ使用量を含む表です。 必要なコンポーネントを選択し、残りの内部RAMの量を調べます。 PSRAMを使用するかどうかに関係なく、テーブルは2つの部分に分かれています。 PSRAM(外部RAM)が使用されている場合、メモリの一部はPSRAMに自動的に割り当てられます。
Below is a table that contains ESP-ADF components and their memory usage. Choose the components needed and find out how much internal RAM is left. The table is divided into two parts, when PSRAM is used or not. If PSRAM (external RAM) is in use, then some of the memory will be allocated at PSRAM automatically.
初期のスペア内部RAMは290kBです。
The initial spare internal RAM is 290kB.
成分
Component |
必要な内部RAM
Internal RAM Required |
|
---|---|---|
PSRAMは使用されていません
PSRAM not used |
PSRAM付き
With PSRAM |
|
Wi-Fi 1 | 50kB+ | 50kB+ |
Bluetooth | 140kB (50kB if only BLE needed) | 95kB (50kB if only BLE needed) |
Flash Card 2 | 12kB+ | 12kB+ |
I2S 3 | 構成可能、参照用8kB
Configurable, 8kB for reference |
構成可能、参照用8kB
Configurable, 8kB for reference |
RingBuffer 4 | 構成可能、参照用30kB
Configurable, 30kB for reference |
0kB、すべてPSRAMに移動
0kB, all moved into PSRAM |
上記の表の注
Notes to the table above
- Wi-Fiのmenuconfigによると、各TxおよびRxバッファーは1.6kBの内部RAMを占有します。 50kB RAMの値は、5つのRx静的バッファーと6つのTx静的バッファーの使用を想定しています。 PSRAMを使用していない場合は、RAMを節約するために「WiFi送信バッファーのタイプ」オプションをDYNAMICに設定する必要があります。この場合、RAMの使用量は50kBをはるかに下回りますが、プログラマーは少なくとも50kBを使用可能に保つ必要があります。 Wi-Fiがデータを送信できるようにするため。 [内部RAMのみ]
According to the Wi-Fi menuconfig each Tx and Rx buffer occupies 1.6kB internal RAM. The value of 50kB RAM is assuming use of 5 Rx static buffers and 6 Tx static buffers. If PSRAM is not in use, then the “Type of WiFi Tx Buffer” option should be set as DYNAMIC in order to save RAM, in this case, the RAM usage will be far less than 50kB, but programmer should keep at least 50kB available for the Wi-Fi to be able to transmit the data. [Internal RAM only]
sd_card_mount()
関数で使用されるaudio_hal/board/board.hのSD_CARD_OPEN_FILE_NUM_MAXの値に応じて、必要なRAMは、開くファイルの最大数が増えると増加します。 12kBは、最大5つのファイルと512バイトのCONFIG_WL_SECTOR_SIZEで必要なRAMです。 [内部RAMのみ]Depending on value of SD_CARD_OPEN_FILE_NUM_MAX in audio_hal/board/board.h, that is then used in
sd_card_mount()
function, the RAM needed will increase with a greater number of maximum open files. 12kB is the RAM needed with 5 max files and 512 bytes CONFIG_WL_SECTOR_SIZE. [Internal RAM only]- I2Sストリームの構成設定に応じて、audio_stream/include/i2s_stream.hおよびaudio_stream/i2s_stream.cを参照してください。 [内部RAMのみ]
Depending on configuration settings of the I2S stream, refer to audio_stream/include/i2s_stream.h and audio_stream/i2s_stream.c. [Internal RAM only]
- リングバッファの構成設定に応じて、audio_pipeline/include/audio_pipeline.hのDEFAULT_PIPELINE_RINGBUF_SIZEを参照するか、バッファが次のように作成されている場合はユーザー設定を参照してください。
rb_create()
。Depending on configuration setting of the Ringbuffer, refer to DEFAULT_PIPELINE_RINGBUF_SIZE in audio_pipeline/include/audio_pipeline.h or user setting, if the buffer is created with e.g.
rb_create()
.
システム設定¶
System Settings
オーディオプロジェクトで高いWi-Fiパフォーマンスを実現するには、次の設定をお勧めします。
The following settings are recommended to achieve a high Wi-Fi performance in an audio project.
Note
製品設計、コンポーネントの選択、製品テストに注意を払っている評判の良いベンダーのESP32モジュールとボードを使用してください。 これは、校正されたRFを備えた適切に設計されたボードを確実に受け取るためです。
Use ESP32 modules and boards from reputable vendors that put attention to product design, component selection and product testing. This is to have confidence of receiving well designed boards with calibrated RF.
menuconfigで次のオプションを設定します。
Set these following options in menuconfig.
- Flash SPI mode as QIO
- Flash SPI speed as 80MHz
- CPU frequency as 240MHz
- [コンポーネント設定] > [LWIP] > [TCP]で、デフォルトの受信ウィンドウサイズを最大セグメントサイズの5倍に設定します
Set Default receive window size as 5 times greater than Maximum Segment Size in Component config > LWIP > TCP
外部アンテナを使用する場合は、「esp-idf/components/esp32/phy_init.c」で、PHY_RF_CAL_PARTIALをPHY_RF_CAL_FULLとして設定します。
If external antenna is used, then set PHY_RF_CAL_PARTIAL as PHY_RF_CAL_FULL in ‘’esp-idf/components/esp32/phy_init.c’‘