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

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

Контроллер 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 DT
Доступно: 10015 шт. 77,50
ESP8266EX - маломощное высокоинтегрированное решение Wi-Fi, разработанное на основе 32-разрядного микропроцессора Tensilica L106 для мобильных устройств, носимой электроники и для приложений IoT, обеспечивающее низкое энергопотребление за сч?т использования нескольких патентованных технологий.…
ESP8266EX 77,50 от 45 шт. 70,50 от 94 шт. 68,00 от 196 шт. 64,50 от 500 шт. 61,50
1654 шт.
(на складе)
8361 шт.
(под заказ)
ESP32-WROOM-32 [4MB]
ESP32-WROOM-32 [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2292549 ИНФО PDF DT
Доступно: 321 шт. 232,00
Базовый модуль, использующий высокопроизводительную микросхему ESP32-D0WDQ6 с двухъядерным процессором и максимальной рабочей частотой до 240 МГц. Микросхема ESP32-D0WDQ6 работает под управлением freeRTOS и использует стек LwIP, ESP32-D0WDQ6, 32Mbits SPI flash, UART Mode
ESP32-WROOM-32 [4MB] 232,00 от 15 шт. 211,00 от 32 шт. 203,00 от 66 шт. 193,00 от 172 шт. 184,00
316 шт.
(на складе)
5 шт.
(под заказ)
ESP8285
ESP8285
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2584270 ИНФО PDF
Доступно: 2074 шт. 141,00
Система-на-кристалле (SoC) на базе 32-битного процессора Tensilica L106 160 МГц
ESP8285 141,00 от 25 шт. 128,00 от 52 шт. 123,00 от 108 шт. 117,00 от 284 шт. 111,00
16 шт.
(на складе)
2058 шт.
(под заказ)
ESP32-D0WDQ6
ESP32-D0WDQ6
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2590835 ИНФО PDF DT
Доступно: 412 шт. от 1 шт. от 296,86
Выбрать
условия
поставки
Система-на-кристалле (SoC) на базе вухъядерного 32-битного процессора Xtensa® 240 МГц 600 DMIPS
ESP32-D0WDQ6 от 1 шт. от 296,86
412 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-WROVER-I [4MB]
ESP32-WROVER-I [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2610278 ИНФО PDF DT
Доступно: 9 шт. 560,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] 560,00 от 7 шт. 509,00 от 13 шт. 490,00 от 27 шт. 467,00 от 71 шт. 443,00
9 шт.
(на складе)
ESP32-WROVER [4MB]
ESP32-WROVER [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2738673 ИНФО PDF DT
Доступно: 67 шт. 364,00
ESP32-WROVER - мощный высокопроизводительный модуль общего назначения со встроенным микроконтроллерным ядром и с поддержкой стандартов связи Wi-Fi+BT+BLE, предназначенный для широкого ряда приложений с экономичным энергопотреблением.
ESP32-WROVER [4MB] 364,00 от 10 шт. 330,00 от 20 шт. 318,00 от 42 шт. 303,00 от 110 шт. 288,00
66 шт.
(на складе)
1 шт.
(под заказ)
ESP32-S0WD
ESP32-S0WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739124 ИНФО PDF DT
Доступно: 1362 шт. 327,00
Система-на-кристалле (SoC) на базе 32-битного процессора Xtensa® 160 МГц 200 DMIPS
ESP32-S0WD 327,00 от 11 шт. 297,00 от 22 шт. 286,00 от 47 шт. 272,00 от 100 шт. 259,00
92 шт.
(на складе)
1270 шт.
(под заказ)
ESP32-D2WD
ESP32-D2WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739125 ИНФО PDF DT
Доступно: 1073 шт. от 1 шт. от 338,31
Выбрать
условия
поставки
Система-на-кристалле (SoC) на базе вухъядерного 32-битного процессора Xtensa® 160 МГц 400 DMIPS
ESP32-D2WD от 1 шт. от 338,31
1073 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-D0WD
ESP32-D0WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739127 ИНФО PDF DT
Доступно: 1280 шт. 249,00
Система-на-кристалле (SoC) на базе вухъядерного 32-битного процессора Xtensa® 240 МГц 600 DMIPS
ESP32-D0WD 249,00 от 14 шт. 226,00 от 29 шт. 217,00 от 61 шт. 207,00 от 160 шт. 197,00
52 шт.
(на складе)
1228 шт.
(под заказ)
ESP32-WROOM-32U [4MB]
ESP32-WROOM-32U [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739131 ИНФО PDF DT
Доступно: 563 шт. 292,00
SMD Module ESP32-WROOM-32U, ESP32-D0WD, 32Mbits SPI flash, UART mode, U.FL antenna connector
ESP32-WROOM-32U [4MB] 292,00 от 12 шт. 266,00 от 25 шт. 256,00 от 52 шт. 244,00 от 137 шт. 232,00
47 шт.
(на складе)
516 шт.
(под заказ)
ESP32-SOLO-1
ESP32-SOLO-1
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739132 ИНФО PDF DT
Доступно: 1340 шт. 377,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 377,00 от 10 шт. 343,00 от 20 шт. 330,00 от 41 шт. 315,00 от 106 шт. 299,00
73 шт.
(на складе)
1267 шт.
(под заказ)
ESP32-PICO-D4
ESP32-PICO-D4
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739133 ИНФО PDF DT
Доступно: 1900 шт. 331,00
SIP module ESP32 with 4MByte Flash, Dual Core MCU, Wi-Fi & Bluetooth Combo, LGA48-pin, 7*7mm
ESP32-PICO-D4 331,00 от 11 шт. 301,00 от 22 шт. 290,00 от 46 шт. 276,00 от 121 шт. 262,00
97 шт.
(на складе)
1803 шт.
(под заказ)

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

  • ()