Как заставить 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

Обсуждение

BLE и WiFi используют один и тот же радиомодуль (есть только один ...), И вы не можете использовать их оба одновременно., @Majenko

Неужели? Пожалуйста, у вас есть рекомендации по этому поводу?, @Stéphane de Luca

Самое близкое, что вы можете сделать, - это переключиться между двумя функциями и "разделить время" соединения. Это возможно, но неприятно, и я не думаю, что это можно сделать с помощью Arduino API, только ESP-IDF. https://stackoverflow.com/questions/65636417/making-esp32-wifi-bluetooth-work-together, @Majenko


1 ответ


0

Я нашел решение, не передавая сертификат на уровень 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;
,