Как заставить BLE и WiFi IoT работать с памятью без проблем ?
Моя прошивка работает на ВРОВЕРЕ ESP32, чтобы использовать SPIRAM.
Он использует как IoT через Wi-Fi (Azure IoT SDK), так и BLE для поддержки соединения с моим мобильным приложением.
Я потратил несколько дней, пытаясь заставить их работать одновременно, но я столкнулся с проблемой памяти, и выдается следующая ошибка:
esp-tls: возвращено mbedtls_ssl_handshake -0x2700
Конечно, если я не включу свой модуль BLE, у меня не будет проблем с памятью, связанных с IoT.
Я был бы признателен за помощь и предложения по продвижению в этом направлении. Я приложил некоторые материалы, которые помогут вам принять решение.
МАТЕРИАЛЫ
Я работаю с vscode на PlatformIO, и я попытался воспользоваться преимуществами PSRAM с помощью настроек, определенных в моем PlatformIO.ini, которые выглядят следующим образом:
; Файл конфигурации проекта PlatformIO
;
; Параметры сборки: флаги сборки, фильтр источника
; Параметры загрузки: пользовательский порт загрузки, скорость и дополнительные флаги
; Параметры библиотеки: зависимости, дополнительные хранилища библиотеки
; Дополнительные опции: дополнительные сценарии
;
; Пожалуйста, ознакомьтесь с документацией для получения других вариантов и примеров
; https://docs.platformio.org/page/projectconf.html
[env:esp32dev]
platform = espressif32
;board = esp32dev
board = esp-wrover-kit
framework = arduino
;espidf
;
upload_port = /dev/cu.usbserial-141301
;upload_port = /dev/cu.usbserial-1420
;upload_port = /dev/cu.usbserial-0001
monitor_speed = 115200
lib_deps =
adafruit/Adafruit NeoPixel@^1.10.0
lbernstone/Tone32@^1.0.0
;board_build.partitions = no_ota.csv
;board_build.partitions = partitions_singleapp.csv
board_build.partitions = huge_app.csv
extra_scripts = pre:build_script_versioning.py
build_flags =
; -DCORE_DEBUG_LEVEL=4
-DBOARD_HAS_PSRAM=1
; -DMBEDTLS_MEMORY_BUFFER_ALLOC_C=1
;-DCONFIG_MBEDTLS_MEM_ALLOC_MODE=MBEDTLS_EXTERNAL_MEM_ALLOC
-DCONFIG_MBEDTLS_MEM_ALLOC_MODE=1
-mfix-esp32-psram-cache-issue
; -DCONFIG_MBEDTLS_DYNAMIC_BUFFER=1
; -DMBEDTLS_THREADING_C=1
; -DCONFIG_SPIRAM_CACHE_WORKAROUND=1
; -DCONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=1
Журналы процессов компиляции и компоновки выглядят следующим образом:
Linking .pio/build/esp32dev/firmware.elf
Retrieving maximum program size .pio/build/esp32dev/firmware.elf
Checking size .pio/build/esp32dev/firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [== ] 22.7% (used 74352 bytes from 327680 bytes)
Flash: [====== ] 58.5% (used 1841270 bytes from 3145728 bytes)
Building .pio/build/esp32dev/firmware.bin
esptool.py v3.1
Merged 1 ELF section
Configuring upload protocol...
AVAILABLE: esp-prog, espota, esptool, ftdi, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Use manually specified: /dev/cu.usbserial-141301
Uploading .pio/build/esp32dev/firmware.bin
esptool.py v3.1
Serial port /dev/cu.usbserial-141301
Connecting........_____....._____..
Chip is ESP32-D0WD-V3 (revision 3)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 34:94:54:4f:6e:a8
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 16MB
Flash will be erased from 0x00001000 to 0x00005fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x001d1fff...
Flash params set to 0x0240
Compressed 17104 bytes to 11191...
Writing at 0x00001000... (100 %)
Wrote 17104 bytes (11191 compressed) at 0x00001000 in 0.5 seconds (effective 275.8 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 119...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (119 compressed) at 0x00008000 in 0.0 seconds (effective 510.8 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 683.6 kbit/s)...
Hash of data verified.
Compressed 1841488 bytes to 1074925...
Writing at 0x00010000... (1 %)
...
Writing at 0x001cd8ff... (100 %)
Wrote 1841488 bytes (1074925 compressed) at 0x00010000 in 25.7 seconds (effective 572.3 kbit/s)...
Hash of data verified.
Проверка оперативной памяти показывает, что я довольно скудный, Explorer | my src files перечисляет:
Total: 66.3 KB Flash, 0 bytes RAM
Из проводника | Статистики я получаю:
RAM
100%
440.2 KB
Flash
59%
1.8 MB
Top 5 Files
-----------
292.7 KBunknown
46.2 KB…newlib/libc/stdio/vfprintf.c
19.1 KB…components/esp32/spiram_psram.c
18.8 KB…bt/bluedroid/bta/dm/bta_dm_act.c
16.2 KB…bt/bluedroid/stack/btm/btm_sec.c
Top 5 Symbols
-------------
16 KB updaterupdater
12.5 KB _vfprintf_r_vfprintf_r
12.3 KB _svfprintf_r_svfprintf_r
8.3 KB _vfiprintf_r_vfiprintf_r
8.0 KB _svfiprintf_r_svfiprintf_r
Неизвестный (который потребляет большую часть оперативной памяти при 293 КБ) показывает следующее:
updater STT_OBJECT STB_LOCAL 0x3FFC4D24 .dram0.bss
16 KB
hostap_input STT_FUNC STB_GLOBAL 0x400F42E0 .flash.text
5.0 KB
sta_input STT_FUNC STB_GLOBAL 0x4010501C .flash.text
4.6 KB
ieee80211_sta_new_state STT_FUNC STB_GLOBAL 0x40103E94 .flash.text
3.1 KB
wdevProcessRxSucDataAll STT_FUNC STB_GLOBAL 0x4012C0BC .flash.text
3.1 KB
ciphersuite_definitions STT_OBJECT STB_LOCAL 0x3F41FAAC .flash.rodata
3.1 KB
wpa_sm_rx_eapol STT_FUNC STB_GLOBAL 0x4019B0C8 .flash.text
3.1 KB
g_cnxMgr STT_OBJECT STB_GLOBAL 0x3FFCA3D0 .dram0.bss
3.0 KB
r_lld_evt_restart STT_FUNC STB_GLOBAL 0x4008E8A0 .iram0.text
2.9 KB
r_lld_con_start STT_FUNC STB_GLOBAL 0x401FAA98 .flash.text
2.8 KB
lmp_not_accepted_handler STT_FUNC STB_LOCAL 0x401F4774 .flash.text
2.6 KB
ieee80211_output_process STT_FUNC STB_GLOBAL 0x400FE33C .flash.text
2.6 KB
ca_pem STT_OBJECT STB_LOCAL 0x3F403E00 .flash.rodata
2.5 KB
ieee80211_send_mgmt STT_FUNC STB_GLOBAL 0x400FFB98 .flash.text
2.2 KB
rcUpdateTxDoneAmpdu2 STT_FUNC STB_GLOBAL 0x40129694 .flash.text
2.1 KB
1 ответ
Я нашел решение, не передавая сертификат на уровень MQTT следующим образом:
// == Создать новый клиент mqtt
esp_mqtt_client_config_t mqtt_config;
memset(&mqtt_config, 0, sizeof(mqtt_config));
mqtt_config.uri = mqtt_broker_uri;
mqtt_config.port = mqtt_port;
mqtt_config.client_id = mqtt_client_id;
mqtt_config.username = mqtt_username;
mqtt_config.password = (const char*)az_span_ptr(sasToken.Get());
mqtt_config.keepalive = 30;
mqtt_config.disable_clean_session = 0;
mqtt_config.disable_auto_reconnect = false;
mqtt_config.event_handle = mqtt_event_handler;
mqtt_config.user_context = NULL;
//== Удалил сертификат, так как это приводит к сбою MQTT с:
//mqtt_config.cert_pem = (const char*)ca_pem;
- Как очистить кучу памяти в esp32
- Есть ли способ подключить оперативную память компьютера к Arduino?
- Последовательная печать из флэш-памяти (F() macro, PROGMEM, sprintf_P, SPTR)
- Подключить SDRAM к STM32
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Выделение строковой памяти Arduino
- ESP32 не может спать дольше 35 минут.
- Есть ли способ добавить внешнюю оперативную память (скажем, 100 МБ или 200 МБ) в этом контексте микширования аудиобуфера?
BLE и WiFi используют один и тот же радиомодуль (есть только один ...), И вы не можете использовать их оба одновременно., @Majenko
Неужели? Пожалуйста, у вас есть рекомендации по этому поводу?, @Stéphane de Luca
Самое близкое, что вы можете сделать, - это переключиться между двумя функциями и "разделить время" соединения. Это возможно, но неприятно, и я не думаю, что это можно сделать с помощью Arduino API, только ESP-IDF. https://stackoverflow.com/questions/65636417/making-esp32-wifi-bluetooth-work-together, @Majenko