Forum: Mikrocontroller und Digitale Elektronik Webapp-stack auf STM32 (und ESP8266)


von Rabenopa (Gast)


Lesenswert?

Moin,

mich würden mal eure Einblicke in die aktuellen Trends von Embedded Web 
Applications interessieren. Was nutzt ihr so, wenn es darum geht 
halbwegs moderne User und Developer Experience (Richtung single page 
application) und minimalen Footprint (in meinem Fall auf STM32 mit z.B. 
64k) zu vereinbaren? Gibt es Faustregeln, mit denen ich abschätzen kann, 
was so die Grenzen des Machbaren sind?

von Εrnst B. (ernst)


Lesenswert?

Zuerstmal die obligatorische dumme frage:

Warum auf dem STM32 mit nur 64k?
Pack die Webseite auf den ESP!
Den STM kannst du als "Co-Prozessor" immer noch dazuklemmen.

von mppt (Gast)


Lesenswert?

Rabenopa schrieb:
> halbwegs moderne User und Developer Experience (Richtung single page
> application) und minimalen Footprint

Das schließt sich ja wohl gegenseitig aus. Wenn man heute sieht was für 
ein Datenmüll auf einem ESP32 landet um ein paar simple Webseite 
anzuzeigen oder 5 Werte an Konfiguration einzugeben kann einem schlecht 
werden. Libs über Libs. Ich hab mir für den ESP32 Arduino 2.0.5 mal die 
Mühe gemacht ein makefile zu schreiben. Allein das als Libs von 
Expressif (natürlich binär ohne Quellcode) ist da nötig:
1
LIBS2  = -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump 
2
LIBS2 += -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc 
3
LIBS2 += -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lasio -lbt -lcbor -lunity -lcmock -lcoap -lnghttp 
4
LIBS2 += -lesp-tls -lesp_adc_cal -lesp_hid -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lesp_lcd -lprotobuf-c -lprotocomm -lmdns 
5
LIBS2 += -lesp_local_ctrl -lsdmmc -lesp_serial_slave_link -lesp_websocket_client -lexpat -lwear_levelling -lfatfs -lfreemodbus -ljsmn -ljson -llibsodium 
6
LIBS2 += -lmqtt -lopenssl -lperfmon -lspiffs -lulp -lwifi_provisioning -lgpio_button -ljson_parser -ljson_generator -lesp_schedule -lesp_rainmaker -lqrcode 
7
LIBS2 += -lws2812_led -lesp-dsp -lesp32-camera -lesp_littlefs -lfb_gfx -lasio -lcbor -lcmock -lunity -lcoap -lesp_lcd -lesp_local_ctrl -lesp_websocket_client 
8
LIBS2 += -lexpat -lfreemodbus -ljsmn -llibsodium -lperfmon -lesp_adc_cal -lesp_hid -lfatfs -lwear_levelling -lopenssl -lspiffs -lesp_rainmaker -lmqtt -lwifi_provisioning 
9
LIBS2 += -lprotocomm -lbt -lbtdm_app -lprotobuf-c -lmdns -ljson -ljson_parser -ljson_generator -lesp_schedule -lqrcode -lcat_face_detect -lhuman_face_detect -lcolor_detect 
10
LIBS2 += -lmfn -ldl -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump 
11
LIBS2 += -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support 
12
LIBS2 += -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc 
13
LIBS2 += -lesp_serial_slave_link -lulp -lmbedtls -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver 
14
LIBS2 += -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs 
15
LIBS2 += -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common 
16
LIBS2 += -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota 
17
LIBS2 += -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi 
18
LIBS2 += -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy 
19
LIBS2 += -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support 
20
LIBS2 += -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client 
21
LIBS2 += -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow 
22
LIBS2 += -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support 
23
LIBS2 += -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter 
24
LIBS2 += -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer 
25
LIBS2 += -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc 
26
LIBS2 += -lesp_serial_slave_link -lulp -lmbedtls -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi 
27
LIBS2 += -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub 
28
LIBS2 += -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi 
29
LIBS2 += -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp 
30
LIBS2 += -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls 
31
LIBS2 += -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lphy -lrtc -lesp_phy -lphy 
32
LIBS2 += -lrtc -lesp_phy -lphy -lrtc -lxt_hal -lm -lnewlib -lstdc++ -lpthread -lgcc -lcxx -lapp_trace -lgcov -lapp_trace -lgcov -lc -lmbedtls_2

Da ist der ganze Arduino-Kram noch nicht dabei. Ich frage mich manchmal 
wo das noch hinführen soll.
Beim Versuch so ein Projekt wie dieses:
https://ecocurious.de/projekte/multigeiger-2/
zu bauen, stürzt das ganze ab mit ständigen Reboots des ESP32. Man muss 
Plattformio nehmen und dann auch nur eine bestimmte Version. 
Arduino-ESP32 geht nur bis 1.0.6 alle 2er Versionen nicht mehr. 
Reproduzierbare Abstürze in den binären Libs vom ESP32. Ich konnte das 
fixen in dem ich die Register des mcpwm-Timers direkt beschrieben habe 
anstelle von set_frequecy() ö.ä.
Da wird sicher wieder eine double-Division drin sein die das ganze 
Crashen lässt wenn man es aus einem Interrupt aufruft. Selbst an der 
richtigen Stelle fixen geht nicht, da die Libs binär sind.
Alles in allem hasse ich den ESP32 genau so wie den ESP8622. Das 
Preis-Leistungsverhältnis ist sicher gut, aber die ganze Infrastruktur 
ist weit von optimal entfernt. Mehr als Bastelprojekte sind damit wohl 
kaum möglich.
Und da kann ich den o.g. Ansatz nur zu gut verstehen und die Dinger 
höchstens als Co-Prozessoren für reine Kommunikation/Konfiguration zu 
verwenden.

von Εrnst B. (ernst)


Lesenswert?

mppt schrieb:
> Und da kann ich den o.g. Ansatz nur zu gut verstehen und die Dinger
> höchstens als Co-Prozessoren für reine Kommunikation/Konfiguration zu
> verwenden.

Ja. Aber du hast die Wahl, auf welcher Ebene das passiert. Statt da per 
+AT-Kommandos auf TCP-Ebene rumzukrebsen, kannst du auch komplett HTTP, 
HTML-Templating, Ausliefern statischer Files, Websocket-Server usw. auf 
den ESP auslagern.

Der ist dann immer nur noch ein "Kommunikations-Coprozessor".
Wenn man die "Sprache" zwischen ihm und dem "Hauptprozessor" halbwegs 
vernünftig anlegt, ist auch beides getrennt schön testbar.

mppt schrieb:
> LIBS2....

Irgendwas kopiert oder rausge-"grep"-t, was du selber nicht verstehst, 
und das soll jetzt als Totschlag-Argument herhalten?

Geht auch umgekehrt: Die AT-Firmware auf dem ESP ist mit demselben SDK 
und denselben Bibliotheken erstellt worden. Also genauso böse?

von J. S. (jojos)


Lesenswert?

die Libs sind ja da weil die Funktionen gebraucht werden. Sollte alles 
in ein Modul geschrieben werden? Ein System mit Web (mit HTTPS) und RTOS 
ist nun mal etwas komplexer.
In anderen Anwendungen mit ESP32 wie z.B. Tasmota sind auch unzählige 
Libs zusammengebaut, und das läuft und läuft und läuft.
PlattformIO ist da auch um Längen besser als die Arduino IDE weil es 
eine ordentliche Libraryverwaltung hat und konkrete Versionen angegeben 
werden können. Bei der Arduino IDE ist das ein Glücksspiel.

von mppt (Gast)


Lesenswert?

Εrnst B. schrieb:
> Irgendwas kopiert oder rausge-"grep"-t, was du selber nicht verstehst,
> und das soll jetzt als Totschlag-Argument herhalten?

Bist du blöd? Das habe ich aus meinen von Hand selbst geschriebenen 
makefile kompiert um zu zeigen wieviel libs aus unbekannten Quellen man 
sich da ins Boot holt. Als Binarie und völlig ohne Kontrolle. Code der 
in solchen Libs vor sich hin schläft um irgendwann mal böse Dinge zu 
tun, erkennt niemand mehr. Auch weil niemand danach sucht.

J. S. schrieb:
> In anderen Anwendungen mit ESP32 wie z.B. Tasmota sind auch unzählige
> Libs zusammengebaut, und das läuft und läuft und läuft.
Schön für alle die meinen fette Firewalls und Virenscanner zu brauchen 
aber bei allem was IoT betrifft blindes Gottvertrauen haben.

> PlattformIO ist da auch um Längen besser als die Arduino IDE weil es
> eine ordentliche Libraryverwaltung hat und konkrete Versionen angegeben
> werden können. Bei der Arduino IDE ist das ein Glücksspiel.
Man muss nicht die Arduino IDE verwenden. Mit arduino-cli kann man auch 
alle Abhängigkeiten mit entsprechenden Versionen local in relativen 
Verzeichnissen halten und damit eine Umgebung für ein Projekt schaffen 
das nicht mit anderen Projekten kollidiert.
Ich bevorzuge halt meine eigenen makefile-Umgebung.

von Εrnst B. (ernst)


Lesenswert?

mppt schrieb:
> Das habe ich aus meinen von Hand selbst geschriebenen
> makefile kompiert um zu zeigen wieviel libs aus unbekannten Quellen man
> sich da ins Boot holt.

Und damit die Liste länger wird, hast du dieselben libs immer und immer 
wieder eingetragen, in der Hoffnung dass das beim Lesen hier nicht 
auffällt?

Ansonsten: Sei doch froh, dass es soviele kleine Libs sind. Da hast du 
wenigstens etwas Kontrolle, was im Binary landet.

bei einem "-lesp_everything", wär deine Linker-Kommandozeile kürzer, 
aber isses das wert?

von Stefan F. (Gast)


Lesenswert?

Εrnst B. schrieb:
> Und damit die Liste länger wird, hast du dieselben libs immer und immer
> wieder eingetragen, in der Hoffnung dass das beim Lesen hier nicht
> auffällt?

Geil. Warum macht man das?

von mppt (Gast)


Lesenswert?

Εrnst B. schrieb:
> Und damit die Liste länger wird, hast du dieselben libs immer und immer
> wieder eingetragen, in der Hoffnung dass das beim Lesen hier nicht
> auffällt?
>
> Ansonsten: Sei doch froh, dass es soviele kleine Libs sind. Da hast du
> wenigstens etwas Kontrolle, was im Binary landet.
>
> bei einem "-lesp_everything", wär deine Linker-Kommandozeile kürzer,
> aber isses das wert?

Wenn hier einer denkt ich denke mir das nur aus um jemanden zu ärgern. 
Hier ist der log der Linkerzeile vom Arduino beim o.g. 
Multigeiger-Projekt
1
"I:\\MultiGeiger\\arduino\\data\\packages\\esp32\\tools\\xtensa-esp32-elf-gcc\\gcc8_4_0-esp-2021r2-patch3/bin/xtensa-esp32-elf-g++" "-Wl,--Map=i:\\MultiGeiger\\build/multigeiger.ino.map" "-LI:\\MultiGeiger\\arduino\\data\\packages\\esp32\\hardware\\esp32\\2.0.5/tools/sdk/esp32/lib" "-LI:\\MultiGeiger\\arduino\\data\\packages\\esp32\\hardware\\esp32\\2.0.5/tools/sdk/esp32/ld" "-LI:\\MultiGeiger\\arduino\\data\\packages\\esp32\\hardware\\esp32\\2.0.5/tools/sdk/esp32/dio_qspi" -T esp32.rom.redefined.ld -T memory.ld -T sections.ld -T esp32.rom.ld -T esp32.rom.api.ld -T esp32.rom.libgcc.ld -T esp32.rom.newlib-data.ld -T esp32.rom.syscalls.ld -T esp32.peripherals.ld -mlongcalls -Wno-frame-address -Wl,--cref -Wl,--gc-sections -fno-rtti -fno-lto -u ld_include_hli_vectors_bt -u _Z5setupv -u _Z4loopv -u esp_app_desc -u pthread_include_pthread_impl -u pthread_include_pthread_cond_impl -u pthread_include_pthread_local_storage_impl -u pthread_include_pthread_rwlock_impl -u include_esp_phy_override -u ld_include_highint_hdl -u start_app -u start_app_other_cores -u __ubsan_include -Wl,--wrap=longjmp -u __assert_func -u vfs_include_syscalls_impl -Wl,--undefined=uxTopUsedPriority -u app_main -u newlib_include_heap_impl -u newlib_include_syscalls_impl -u newlib_include_pthread_impl -u newlib_include_assert_impl -u __cxa_guard_dummy -Dhal_init=LMICHAL_init -DESP32 -DCFG_eu868=1 -DCFG_sx1276_radio=1 -DARDUINO_LMIC_PROJECT_CONFIG_H_SUPPRESS=1 -Wl,--start-group "sketch\\ble.cpp.o" "sketch\\chkhardware.cpp.o" "sketch\\clock.cpp.o" "sketch\\display.cpp.o" "sketch\\log.cpp.o" "sketch\\log_data.cpp.o" "sketch\\loraWan.cpp.o" "sketch\\multigeiger.ino.cpp.o" "sketch\\speaker.cpp.o" "sketch\\switches.cpp.o" "sketch\\thp_sensor.cpp.o" "sketch\\timers.cpp.o" "sketch\\transmission.cpp.o" "sketch\\tube.cpp.o" "sketch\\utils.cpp.o" "sketch\\webconf.cpp.o" "libraries\\IotWebConf\\IotWebConf.cpp.o" "libraries\\IotWebConf\\IotWebConfMultipleWifi.cpp.o" "libraries\\IotWebConf\\IotWebConfOptionalGroup.cpp.o" "libraries\\IotWebConf\\IotWebConfParameter.cpp.o" "libraries\\WiFi\\WiFi.cpp.o" "libraries\\WiFi\\WiFiAP.cpp.o" "libraries\\WiFi\\WiFiClient.cpp.o" "libraries\\WiFi\\WiFiGeneric.cpp.o" "libraries\\WiFi\\WiFiMulti.cpp.o" "libraries\\WiFi\\WiFiSTA.cpp.o" "libraries\\WiFi\\WiFiScan.cpp.o" "libraries\\WiFi\\WiFiServer.cpp.o" "libraries\\WiFi\\WiFiUdp.cpp.o" "libraries\\WebServer\\Parsing.cpp.o" "libraries\\WebServer\\WebServer.cpp.o" "libraries\\WebServer\\detail\\mimetable.cpp.o" "libraries\\DNSServer\\DNSServer.cpp.o" "libraries\\NimBLE-Arduino\\NimBLE2904.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEAddress.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEAdvertisedDevice.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEAdvertising.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEBeacon.cpp.o" "libraries\\NimBLE-Arduino\\NimBLECharacteristic.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEClient.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEDescriptor.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEDevice.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEEddystoneTLM.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEEddystoneURL.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEExtAdvertising.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEHIDDevice.cpp.o" "libraries\\NimBLE-Arduino\\NimBLERemoteCharacteristic.cpp.o" "libraries\\NimBLE-Arduino\\NimBLERemoteDescriptor.cpp.o" "libraries\\NimBLE-Arduino\\NimBLERemoteService.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEScan.cpp.o" "libraries\\NimBLE-Arduino\\NimBLESecurity.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEServer.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEService.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEUUID.cpp.o" "libraries\\NimBLE-Arduino\\NimBLEUtils.cpp.o" "libraries\\NimBLE-Arduino\\nimble\\esp_port\\esp-hci\\src\\esp_nimble_hci.c.o" "libraries\\NimBLE-Arduino\\nimble\\esp_port\\port\\src\\esp_nimble_mem.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\aes_decrypt.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\aes_encrypt.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\cbc_mode.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\ccm_mode.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\cmac_mode.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\ctr_mode.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\ctr_prng.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\ecc.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\ecc_dh.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\ecc_dsa.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\ecc_platform_specific.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\hmac.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\hmac_prng.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\sha256.c.o" "libraries\\NimBLE-Arduino\\nimble\\ext\\tinycrypt\\src\\utils.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_adv.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_conn.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_conn_hci.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_ctrl.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_dtm.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_hci.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_hci_ev.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_iso.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_rand.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_resolv.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_rfmgmt.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_scan.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_sched.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_supp_cmd.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_sync.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_trace.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_utils.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\controller\\src\\ble_ll_whitelist.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\drivers\\nrf51\\src\\ble_hw.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\drivers\\nrf51\\src\\ble_phy.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\drivers\\nrf52\\src\\ble_hw.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\drivers\\nrf52\\src\\ble_phy.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\drivers\\nrf52\\src\\ble_phy_trace.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\access.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\adv.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\aes-ccm.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\app_keys.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\beacon.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\cdb.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\cfg.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\cfg_cli.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\cfg_srv.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\crypto.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\friend.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\glue.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\health_cli.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\health_srv.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\heartbeat.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\light_model.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\lpn.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\mesh.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\model_cli.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\model_srv.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\net.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\nodes.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\pb_adv.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\pb_gatt.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\prov.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\prov_device.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\provisioner.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\proxy.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\rpl.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\settings.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\shell.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\subnet.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\mesh\\src\\transport.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\services\\ans\\src\\ble_svc_ans.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\services\\bas\\src\\ble_svc_bas.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\services\\dis\\src\\ble_svc_dis.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\services\\gap\\src\\ble_svc_gap.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\services\\gatt\\src\\ble_svc_gatt.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\services\\ias\\src\\ble_svc_ias.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\services\\ipss\\src\\ble_svc_ipss.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\services\\lls\\src\\ble_svc_lls.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_att.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_att_clt.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_att_cmd.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_att_svr.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_eddystone.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_gap.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_gattc.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_gatts.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_gatts_lcl.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_adv.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_atomic.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_cfg.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_conn.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_flow.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_hci.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_hci_cmd.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_hci_evt.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_hci_util.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_id.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_log.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_mbuf.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_misc.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_mqueue.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_periodic_sync.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_pvcy.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_resolv.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_shutdown.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_startup.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_hs_stop.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_ibeacon.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_l2cap.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_l2cap_coc.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_l2cap_sig.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_l2cap_sig_cmd.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_monitor.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_sm.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_sm_alg.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_sm_cmd.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_sm_lgcy.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_sm_sc.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_store.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_store_util.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\src\\ble_uuid.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\store\\config\\src\\ble_store_config.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\store\\config\\src\\ble_store_config_conf.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\store\\config\\src\\ble_store_nvs.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\host\\util\\src\\addr.c.o" "libraries\\NimBLE-Arduino\\nimble\\nimble\\transport\\ram\\src\\ble_hci_ram.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\endian.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\hal_timer.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\hal_uart.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\mem.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\nimble_port.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\os_cputime.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\os_cputime_pwr2.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\os_mbuf.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\os_mempool.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\nimble\\src\\os_msys_init.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\npl\\freertos\\src\\nimble_port_freertos.c.o" "libraries\\NimBLE-Arduino\\nimble\\porting\\npl\\freertos\\src\\npl_os_freertos.c.o" "libraries\\U8g2\\U8g2lib.cpp.o" "libraries\\U8g2\\U8x8lib.cpp.o" "libraries\\U8g2\\clib\\mui.c.o" "libraries\\U8g2\\clib\\mui_u8g2.c.o" "libraries\\U8g2\\clib\\u8g2_bitmap.c.o" "libraries\\U8g2\\clib\\u8g2_box.c.o" "libraries\\U8g2\\clib\\u8g2_buffer.c.o" "libraries\\U8g2\\clib\\u8g2_button.c.o" "libraries\\U8g2\\clib\\u8g2_circle.c.o" "libraries\\U8g2\\clib\\u8g2_cleardisplay.c.o" "libraries\\U8g2\\clib\\u8g2_d_memory.c.o" "libraries\\U8g2\\clib\\u8g2_d_setup.c.o" "libraries\\U8g2\\clib\\u8g2_font.c.o" "libraries\\U8g2\\clib\\u8g2_fonts.c.o" "libraries\\U8g2\\clib\\u8g2_hvline.c.o" "libraries\\U8g2\\clib\\u8g2_input_value.c.o" "libraries\\U8g2\\clib\\u8g2_intersection.c.o" "libraries\\U8g2\\clib\\u8g2_kerning.c.o" "libraries\\U8g2\\clib\\u8g2_line.c.o" "libraries\\U8g2\\clib\\u8g2_ll_hvline.c.o" "libraries\\U8g2\\clib\\u8g2_message.c.o" "libraries\\U8g2\\clib\\u8g2_polygon.c.o" "libraries\\U8g2\\clib\\u8g2_selection_list.c.o" "libraries\\U8g2\\clib\\u8g2_setup.c.o" "libraries\\U8g2\\clib\\u8log.c.o" "libraries\\U8g2\\clib\\u8log_u8g2.c.o" "libraries\\U8g2\\clib\\u8log_u8x8.c.o" "libraries\\U8g2\\clib\\u8x8_8x8.c.o" "libraries\\U8g2\\clib\\u8x8_byte.c.o" "libraries\\U8g2\\clib\\u8x8_cad.c.o" "libraries\\U8g2\\clib\\u8x8_capture.c.o" "libraries\\U8g2\\clib\\u8x8_d_a2printer.c.o" "libraries\\U8g2\\clib\\u8x8_d_gp1247ai.c.o" "libraries\\U8g2\\clib\\u8x8_d_gp1287ai.c.o" "libraries\\U8g2\\clib\\u8x8_d_gu800.c.o" "libraries\\U8g2\\clib\\u8x8_d_hd44102.c.o" "libraries\\U8g2\\clib\\u8x8_d_il3820_296x128.c.o" "libraries\\U8g2\\clib\\u8x8_d_ist3020.c.o" "libraries\\U8g2\\clib\\u8x8_d_ist3088.c.o" "libraries\\U8g2\\clib\\u8x8_d_ist7920.c.o" "libraries\\U8g2\\clib\\u8x8_d_ks0108.c.o" "libraries\\U8g2\\clib\\u8x8_d_lc7981.c.o" "libraries\\U8g2\\clib\\u8x8_d_ld7032_60x32.c.o" "libraries\\U8g2\\clib\\u8x8_d_ls013b7dh03.c.o" "libraries\\U8g2\\clib\\u8x8_d_max7219.c.o" "libraries\\U8g2\\clib\\u8x8_d_pcd8544_84x48.c.o" "libraries\\U8g2\\clib\\u8x8_d_pcf8812.c.o" "libraries\\U8g2\\clib\\u8x8_d_pcf8814_hx1230.c.o" "libraries\\U8g2\\clib\\u8x8_d_s1d15721.c.o" "libraries\\U8g2\\clib\\u8x8_d_s1d15e06.c.o" "libraries\\U8g2\\clib\\u8x8_d_sbn1661.c.o" "libraries\\U8g2\\clib\\u8x8_d_sed1330.c.o" "libraries\\U8g2\\clib\\u8x8_d_sh1106_64x32.c.o" "libraries\\U8g2\\clib\\u8x8_d_sh1106_72x40.c.o" "libraries\\U8g2\\clib\\u8x8_d_sh1107.c.o" "libraries\\U8g2\\clib\\u8x8_d_sh1108.c.o" "libraries\\U8g2\\clib\\u8x8_d_sh1122.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1305.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1306_128x32.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1306_128x64_noname.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1306_2040x16.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1306_48x64.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1306_64x32.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1306_64x48.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1306_72x40.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1306_96x16.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1306_96x40.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1309.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1316.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1317.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1318.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1320.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1322.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1325.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1326.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1327.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1329.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1606_172x72.c.o" "libraries\\U8g2\\clib\\u8x8_d_ssd1607_200x200.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7511.c.o" "libraries\\U8g2\\clib\\u8x8_d_st75160.c.o" "libraries\\U8g2\\clib\\u8x8_d_st75256.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7528.c.o" "libraries\\U8g2\\clib\\u8x8_d_st75320.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7565.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7567.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7571.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7586s_erc240160.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7586s_jlx384160.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7586s_s028hn118a.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7586s_ymc240160.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7588.c.o" "libraries\\U8g2\\clib\\u8x8_d_st7920.c.o" "libraries\\U8g2\\clib\\u8x8_d_t6963.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1601.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1604.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1608.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1609.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1610.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1611.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1617.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1638.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1701_dogs102.c.o" "libraries\\U8g2\\clib\\u8x8_d_uc1701_mini12864.c.o" "libraries\\U8g2\\clib\\u8x8_debounce.c.o" "libraries\\U8g2\\clib\\u8x8_display.c.o" "libraries\\U8g2\\clib\\u8x8_fonts.c.o" "libraries\\U8g2\\clib\\u8x8_gpio.c.o" "libraries\\U8g2\\clib\\u8x8_input_value.c.o" "libraries\\U8g2\\clib\\u8x8_message.c.o" "libraries\\U8g2\\clib\\u8x8_selection_list.c.o" "libraries\\U8g2\\clib\\u8x8_setup.c.o" "libraries\\U8g2\\clib\\u8x8_string.c.o" "libraries\\U8g2\\clib\\u8x8_u16toa.c.o" "libraries\\U8g2\\clib\\u8x8_u8toa.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\aes\\ideetron\\AES-128_V10.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\aes\\lmic.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\aes\\other.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4420.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4551.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4610.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4611.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4612.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4617.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4618.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4630.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4801.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_catena4802.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_disco_l072cs_lrwan1.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_feather32u4lora.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_featherm0lora.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_heltec_lora32.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_thisboard.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_ttgo_lora32_v1.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\getpinmap_ttgo_lora32_v2.1.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\hal\\hal.cpp.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_as923.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_au915.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_channelshuffle.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_compliance.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_eu868.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_eu_like.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_in866.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_kr920.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_us915.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_us_like.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\lmic_util.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\oslmic.c.o" "libraries\\MCCI_LoRaWAN_LMIC_library\\lmic\\radio.c.o" "libraries\\SPI\\SPI.cpp.o" "libraries\\Adafruit_Unified_Sensor\\Adafruit_Sensor.cpp.o" "libraries\\Adafruit_BME280_Library\\Adafruit_BME280.cpp.o" "libraries\\Adafruit_BusIO\\Adafruit_BusIO_Register.cpp.o" "libraries\\Adafruit_BusIO\\Adafruit_I2CDevice.cpp.o" "libraries\\Adafruit_BusIO\\Adafruit_SPIDevice.cpp.o" "libraries\\Wire\\Wire.cpp.o" "libraries\\Adafruit_BME680_Library\\Adafruit_BME680.cpp.o" "libraries\\Adafruit_BME680_Library\\bme68x.c.o" "libraries\\WiFiClientSecure\\WiFiClientSecure.cpp.o" "libraries\\WiFiClientSecure\\esp_crt_bundle.c.o" "libraries\\WiFiClientSecure\\ssl_client.cpp.o" "libraries\\HTTPClient\\HTTPClient.cpp.o" "libraries\\Update\\HttpsOTAUpdate.cpp.o" "libraries\\Update\\Updater.cpp.o" "libraries\\EEPROM\\EEPROM.cpp.o" "libraries\\ESPmDNS\\ESPmDNS.cpp.o" "libraries\\FS\\FS.cpp.o" "libraries\\FS\\vfs_api.cpp.o" "core\\core.a" -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lasio -lbt -lcbor -lunity -lcmock -lcoap -lnghttp -lesp-tls -lesp_adc_cal -lesp_hid -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lesp_https_server -lesp_lcd -lprotobuf-c -lprotocomm -lmdns -lesp_local_ctrl -lsdmmc -lesp_serial_slave_link -lesp_websocket_client -lexpat -lwear_levelling -lfatfs -lfreemodbus -ljsmn -ljson -llibsodium -lmqtt -lopenssl -lperfmon -lspiffs -lulp -lwifi_provisioning -lrmaker_common -ljson_parser -ljson_generator -lesp_schedule -lesp_rainmaker -lgpio_button -lqrcode -lws2812_led -lesp-dsp -lesp-sr -lesp32-camera -lesp_littlefs -lfb_gfx -lasio -lcbor -lcmock -lunity -lcoap -lesp_lcd -lesp_websocket_client -lexpat -lfreemodbus -ljsmn -llibsodium -lperfmon -lesp_adc_cal -lesp_hid -lfatfs -lwear_levelling -lopenssl -lesp_rainmaker -lesp_local_ctrl -lesp_https_server -lwifi_provisioning -lprotocomm -lbt -lbtdm_app -lprotobuf-c -lmdns -lrmaker_common -lmqtt -ljson_parser -ljson_generator -lesp_schedule -lqrcode -lcat_face_detect -lhuman_face_detect -lcolor_detect -lmfn -ldl -lmultinet -lesp_audio_processor -lesp_audio_front_end -lwakenet -lesp-sr -lmultinet -lesp_audio_processor -lesp_audio_front_end -lwakenet -ljson -lspiffs -ldl_lib -lc_speech_features -lwakeword_model -lmultinet2_ch -lesp_tts_chinese -lvoice_set_xiaole -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls_2 -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls_2 -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls_2 -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls_2 -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls_2 -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lphy -lrtc -lesp_phy -lphy -lrtc -lesp_phy -lphy -lrtc -lxt_hal -lm -lnewlib -lstdc++ -lpthread -lgcc -lcxx -lapp_trace -lgcov -lapp_trace -lgcov -lc -Wl,--end-group -Wl,-EL -o multigeiger.ino.elf
2
"I:\\MultiGeiger\\arduino\\data\\packages\\esp32\\tools\\esptool_py\\4.2.1/esptool.exe" --chip esp32 elf2image --flash_mode dio --flash_freq 80m --flash_size 8MB -o "i:\\MultiGeiger\\build/multigeiger.ino.bin" "i:\\MultiGeiger\\build/multigeiger.ino.elf"
3
esptool.py v4.2.1

Das ist eine einzige Befehlszeile und die Wiederholungen der libs sind 
da schon drin. Ich habe aber kein Interesse daran die Hintergründe zu 
untersuchen, dazu mache ich mit den Dingern viel zu wenig. Ich hatte vor 
Jahren beim ESP8622 schon angefangen ein makefile zu schreiben und habe 
das beim ESP32 weiter so gemacht. Natürlich habe ich mich da an Arduino 
orientiert. Auf alle Fälle ist mit einem reinen Makefile auch ein make 
-j x möglich, was mit 8 Kernen ungleich schneller zur Sache geht als 
arduino und arduino-cli. Wenn ich eine Zeile in Code ändere brauchr 
arduino(-cli) ca. 1 Minute zum übersetzen jedesmal alle cpp Datein des 
Sketches übersetzt werden, ob geändert oder nicht. Mit make dauert das 
nur 8s.

von Εrnst B. (ernst)


Lesenswert?

mppt schrieb:
> Ich habe aber kein Interesse daran die Hintergründe zu
> untersuchen,

Oben hast du noch geschrieben:

mppt schrieb:
> Das habe ich aus meinen von Hand selbst geschriebenen
> makefile kompiert
...
> Ich hab mir für den ESP32 Arduino 2.0.5 mal die
> Mühe gemacht ein makefile zu schreiben.
...
> Ich bevorzuge halt meine eigenen makefile-Umgebung.

d.H. du kannst keine Makefiles schreiben, willst aber eins, um bei 
deinen Arduino-Kumpels anzugeben? Weird Flex?

Darum hast du dir die Compiler-Anweisung aus einem Arduino-Build ganz 
alleine in ein Makefile kopiert? Toll gemacht. Super. Ich ziehe meinen 
Hut vor deinen überlegenen Fähigkeiten.

Aber dazu, die Ungereimtheiten aus dem Arduino-Buildsystem aufzuräumen 
hat's nicht mehr gereicht?

Macht ja nix, größer ist besser, auch bei Makefiles.


Dann können wir ja zum Thema zurückkommen, da geht's um einen ESP8266, 
nicht ESP32. Da ist's nur eine kleine Handvoll an Libs aus dem SDK die 
dazugelinkt werden (und keine Sources mitgeliefert haben).

: Bearbeitet durch User
von Rabenopa (Gast)


Lesenswert?

Εrnst B. schrieb:
> Zuerstmal die obligatorische dumme frage:
>
> Warum auf dem STM32 mit nur 64k?

weil ich solche rumliegen habe und grob einschätzen will, wie weit ich 
damit komme bevor ich mich ggf gleich für was größeres entscheide. Also 
bevor ich anfange loszulöten.

> Pack die Webseite auf den ESP!
> Den STM kannst du als "Co-Prozessor" immer noch dazuklemmen.

Hatte nicht auf dem Schirm, dass das eine Option ist. Das ist natürlich 
sehr hilfreich.

von Rabenopa (Gast)


Lesenswert?

Sehe jetzt, dass meine Frage etwas doof war. Ich hab wohl erstmal nicht 
gecheckt, dass der ESP im Grunde ein vollwertiger Microcontroller und 
nicht nur ein reines Wifi-Interface ist. Für meine Anwendung macht es 
dann glaub ich mehr Sinn, STM32 und ESP8266 im Master-Master-Modus 
laufen zu lassen. STM macht den Hardwarekram, tauscht per UART State mit 
dem ESP aus, der die Außenkommunikation managt. Danke für die 
Hilfestellung!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.