Aktueller Stand ESP32-Arduino 2

Danke für das Test-image. Ich hab es einfach über OTA geflasht. Crasht auch mit einem LoadProhibited, aber an einer anderen Stelle. Damit schließt sich auch irgendein Fehler in meinem build aus.

Keine Angst, so blöd immer und immer wieder das falsche target auszuwählen bin ich nicht, außerdem wurde darauf schon hingewiesen.
Damit würde dann nämlich die Arduino 1 Version auch nicht laufen, tut sie aber.
Weiterhin weiß ich auch, dass ich ein board mit 8MB flash hier liegen habe. Ganz sicher. Bitte nicht mehr hinterfragen.

Inzwischen habe ich festgestellt, dass es an aktiviertem PSRAM liegt (DBOARD_HAS_PSRAM). Das board hat eigentlich PSRAM, aber das ist zumindest mal eine Spur, die ich verfolgen kann.

Den dump hatte ich mir gespart, weil bei jeder Änderung ein anderer backtrace kam, ist auch logisch bei einem Speicherzugriffsfehler, aber hier hast du einen:

Trace
[ 216 ]  LED-Helligkeit für Nachtmodus wurde aus NVS geladen: 2
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.

Core  1 register dump:
PC      : 0x4009d667  PS      : 0x00060a30  A0      : 0x8009ccbc  A1      : 0x3ffd0ee0  
A2      : 0xffffffff  A3      : 0xfffffffc  A4      : 0x3ffc4f16  A5      : 0x3f8027a4  
A6      : 0x00000000  A7      : 0x3ffc4de0  A8      : 0xffffffff  A9      : 0x3ffd1000  
A10     : 0x3ffdba68  A11     : 0x00006930  A12     : 0x00000005  A13     : 0x3f80602c  
A14     : 0x00000000  A15     : 0x3ffc8fb8  SAR     : 0x00000011  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x0000000f  LBEG    : 0x40093370  LEND    : 0x4009337b  LCOUNT  : 0x00000000  


Backtrace: 0x4009d664:0x3ffd0ee0 0x4009ccb9:0x3ffd0f00 0x4009d74f:0x3ffd0f20 0x4009d9bc:0x3ffd0f40 0x4008471a:0x3ffd0f60 0x400847ef:0x3ffd0f90 0x401c7231:0x3ffd0fe0 0x401c89ee:0x3ffd1000 0x401c741f:0x3ffd10e0 0x401c769b:0x3ffd1120 0x400e1945:0x3ffd1150 0x400d84e1:0x3ffd11e0 0x400e11da:0x3ffd1200 0x401111d6:0x3ffd1220

  #0  0x4009d664:0x3ffd0ee0 in tlsf_block_size_max at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/heap_tlsf.c:715
  #1  0x4009ccb9:0x3ffd0f00 in adjust_request_size at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/heap_tlsf.c:125
      (inlined by) tlsf_malloc at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/heap_tlsf.c:848
  #2  0x4009d74f:0x3ffd0f20 in multi_heap_malloc_impl at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/multi_heap.c:200
  #3  0x4009d9bc:0x3ffd0f40 in multi_heap_malloc at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/multi_heap_poisoning.c:230
      (inlined by) multi_heap_malloc at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/multi_heap_poisoning.c:219
  #4  0x4008471a:0x3ffd0f60 in heap_caps_malloc_base at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/heap_caps.c:154
      (inlined by) heap_caps_malloc_base at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/heap_caps.c:99
  #5  0x400847ef:0x3ffd0f90 in heap_caps_malloc_prefer at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/heap_caps.c:269
  #6  0x401c7231:0x3ffd0fe0 in ff_memalloc at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/fatfs/port/freertos/ffsystem.c:20
  #7  0x401c89ee:0x3ffd1000 in esp_vfs_fat_register at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/fatfs/vfs/vfs_fat.c:168
  #8  0x401c741f:0x3ffd10e0 in mount_to_vfs_fat at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/fatfs/vfs/vfs_fat_sdmmc.c:100
  #9  0x401c769b:0x3ffd1120 in esp_vfs_fat_sdmmc_mount at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/fatfs/vfs/vfs_fat_sdmmc.c:240 (discriminator 2)
  #10 0x400e1945:0x3ffd1150 in fs::SDMMCFS::begin(char const*, bool, bool, int, unsigned char) at ~/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src/SD_MMC.cpp:129
  #11 0x400d84e1:0x3ffd11e0 in SdCard_Init() at src/SdCard.cpp:21
  #12 0x400e11da:0x3ffd1200 in setup() at src/main.cpp:168
  #13 0x401111d6:0x3ffd1220 in loopTask(void*) at ~/.platformio/packages/framework-arduinoespressif32/cores/esp32/main.cpp:42

Hier nochmal die logs als Vergleich:

Version <=3.5.0 mit PSRAM an:

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6360
entry 0x400806b4
[ 958 ]  Maximale Inaktivitätszeit wurde aus NVS geladen: 10
[ 958 ]  Zyklus für Batteriemessung fuer Neopixel-Anzeige aus NVS geladen: 10 Minuten
[ 961 ]  Unterer Spannungslevel (Batterie) fuer Neopixel-Anzeige aus NVS geladen: 3.00 V
[ 968 ]  Oberer Spannungslevel (Batterie) fuer Neopixel-Anzeige aus NVS geladen: 4.20 V
[ 976 ]  Spannungslevel (Batterie) fuer Niedrig-Warnung via Neopixel aus NVS geladen: 3.40 V
[ 984 ]  Spannungslevel (Batterie) fuer Kritisch-Warnung via Neopixel aus NVS geladen: 3.10 V
[ 992 ]  Initiale Lautstärke wurde aus NVS geladen: 3
[ 998 ]  Maximale Lautstärke für Lautsprecher wurde ins NVS geschrieben.
[ 1004 ]  Maximale Lautstärke für Kopfhörer wurde ins NVS geschrieben.
[ 1010 ]  Maximale Lautstärke wurde gesetzt auf: 21
[ 1067 ]  Initiale LED-Helligkeit wurde aus NVS geladen: 16
[ 1067 ]  LED-Helligkeit für Nachtmodus wurde aus NVS geladen: 2

  _____   ____    ____            _                 
 | ____| / ___|  |  _ \   _   _  (_)  _ __     ___  
 |  _|   \__  \  | |_) | | | | | | | | '_ \   / _ \
 | |___   ___) | |  __/  | |_| | | | | | | | | (_) |
 |_____| |____/  |_|      \__,_| |_| |_| |_|  \___/ 
 Rfid-controlled musicplayer

[ 1130 ]  Software-revision: 20230214-1
[ 1133 ]  Git-revision: c578f88
[ 1136 ]  ESP-IDF version: v3.3.5-1-g85c43024c
[ 1141 ]  Wakeup was not caused by deepsleep: 0
[ 1145 ]  Versuche SD-Karte wird im SD_MMC-Modus (1 Bit) zu mounten...
[ 1151 ]  SD card type: [ 1153 ]  SDHC
[ 1155 ]  SD-Kartengröße / freier Speicherplatz: 30560 MB / 30559 MB
[ 1161 ]  FTP-User wurde aus NVS geladen: esp32
[ 1165 ]  FTP-Passwort wurde aus NVS geladen: esp32
[ 1270 ]  RFID-Tags koennen jetzt gescannt werden...
[E][Preferences.cpp:472] getString(): nvs_get_str len fail: SSID NOT_FOUND
[ 1271 ]  SSID wurde im NVS nicht gefunden.
[E][Preferences.cpp:472] getString(): nvs_get_str len fail: Password NOT_FOUND
[ 1900 ]  Access-Point geöffnet
[ 1900 ]  IP-Adresse: 192.168.4.1
[ 1904 ]  HTTP-Server gestartet.
[ 1904 ]  Freier Heap-Speicher nach Setup-Routine: 101124
[ 1904 ]  PSRAM: 4194140 bytes
[ 1906 ]  Flash-size: 8388608 bytes
[ 1910 ]  !!!!WICHTIG!!!! Beachte bitte https://forum.espuino.de/t/wechsel-zum-refactoring-branch-was-ist-zu-beachten/510 !!!!WICHTIG!!!!
[ 1926 ]  Neue Lautstärke empfangen via Queue: 3
[ 10006 ]  Aktuelle Batteriespannung: 0.22 V
[ 10007 ]  Aktuelle Batterieladung: 0.00 %
[ 10008 ]  Batterieladung niedrig

Version >6 ohne PSRAM:

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1344
load:0x40078000,len:13896
load:0x40080400,len:3600
entry 0x400805f0
E (759) esp_core_dump_flash: No��K��dump partition found!
E (759) esp_core_dump_flash: No core dump partition found!
[ 108 ]  Maximale Inaktivitätszeit wurde aus NVS geladen: 10
[ 109 ]  Zyklus für Batteriemessung fuer Neopixel-Anzeige aus NVS geladen: 10 Minuten
[ 121 ]  Unterer Spannungslevel (Batterie) fuer Neopixel-Anzeige aus NVS geladen: 3.00 V
[ 122 ]  Oberer Spannungslevel (Batterie) fuer Neopixel-Anzeige aus NVS geladen: 4.20 V
[ 133 ]  Spannungslevel (Batterie) fuer Niedrig-Warnung via Neopixel aus NVS geladen: 3.40 V
[ 145 ]  Spannungslevel (Batterie) fuer Kritisch-Warnung via Neopixel aus NVS geladen: 3.10 V
[ 145 ]  Initiale Lautstärke wurde aus NVS geladen: 3
[ 156 ]  Maximale Lautstärke für Lautsprecher wurde ins NVS geschrieben.
[ 157 ]  Maximale Lautstärke für Kopfhörer wurde ins NVS geschrieben.
[ 167 ]  Maximale Lautstärke wurde gesetzt auf: 21
[ 220 ]  Initiale LED-Helligkeit wurde aus NVS geladen: 16
[ 220 ]  LED-Helligkeit für Nachtmodus wurde aus NVS geladen: 2

  _____   ____    ____            _                 
 | ____| / ___|  |  _ \   _   _  (_)  _ __     ___  
 |  _|   \__  \  | |_) | | | | | | | | '_ \   / _ \
 | |___   ___) | |  __/  | |_| | | | | | | | | (_) |
 |_____| |____/  |_|      \__,_| |_| |_| |_|  \___/ 
 Rfid-controlled musicplayer

[ 286 ]  Software-revision: 20230214-1
[ 286 ]  Git-revision: c578f88-dirty
[ 296 ]  ESP-IDF version: v4.4.4
[ 297 ]  Wakeup was not caused by deepsleep: 0
[ 297 ]  Versuche SD-Karte wird im SD_MMC-Modus (1 Bit) zu mounten...
[ 307 ]  SD card type: [ 307 ]  SDHC
[ 307 ]  SD-Kartengröße / freier Speicherplatz: 30560 MB / 30559 MB
[ 318 ]  FTP-User wurde aus NVS geladen: esp32
[ 319 ]  FTP-Passwort wurde aus NVS geladen: esp32
E (315) gpio: GPIO can only be used as input mode
[   323][E][esp32-hal-gpio.c:130] __pinMode(): GPIO config failed
E (324) gpio: gpio_set_level(226): GPIO output gpio_num error
E (330) gpio: gpio_set_level(226): GPIO output gpio_num error
[ 439 ]  RFID-Tags koennen jetzt gescannt werden...
[   441][E][Preferences.cpp:483] getString(): nvs_get_str len fail: SSID NOT_FOUND
[ 441 ]  SSID wurde im NVS nicht gefunden.
[   452][E][Preferences.cpp:483] getString(): nvs_get_str len fail: Password NOT_FOUND
[ 452 ]  WLAN-Passwort wurde im NVS nicht gefunden.
[ 1076 ]  Access-Point geöffnet
[ 1077 ]  IP-Adresse: 192.168.4.1
[ 1082 ]  HTTP-Server gestartet.
[ 1082 ]  Freier Heap-Speicher nach Setup-Routine: 75320
[ 1082 ]  PSRAM: 0 bytes
[ 1082 ]  Flash-size: 8388608 bytes
[ 1100 ]  Neue Lautstärke empfangen via Queue: 3
[ 10004 ]  Aktuelle Batteriespannung: 0.18 V
[ 10006 ]  Aktuelle Batterieladung: 0.00 %
[ 10008 ]  Batterieladung niedrig

Um meine Fehlersuche abzuschließen: Letztendlich war der Fehler war in der settings-custom. Dort wird POWER als 17 definiert.
Tja, beim wrover ist 17 nicht nutzbar, da darauf ein Signal für den SPI-RAM liegt.

Dafür hat sich wohl irgendwann das Verhalten verändert. Scheinbar wurde das vorher ignoriert, und irgendwann nicht mehr.

Wenn man dem PSRAM sein Signal kaputt macht, geht er natürlich nicht mehr…

1 „Gefällt mir“

Das kommt mir ziemlich suspekt vor!

Dort scheint ein PIN z.B. mit 99 (unbenutzt) definiert zu sein, wird dann aber mit setPinMode(99, OUTPUT) gesetzt. Würde jetzt auf LPCD tippen. Den Schalter PN5180_ENABLE_LPCD auch mal rausnehmen? Oder kannst Du das anderweitig eingrenzen?

Edit: Unsere Beiträge haben sich überschnitten. Schön das Du den Fehler gefunden hast!
Läuft es jetzt mit Arduino 2?

3 „Gefällt mir“

Ja, scheint jetzt zu laufen. Ich habe natürlich trotzdem keine eigentliche Hardware angeschlossen (bis auf SD_MMC). Ist für mein aktuelles Vorhaben aber auch nicht nötig.

Ärgerlich, dass so viel Zeit für so einen blöden Fehler draufgegangen ist.

1 „Gefällt mir“

FYI: Für mich ist der dev branch aktuell broken - ich baue das lolin_d32_pro_sdmmc_pe:

Compiling .pio\build\lolin_d32_pro_sdmmc_pe\src\System.cpp.o
src/Bluetooth.cpp: In function 'void Bluetooth_VolumeChanged(int)':
src/Bluetooth.cpp:153:18: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
   if (_newVolume < BLUETOOTHPLAYER_VOLUME_MIN) {
                  ^
src/Bluetooth.cpp: In function 'void Bluetooth_Init()':
src/Bluetooth.cpp:176:37: warning: missing initializer for member 'i2s_pin_config_t::mck_io_num' [-Wmissing-field-initializers]
     .data_in_num = I2S_PIN_NO_CHANGE};
                                     ^
src/Bluetooth.cpp: In function 'void Bluetooth_SetVolume(int32_t, bool)':
src/Bluetooth.cpp:283:18: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
   if (_newVolume < BLUETOOTHPLAYER_VOLUME_MIN) {
                  ^
Compiling .pio\build\lolin_d32_pro_sdmmc_pe\src\Web.cpp.o
Compiling .pio\build\lolin_d32_pro_sdmmc_pe\src\Wlan.cpp.o
Compiling .pio\build\lolin_d32_pro_sdmmc_pe\src\main.cpp.o
Building .pio\build\lolin_d32_pro_sdmmc_pe\bootloader.bin
Generating partitions .pio\build\lolin_d32_pro_sdmmc_pe\partitions.bin
In file included from src/AudioPlayer.cpp:7:
src/Common.h: In function 'bool isNumber(const char*)':
src/Common.h:11:2: error: reference to 'byte' is ambiguous
  byte i = 0;
  ^~~~
In file included from c:\users\uli\.platformio\packages\toolchain-xtensa-esp32@8.4.0+2021r2-patch5\xtensa-esp32-elf\include\c++\8.4.0\cmath:42,
                 from c:\users\uli\.platformio\packages\toolchain-xtensa-esp32@8.4.0+2021r2-patch5\xtensa-esp32-elf\include\c++\8.4.0\math.h:36,
                 from C:/Users/Uli/.platformio/packages/framework-arduinoespressif32/cores/esp32/esp32-hal.h:30,
                 from C:/Users/Uli/.platformio/packages/framework-arduinoespressif32/cores/esp32/Arduino.h:36,
                 from src/AudioPlayer.cpp:1:
c:\users\uli\.platformio\packages\toolchain-xtensa-esp32@8.4.0+2021r2-patch5\xtensa-esp32-elf\include\c++\8.4.0\bits\cpp_type_traits.h:395:30: note: candidates are: 'enum class std::byte'
   enum class byte : unsigned char;
                              ^~~~
In file included from src/AudioPlayer.cpp:1:
C:/Users/Uli/.platformio/packages/framework-arduinoespressif32/cores/esp32/Arduino.h:133:17: note:                 'typedef uint8_t byte'
 typedef uint8_t byte;
                 ^~~~
In file included from src/AudioPlayer.cpp:7:
src/Common.h:13:17: error: 'i' was not declared in this scope
  while (*(str + i) != '\0') {
                 ^
src/Common.h:19:6: error: 'i' was not declared in this scope
  if (i > 0) {
      ^
In file included from .pio/libdeps/lolin_d32_pro_sdmmc_pe/FastLED/src/FastLED.h:75,
                 from src/Led.cpp:16:
.pio/libdeps/lolin_d32_pro_sdmmc_pe/FastLED/src/fastspi.h:157:23: note: #pragma message: No hardware SPI pins defined.  All SPI access will default to bitbanged output
 #      pragma message "No hardware SPI pins defined.  All SPI access will default to bitbanged output"
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
esptool.py v4.5
Creating esp32 image...
Merged 1 ELF section
Successfully created esp32 image.
Compiling .pio\build\lolin_d32_pro_sdmmc_pe\lib56e\FS\FS.cpp.o
Compiling .pio\build\lolin_d32_pro_sdmmc_pe\lib56e\FS\vfs_api.cpp.o
Compiling .pio\build\lolin_d32_pro_sdmmc_pe\libbfc\FFat\FFat.cpp.o
Compiling .pio\build\lolin_d32_pro_sdmmc_pe\lib455\SPI\SPI.cpp.o
Compiling .pio\build\lolin_d32_pro_sdmmc_pe\libb94\SD\SD.cpp.o
*** [.pio\build\lolin_d32_pro_sdmmc_pe\src\AudioPlayer.cpp.o] Error 1
src/Port.cpp: In function 'void Port_Write(uint8_t, bool, bool)':
src/Port.cpp:100:16: warning: comparison is always true due to limited range of data type [-Wtype-limits]
   if (_channel >= 0 && _channel <= MAX_GPIO) {
       ~~~~~~~~~^~~~
src/RfidMfrc522.cpp: In function 'void Rfid_Task(void*)':
src/RfidMfrc522.cpp:61:11: warning: unused variable 'control' [-Wunused-variable]
   uint8_t control = 0x00;
           ^~~~~~~
src/SdCard.cpp: In function 'char** SdCard_ReturnPlaylist(const char*, uint32_t)':
src/SdCard.cpp:292:83: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
   if (fileOrDirectory && !fileOrDirectory.isDirectory() && fileOrDirectory.size() >= 0) {
                                                            ~~~~~~~~~~~~~~~~~~~~~~~^~~~
src/Mqtt.cpp:289:6: warning: 'void Mqtt_ClientCallback(const char*, const byte*, uint32_t)' defined but not used [-Wunused-function]
 void Mqtt_ClientCallback(const char *topic, const byte *payload, uint32_t length) {
      ^~~~~~~~~~~~~~~~~~~
src/Mqtt.cpp:203:6: warning: 'bool Mqtt_Reconnect()' defined but not used [-Wunused-function]
 bool Mqtt_Reconnect() {
      ^~~~~~~~~~~~~~
src/Mqtt.cpp:189:6: warning: 'void Mqtt_PostWiFiRssi()' defined but not used [-Wunused-function]
 void Mqtt_PostWiFiRssi(void) {
      ^~~~~~~~~~~~~~~~~
src/Web.cpp: In function 'void Web_DeleteCachefile(const char*)':
src/Web.cpp:1025:43: warning: '%s' directive output may be truncated writing up to 255 bytes into a region of size 253 [-Wformat-truncation=]
    snprintf(Log_Buffer, Log_BufferLength, "%s: %s", (char *) FPSTR(erasePlaylistCachefile), cacheFile);
                                           ^~~~~~~~                                          ~~~~~~~~~
src/Web.cpp:1025:12: note: 'snprintf' output 3 or more bytes (assuming 258) into a destination of size 255
    snprintf(Log_Buffer, Log_BufferLength, "%s: %s", (char *) FPSTR(erasePlaylistCachefile), cacheFile);
    ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/Web.cpp: In function 'void explorerHandleRenameRequest(AsyncWebServerRequest*)':
src/Web.cpp:1167:46: warning: '%s' directive output may be truncated writing 18 bytes into a region of size between 0 and 255 [-Wformat-truncation=]
     snprintf(cacheFile, MAX_FILEPATH_LENTGH, "%s/%s", dstFullFilePath, playlistCacheFile);
                                              ^~~~~~~                   ~~~~~~~~~~~~~~~~~
src/Web.cpp:1167:13: note: 'snprintf' output between 20 and 275 bytes into a destination of size 256
     snprintf(cacheFile, MAX_FILEPATH_LENTGH, "%s/%s", dstFullFilePath, playlistCacheFile);
     ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/Web.cpp: In function 'void Web_DumpSdToNvs(const char*)':
src/Web.cpp:1279:44: warning: '%s' directive output may be truncated writing up to 274 bytes into a region of size between 229 and 245 [-Wformat-truncation=]
     snprintf(Log_Buffer, Log_BufferLength, "[%u] %s: %s => %s", ++importCount, (char *) FPSTR(writeEntryToNvs), nvsEntry[0].nvsKey, nvsEntry[0].nvsEntry);
                                            ^~~~~~~~~~~~~~~~~~~                                                                      ~~~~~~~~~~~~~~~~~~~~
src/Web.cpp:1279:13: note: 'snprintf' output 11 or more bytes (assuming 301) into a destination of size 255
     snprintf(Log_Buffer, Log_BufferLength, "[%u] %s: %s => %s", ++importCount, (char *) FPSTR(writeEntryToNvs), nvsEntry[0].nvsKey, nvsEntry[0].nvsEntry);
     ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/Web.cpp: In function 'void handleCoverImageRequest(AsyncWebServerRequest*)':
src/Web.cpp:1397:41: warning: '%s' directive output may be truncated writing up to 254 bytes into a region of size 236 [-Wformat-truncation=]
  snprintf(Log_Buffer, Log_BufferLength, "serve cover image (%s): %s", (char *) mimeType, coverFileName);
                                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/Web.cpp:1397:10: note: 'snprintf' output 23 or more bytes (assuming 277) into a destination of size 255
  snprintf(Log_Buffer, Log_BufferLength, "serve cover image (%s): %s", (char *) mimeType, coverFileName);
  ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ich weiss es ist nur der dev branch (und den soll man ja nicht produktiv nutzen) aber ich vermute dass das so nicht gedacht ist :wink: Ich bin gerade auf der Suche warum mein Akku eigentlich dauernd leer ist - daher wars einen Versuch wert. Leider bin ich in C++ nicht so richtig firm - das überlasse ich euch Profis :wink:

Vermutlich sind alle Fehler mit dem error: reference to 'byte' is ambiguous verbunden. Dort soll man sich zwischen enum class byte : unsigned char; und typedef uint8_t byte; wohl entscheiden.

Ich habe eben den Commit von @tueddy gemerged. Aktualisiere mal bitte dein Repository und teste nochmal.

1 „Gefällt mir“

Damn - das war schnell. Den Beitrag hab ich leider übersehen, sorry! Danke sehr - nun tat es! Mal beobachten ob mein Fehler nun verschwindet…

So, ne ganze Weile her.
Habe mich bisschen schwer getan mit dem testen, mein Zwischenfazit ist aber wie folgt:
Man bekommt es auf viele Arten schlechter, ganz viele verschiedene Umbauten und Ändrungen kommen aber immer wieder zu ziemlich gleichen Geschwindigkeiten :-/ …
Paar Fragen die sich mir im Zuge des Experimentierens gestellt haben:

  • Wo kann man die Zuordnung des Web-Tasks und die Priorität anpassen?
  • Gibt es noch andere möglichkeiten performanter auf die SD-Karte zu schreiben?
  • Woher kommt der Geschwindigkeits-Peak am Anfang?
    – Ziemlich unabhängig von der Buffer Größe
    – Vielleicht abhängig von der SD-Karte?

Gehe da gerne noch tiefer, bin für Ideen aber dankbar :slight_smile:

Idealerweise bekommen Webserver-Task (zum Annehmen der Daten) und explorerHandleFileStorageTask (Zum Schreiben der Daten auf SD) ausbalancierte Rechenzeit zugewiesen. Ist ein Task langsamer muss er auf den anderen warten und die Upload-Rate sinkt. Du kannst die Priorität und den Core beim Erzeugen des Tasks setzen, z.B. hier.

Gibt es noch andere möglichkeiten performanter auf die SD-Karte zu schreiben?

Ja mit größerem oder besser gefüllten Puffer. Je mehr Chunks geschrieben werden desto langsamer ist das. Oder Du machst das Schreiben auf SD schneller z.B. mit 4-Bit MMC, dafür braucht man aber 3 GPIOs mehr, die haben wir nicht.

Woher kommt der Geschwindigkeits-Peak am Anfang?
– Ziemlich unabhängig von der Buffer Größe
– Vielleicht abhängig von der SD-Karte?

Ich denke das ist auch ein wenig abhängig vom Browser. Mit MS-Edge Chromium habe ich so einen Peak nicht. Natürlich ist die Berechnung der Upload-Rate zu Anfang ungenauer und pendelt sich erst ein wenn genug Daten übertragen wurden. Ich führe daher die Messung immer zum Schluss durch. 300 KB/s für die ganze Datei ist dann aussagekräftig, egal wie der Status vorher „rumeiert“

Die Optimierung die jetzt erstmal rausgeflogen ist (weil sie fehlerhafte Dateien erzeugte) hat den Ringpuffer besser gefüllt um größere Blöcke/Chunks auf einmal zu schreiben.

Wenn Du das optimieren möchtest kannst Du natürlich alle Kombinationen durchprobieren oder die tatsächliche Taskauslastung messen

@Joe91 Teste mal mit verschiedenen Browsern, Firefox, Chrome, Edge, Safari. Schwankt das immer zu Anfang so stark wie beschrieben?

1 „Gefällt mir“

Vielen Dank für diene Antwort. Bin bis jetzt vor allem mit Firefox unterwegs gewesen.
Die gezeigte Stelle mit dem Task habe ich gefunden (und auch experimentiert damit), der Traffic wird aber ja von einem anderen Task eingetaktet, den ich noch nicht entdeckt habe.
Auch der Rückbau / Umbau deiner Änderung hat bei mir keinen messbaren Unterschied in Firefox gebracht, der Hinweis mit den verschiedenen Browsern ist aber hilfreich!

Ja das ist auch wirklich schwer zu finden weil völlig außerhalb dieses Projekts. Wir verwenden als Webserver ESPAsyncWebserver, der basiert auf AsyncTCP und der Task wird gaanz tief unten hier erzeugt.
Wir pinnen derzeit den Task an einen festen Core in der platform.ini mit

build_flags = ...
              -DCONFIG_ASYNC_TCP_RUNNING_CORE=1
              -DCONFIG_ASYNC_TCP_USE_WDT=1

um stabilere Uploadraten zu erhalten…

1 „Gefällt mir“

Ein weiteres Bugfix-Release Arduino 2.0.8 wurde soeben veröffentlicht:

Werde es die nächsten Tage mal testen. Was super ist: Die optimierte Verzeichnisauflistung mit
getNextFileName(&isDir) nun offiziell enthalten!
Damit ist diese Optimierung auch nicht länger ein Hack. Wenn Alles wie gewünscht funktioniert werde ich dann einen PR dafür erstellen…

4 „Gefällt mir“

Konnte 2.0.8 jetzt mal testen aber es gibt neue Probleme. Durch diesen etwas ungeschickten Bugfix gibt es Fehler beim Komplieren. Ich habe das bereits in der PN5180 Bibliothek angepasst aber für RC522 müsste das der Autor übernehmen. Habe dazu auch ein Issue aufgemacht.
Ich sehe sowohl für 2.0.7 als auch 2.0.8 die ESP-IDF Version 4.4.4. Da hat sich also Nichts geändert.

Irgendwas ist immer - Also nur etwas für die frühen Vögel…

1 „Gefällt mir“

Beim RC522 ist halt die Frage, ob da was passiert. Er schreibt ja selbst im Repository

The development by owner miguelbalboa has ended.

Aber gut, das kann man zur Not auch forken und selbst anpassen.

1 „Gefällt mir“

Bzw, wir könnten auch die neue lib die verlinkt ist anschauen: GitHub - OSSLibraries/Arduino_MFRC522v2

Diese wird aber das gleiche problem mit 2.0.8 haben (zumindest bis espressif/arduino-esp32#8111 einfließt):

  // Get human readable code and type
  static const __FlashStringHelper *PICC_GetTypeName(PICC_Type type);
  static const __FlashStringHelper *GetStatusCodeName(StatusCode code);

(minirant):
So ganz verstehe ich die Idee mit der Rückgabe von einem __FlashStringHelper * nicht, ich würde hier eher ein const String als Rückgabe erwarten (oder wenn es hardcore C sein soll const char* mit Warnung, dass es ein PROGMEM ist).
__FlashStringHelper ist in erster Linie ein Helper von String um zwischen const char * (liegt im RAM → String verwendet memcpy & co) und const PROGMEM char * (liegt in Flash → String verwendet memcpy_P & co). Das sieht man sehr schön in WString.cpp:170.

1 „Gefällt mir“

Die Regression mit diesem __FlashStringHelper hat wohl so genervt das es jjetzt noch ein neues Arduino-Release gibt:

Das wird wohl auch das letzte Arduino 2 Release (IDF 4.4) sein, die nächste Version 3 wird dann auf dem Espressif IDF 5 basieren. Bis dahin wird aber wohl noch einige Zeit vergehen.

Arduino 2 ist ja schon länger im DEV-Branch verfügbar und scheint reibungslos zu laufen, wer möchte kann es ausprobieren. Sobald es auch ein offizielles PlatformIO package gibt können wir dort die festgepinnten Bibliotheken wieder entfernen.

In den letzten Version 2.0.7-2.0.9 konnte ich auch keine schwankenden Web-Uploadraten mehr feststellen, meine Uploadgeschwindigkeit liegt dauerhaft bei ca. 450 KB/s

1 „Gefällt mir“

Oh, das klingt aber gut. D.h. wir haben jetzt einen gefixten Ringbuffer und dazu die schnellen Uploadraten von vorher?
Ich komme leider aktuell selbst nicht zum Testen, daher muss ich dumm fragen :woman_shrugging:.

Hi Torsten,

ich sage dazu erstmal: JA
Die Sache mit dem schwankenden Upload war ja immer etwas strange & schwer zu reprodzieren. Manchmal trat das einfach nach 5 Resets einfach so auf. Das habe ich aber nicht mehr gehabt. Insgesamt läuft Alles wie gewünscht & ich teste ja auch mit verschiedenen Platinen und Konfigurationen.

Hat noch wer Probleme mit Schwankungen/Einbruch der Uploadrate beim Hochladen aus der Web-UI?

3 „Gefällt mir“

Sommerloch-Info:

Neue & wohl letzte Runde: Arduino 2.0.10 ist veröffentlicht, ein kleines Bugfix Release basierend auf ESP-IDF 4.4.5.
Hab’s vorab getestet & es läuft Alles wie gewünscht. Sporadische Probleme mit WPA3 Verbindungen bestehen aber weiterhin:

[ 459 ]  Arduino version: 2.0.10
[ 470 ]  ESP-IDF version: v4.4.5
[ 3770 ][E][WiFiGeneric.cpp:1268] mode(): Could not set mode! 12289
[ 3770 ][E][WiFiSTA.cpp:299] begin(): STA enable failed!
[ 3801 ]  Versuche mit WLAN 'MyWLAN' zu verbinden...
[ 8564 ]  WLAN 'WLAN-89XPXA'gefunden (Signalstärke: -70 dBm, Kanal: 6, MAC-Adresse: C4:86:E9:43:F5:B8)
[ 8575 ]  WLAN 'MyWLAN'gefunden (Signalstärke: -72 dBm, Kanal: 1, MAC-Adresse: 98:9B:CB:AB:8B:63)
[ 8627 ]  WLAN 'Trenet'gefunden (Signalstärke: -89 dBm, Kanal: 6, MAC-Adresse: F4:06:8D:43:F3:8D)
[ 8723 ]  Versuche mit WLAN 'MyWLAN' zu verbinden...
[ 10673 ]  Verbunden mit WLAN 'MyWLAN' (Signalstärke: -71 dBm, Kanal: 1, MAC-Adresse: 98:9B:CB:AB:8B:63)
[ 10673 ]  Aktuelle IP: 192.168.178.72
[ 10685 ]  Synchronisiere Uhrzeit via NTP...

Ab & an öffnet sich der ESPuino dann auch im AP-Modus. Evt. müssen wir bei WPA3 Verbindungsherstellung noch länger warten oder aggressiver neu verbinden…

Wenn das dazugehörige Platform-IO Package veröffentlicht ist werde ich das zeitnah im DEV-Baranch verfügbar machen.

2 „Gefällt mir“

Haben wir eigentlich eine Möglichkeit, WPA3 zu blocken? Also im meinem Fall wäre das (vermutlich) eine feine Sache, ich habe jedoch auf die Schnelle nix gefunden.