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?
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.
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.
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?
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.
Ε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.
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?
Ε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?
Ε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.
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
Ε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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.