ESP32: Анализ использования оперативной памяти

Контроллер ESP32 имеет всего 512КБ оперативной памяти, и в сложных проектах разработчик может столкнуться с ее нехваткой. В статье рассказано о встроенных программных инструментах ESP IDF, которые позволят найти проблемные точки и оптимизировать их
1809
В избранное

Контроллер ESP32 имеет всего 512КБ оперативной памяти, и в сложных проектах разработчик может столкнуться с ее нехваткой. В статье рассказано о встроенных программных инструментах ESP IDF, которые позволят найти проблемные точки и оптимизировать их.

Контроллер ESP32 имеет 512 КБ памяти SRAM. Хотя этот объем может показаться относительно небольшим, при грамотном использовании он может предоставить множество возможностей для разработчика.

Исходный код приложения обычно содержит ряд файлов и библиотек, и компоновщик в своей работе извлекает из этих компонентов различные функции и переменные. Компоновщик обычно оптимизирует объекты, которые не используются (или на которые не ссылаются) в готовой прошивке. Таким образом, в зависимости от того, что вы делаете в своем приложении, вклад различных компонентов в использование памяти меняется.

В состав фреймворка ESP IDF входит утилита idf_size.py, которая позволит оценить использование памяти, чтобы вы могли идентифицировать и оптимизировать проблемные точки. Утилита связана со скриптами сборки, поэтому вы можете напрямую запускать команду make target, чтобы увидеть потребление памяти, не запоминая других команд.

Давайте посмотрим, как можно использовать эту утилиту, чтобы оценить эффективность использования памяти.

Память, выделенная под конкретные компоненты

Первое, что нужно сделать при анализе распределения памяти, это посмотреть, какое влияние каждый из используемых компонентов оказывает на окончательный образ прошивки. Это можно сделать, указав цель size-components для системы сборки. Выполнение этой команды после сборки приложения examples/wifi/power_save дает следующий результат:

$ make IDF_PATH=~/work/idf size-components
Total sizes:
DRAM .data size:  14200 bytes
DRAM .bss size:   23224 bytes
Used static DRAM: 37424 bytes ( 143312 available, 20.7% used)
Used static IRAM: 62344 bytes ( 68728 available, 47.6% used)
Flash code:       368546 bytes
Flash rodata:     65916 bytes
Total image size:~ 511006 bytes (.bin may be padded larger)
Per-archive contributions to ELF file:

Archive File

DRAM.data

 & .bss

IRAM

Flash code

& rodata

Total

libnet80211.a

1976

8891

3358

92337

10206

116768

liblwip.a

19

3865

0

72280

14962

91126

libpp.a

855

6339

13035

40707

7311

68247

libc.a

0

0

0

55343

3889

59232

libphy.a

1334

869

4584

29104

0

35891

libesp32.a

2685

436

8067

10719

7388

29295

libwpa.a

0

682

0

20314

2320

23316

libfreertos.a

4148

776

12215

0

1595

18734

libnvs_flash.a

0

32

0

9497

2705

12234

libgcc.a

4

20

104

9899

848

10875

...upplicant.a

0

0

0

9492

4

9496

...spi_flash.a

36

323

6465

912

1724

9460

libheap.a

876

4

3390

1123

996

6389

libdriver.a

24

4

0

883

4990

5901

libsoc.a

669

8

3841

0

1239

5757

libcoexist.a

1277

94

3344

0

137

4852

libstdc++.a

8

20

0

2613

1253

3894

libmbedtls.a

0

0

0

3109

320

3429

...p_adapter.a

0

124

0

2578

316

3018

libvfs.a

40

63

0

2212

417

2732

libnewlib.a

152

252

750

463

95

1712

libpthread.a

16

12

178

770

655

1631

liblog.a

8

268

438

396

166

1276

libmain.a

0

0

0

574

643

1217

libcore.a

0

5

0

709

402

1116

librtc.a

0

4

1090

0

0

1094

...pp_update.a

0

0

0

123

725

848

libhal.a

0

0

515

0

32

547

libm.a

0

0

92

0

0

92

libcxx.a

0

0

0

11

0

11

libwps.a

0

1

0

0

0

1

libwpa2.a

0

1

0

0

0

1

libethernet.a

0

0

0

0

0

0

..._support.a

0

0

0

0

0

0

На экране видна итоговая информация об объеме, занимаемом всеми компонентами прошивки. Кроме того, в таблице предоставлена подробная информация по каждому из компонентов:

  • data: это размер секции .data приложения. В этой секции размещаются предварительно инициализированные данные и константы.
  • bss: это размер секции .bss. Здесь размещаются любые глобальные или статически определенные переменные и объекты, которые инициализируются нулями при загрузке.
  • IRAM: это размер секции кода ( .text ), которую необходимо загрузить в IRAM. Обратите внимание, что большая часть кода может быть выполнена непосредственно из флэш-памяти (XIP), без необходимости загрузки его в IRAM. Как правило, сюда попадает код, который выполняется в контексте прерывания или непосредственно обращается к флэш-памяти для чтения/ записи.
  • Flash Code: это размер секции кода ( .text ), которая размещается во флэш-памяти и выполняется непосредственно оттуда. Большая часть вашего раздела кода окажется именно в этом столбце.
  • Flash rodata: здесь показаны данные, предназначенные только для чтения и используемые прошивкой (строки, статически инициализированные и неизменяемые массивы). Поскольку доступ к флэш-памяти возможен во время выполнения программы, нет необходимости загружать секцию в память.
  • Total: общий используемый объем памяти для этого компонента.

Конечно, особое внимание нужно уделить размерам разделов IRAM и DRAM, так как именно объем SRAM является ограничивающим фактором (512 КБ) относительно флэш-памяти (порядка 2–8 МБ).

Поиск проблемной сущности

Допустим, вы узнали, что один из используемых вами компонентов потребляет гораздо больше памяти, чем должен. Вы можете изучить проблему глубже, чтобы определить, какая сущность в этом компоненте больше всего влияет на объем используемой памяти. Это можно сделать, используя цель size-symbols для системы сборки. Например:

$ make IDF_PATH=~/work/idf size-symbols COMPONENT=soc
Total sizes:
DRAM .data size: 14200 bytes
DRAM .bss size: 23224 bytes
Used static DRAM: 37424 bytes ( 143312 available, 20.7% used)
Used static IRAM: 62344 bytes ( 68728 available, 47.6% used)
Flash code: 368546 bytes
Flash rodata: 65916 bytes
Total image size:~ 511006 bytes (.bin may be padded larger)
Symbols within the archive: libsoc.a (Not all symbols may be reported)
Symbols from section: .dram0.data
str1.4(605) __func__$3446(23) __func__$3425(21) rtc_clk_cpu_freq_value(20)
Section total: 669
Symbols from section: .dram0.bss
s_cur_pll(4) s_cur_freq(4)
Section total: 8
Symbols from section: .iram0.text
rtc_init(1020) rtc_clk_cpu_freq_set(472) rtc_clk_bbpll_set(380) rtc_clk_cal_internal(369) .iram1(282) rtc_clk_cpu_freq_get(172) rtc_clk_32k_bootstrap(170) rtc_clk_32k_enable_internal(149) rtc_clk_wait_for_slow_cycle(129) rtc_time_get(96) rtc_clk_cpu_freq_value(96) rtc_clk_cal(78) rtc_clk_xtal_freq_get(68) rtc_clk_slow_freq_get_hz(51) rtc_clk_apb_freq_get(50) rtc_clk_32k_enable(49) rtc_clk_fast_freq_set(46) rtc_clk_slow_freq_set(43) clk_val_is_valid(32) .iram1.literal(28) rtc_clk_apb_freq_update(23) rtc_clk_slow_freq_get(16) clk_val_to_reg_val(14) reg_val_to_clk_val(8)
Section total: 3841
Symbols from section: .iram0.vectors
Section total: 0
Symbols from section: .flash.text
Section total: 0
Symbols from section: .flash.rodata
soc_memory_regions(704) soc_memory_types(320) str1.4(159) soc_reserved_regions(48) soc_reserved_region_count(4) soc_memory_region_count(4)
Section total: 1239

Для получения дополнительной информации по использованию памяти различными сущностями компонента в командной строке make был использован дополнительный параметр COMPONENT = <имя_компонента>.  Например, в приведенном выше примере была запрошена информация для компонента «soc».

В результатах вывода команды виден вклад каждой сущности (функции, переменной или объекта) этого компонента в общий размер прошивки. Обратите внимание, что размер каждой функции виден в секции .iram0.text, а, например, массивы soc_memory_types и soc_memory_regions (определенные в soc_memory_layout.c  как «const»), помещены во флэш-память, поскольку они предназначены только для чтения.

Результат работы команды может быть эффективно использован для точного определения того, какие части ваших компонентов вносят заметный вклад в использование оперативной памяти контроллера, что позволит вам сосредоточиться на эффективной оптимизации именно этих компонентов.

Дополнительные материалы:

 

Источник: https://medium.com

Производитель: Espressif Systems (shanghai) Pte. Ltd.
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
ESP8266EX
ESP8266EX
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2076191 ИНФО PDF RND DT
Доступно: 8121 шт. 92,00
ESP8266EX - маломощное высокоинтегрированное решение Wi-Fi, разработанное на основе 32-разрядного микропроцессора Tensilica L106 для мобильных устройств, носимой электроники и для приложений IoT, обеспечивающее низкое энергопотребление за сч?т использования нескольких патентованных технологий.…
ESP8266EX 92,00 от 29 шт. 78,50 от 96 шт. 77,00 от 195 шт. 75,50
1480 шт.
(на складе)
6641 шт.
(под заказ)
ESP32-WROOM-32 [4MB]
ESP32-WROOM-32 [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2292549 ИНФО PDF RND DT
Доступно: 1123 шт. 322,00
Базовый модуль, использующий высокопроизводительную микросхему ESP32-D0WDQ6 с двухъядерным процессором и максимальной рабочей частотой до 240 МГц. Микросхема ESP32-D0WDQ6 работает под управлением freeRTOS и использует стек LwIP, ESP32-D0WDQ6, 32Mbits SPI flash, UART Mode
ESP32-WROOM-32 [4MB] 322,00 от 9 шт. 273,00 от 28 шт. 268,00 от 56 шт. 263,00
267 шт.
(на складе)
856 шт.
(под заказ)
ESP8285
ESP8285
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2584270 ИНФО PDF RND
Доступно: 4166 шт. от 1 шт. от 198,14
Выбрать
условия
поставки
Система-на-кристалле (SoC) на базе 32-битного процессора Tensilica L106 160 МГц
ESP8285 от 1 шт. от 198,14
4166 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-D0WDQ6
ESP32-D0WDQ6
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2590835 ИНФО PDF DT
Доступно: 4491 шт. 229,00
Система-на-кристалле (SoC) на базе вухъядерного 32-битного процессора Xtensa® 240 МГц 600 DMIPS
ESP32-D0WDQ6 229,00 от 10 шт. 195,00 от 40 шт. 191,00 от 80 шт. 187,00
80 шт.
(на складе)
4411 шт.
(под заказ)
ESP32-WROVER-I [4MB]
ESP32-WROVER-I [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2610278 ИНФО PDF DT
Доступно: 50 шт. 602,00
ESP32-WROVER-I [4MB] - SMD Module ESP32-WROVER, ESP32-D0WDQ6, 1.8V 64Mbits PSRAM, 32Mbits SPI flash, IPEX Antenna connector
ESP32-WROVER-I [4MB] 602,00 от 5 шт. 512,00 от 15 шт. 502,00 от 30 шт. 492,00
50 шт.
(на складе)
ESP32-WROVER [4MB]
ESP32-WROVER [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2738673 ИНФО PDF RND DT
Доступно: 40 шт. 484,00
ESP32-WROVER - мощный высокопроизводительный модуль общего назначения со встроенным микроконтроллерным ядром и с поддержкой стандартов связи Wi-Fi+BT+BLE, предназначенный для широкого ряда приложений с экономичным энергопотреблением.
ESP32-WROVER [4MB] 484,00 от 6 шт. 412,00 от 19 шт. 404,00 от 38 шт. 396,00
40 шт.
(на складе)
ESP32-S0WD
ESP32-S0WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739124 ИНФО PDF RND DT
Доступно: 1642 шт. 224,00
Система-на-кристалле (SoC) на базе 32-битного процессора Xtensa® 160 МГц 200 DMIPS
ESP32-S0WD 224,00 от 9 шт. 224,00 от 29 шт. 224,00 от 58 шт. 224,00
92 шт.
(на складе)
1550 шт.
(под заказ)
ESP32-D2WD
ESP32-D2WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739125 ИНФО PDF DT
Доступно: 1089 шт. от 1 шт. от 370,11
Выбрать
условия
поставки
Система-на-кристалле (SoC) на базе вухъядерного 32-битного процессора Xtensa® 160 МГц 400 DMIPS
ESP32-D2WD от 1 шт. от 370,11
1089 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-D0WD
ESP32-D0WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739127 ИНФО PDF RND DT
Доступно: 7467 шт. 250,00
Система-на-кристалле (SoC) на базе вухъядерного 32-битного процессора Xtensa® 240 МГц 600 DMIPS
ESP32-D0WD 250,00 от 11 шт. 212,00 от 36 шт. 208,00 от 72 шт. 204,00
12 шт.
(на складе)
7455 шт.
(под заказ)
ESP32-WROOM-32U [4MB]
ESP32-WROOM-32U [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739131 ИНФО PDF RND DT
Доступно: 343 шт. 373,00
SMD Module ESP32-WROOM-32U, ESP32-D0WD, 32Mbits SPI flash, UART mode, U.FL antenna connector
ESP32-WROOM-32U [4MB] 373,00 от 7 шт. 317,00 от 24 шт. 311,00 от 49 шт. 305,00
83 шт.
(на складе)
260 шт.
(под заказ)
ESP32-SOLO-1
ESP32-SOLO-1
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739132 ИНФО PDF RND DT
Доступно: 3170 шт. 395,00
Wi-Fi+BT+BLE-модуль, построенный на базе одноядерной микросхемы ESP32-S0WD. Как отмечалось выше, ESP32-S0WD – младший представитель семейства ESP32. Несмотря на это, ESP32-SOLO-1 может применяться в широком спектре приложений – от малопотребляющих датчиков (наиболее оптимальный вариант), до приложений с беспроводной передачей звука, ESP32-S0WD, Single Core, 32Mbits SPI flash, UART Mode
ESP32-SOLO-1 395,00 от 7 шт. 336,00 от 23 шт. 329,00 от 46 шт. 323,00
53 шт.
(на складе)
3117 шт.
(под заказ)
ESP32-PICO-D4
ESP32-PICO-D4
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739133 ИНФО PDF RND DT
Доступно: 2120 шт. 315,00
SIP module ESP32 with 4MByte Flash, Dual Core MCU, Wi-Fi & Bluetooth Combo, LGA48-pin, 7*7mm
ESP32-PICO-D4 315,00 от 9 шт. 268,00 от 28 шт. 262,00 от 58 шт. 257,00
125 шт.
(на складе)
1995 шт.
(под заказ)

Сравнение позиций

  • ()