New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improved Debugging #39
Comments
Zu deinen Fragen: Rolling vom 25.09. SD-Card Anbindung Beleuchtung stb_xx.h user_ctx->scratch
Wenn du in die jeweiligen Gruß, |
Den GPIO4 habe ich so frei bekommen, die BlitzLED läßt sich so wie beschrieben nutzen.
Meine früheren Erfahrungen auf einer anderen Maschine mit einer guten git-Konfiguration waren nicht so prickelnd. Deshalb erst mal ein paar Erfahrungen: Ich habe eine Reihe von Test gemacht und dabei ESP Heap, Min Free Heap und largest block on Heap untersucht.
Mir sind fünf Dinge in CTfLineClass aufgefallen:
2.1 2.2 ClassFlowAnalog:
␛[0;31mE (4741240) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:␛[0m Damit kenne ich mich aber nicht aus, insbesondere nicht was das Zurücksetzen des Watchdogs über esp_task_wdt_reset() anrichten würde. P.S meine Tastatur hat machmal so ihre Macken und produziert Schreibfehler, die findet man beim Nachlesen nicht immer alle. |
Die CTFLiteClass ist im wesentlichen ein Wrapper für die Google Tensorflow Lite Bibliothek. Da bin ich ehrlich gesagt froh, dass es so läuft, wie es tut. Ich müsste mal prüfen, ob Google dort vielleicht eine neue Version rausgebracht hat, die einige Bugs beseitigt. zu 1) Daher auch der Dummy OwnMicroErrorReporter. Dort liefert die Bibliothek jede Menge Output, die die serielle Schnittstelle sehr schnell füllt. zu 5) Dieser Watchdog kommt daher, dass die Berechnung des neuronalen Netzes sehr lange braucht und in den verwendeten Bibliotheken (Tensorflow/Lite) kein Reset des Watchdogs vorkommt. Er kommt dort schlicht nicht aus der Schleife raus. |
Hallo, ich habe master geforked. |
Ich kann den Fehler nicht nachvollziehen. Habe es gerade mit einem Clean und dann einen Build laufen lassen. Compiliert ohne Fehler - sehe nur die üblichen Warnungen. |
Hallo Jomjol, |
Hi Hike, ich kompiliere mit framework-espidf 3.4 - das ist die aktuelle. Weitere Details: Platform ManagerPlatform espressif32Updating platformio/espressif32 2.0.0 [Up-to-date] |
Da gibt es Probleme und Unterschiede: Offensichtlich habe ich eine andere framework-espidf , die aber trotzdem als [up-to-date] ausgewiesen wird. In dem neuen Code ( master vom 3.11.2020, geforked ) scheitert die Übersetzung mit dem obigen fehler esp_mqtt_event_id_t esp_mmqtt_ID = MQTT_EVENT_ANY; Versuche ich von da pio -h aufzurufen, bekomme ich beim Aufruf von pio -h aus der Powershell die Fehlermeldung:
Ich komme da nicht weiter, will mir aber auch nicht die funktionierende Umgebung vom 25.9 zerschiessen. Außerdem werden ein paar changes notifiziert in sdkconfig , version.cpp , version.cpp src Ich habe PlatformIO nochmal auf einem neuen Benutzer neu von Grund auf aufgesetzt. Um die Installation zu testen, habe ich ein neues Testprojekt mit der idf gebaut und den ersten Teil vom main (InstallNVS..) eingebaut. Die IDF hat jetzt Rev 2.0.0 Dieser Pfad existiert nicht, zwischen espdevel und .platformio müsste ein \ stehen. |
Da hatte ich noch nie. Pfadprobleme kenne ich weder aus der Win 10, noch aus der Ubuntu Umgebung. Da hilft nur googeln. |
Hallo,
|
Hallo stan23, Ich habe was gefunden : Über das graphische PIO Home -->Platforms -->installed Espressive32 toolchain-xtensa32 | toolchain | | ~2.50200.0 | 2.50200.80 (5.2.0) alle anderen Einträge haben dieselbe Versionnummer wie bei Dir toolchain-esp32ulp | toolchain | | ~1.22851.0 | 1.22851.191205 (2.28.51) |
Hi, |
Danke, bei wir steht jetzt auch
|
Kannst Du über PIO-Home ein neues Projekt bauen mit platformio.ini und main.c #include "esp_err.h" static const char *TAGMAIN = "main"; void app_main() { Das sollte problemlos übersetzt werden Versuche anschlließend mal |
Der Backslash fehlt bei mir auch,aber macht das was aus? |
Nach mehrfachen Hin und Her zwischen den Benutzerkonten sind die Pfadprobleme bei espdevel auf einmal wie weggeflogen. Problem gelöst |
Hallo Jomol,
Das alte logfile wird dann nach /log/oldlogs/log_date_time.log kopiert. Auf meinem Testdevice bekomme ich regelmäßig nach 43 Runden einen Reboot.
43 Runden
43 Runden
Dabei kann man sehen, wie die Differenz zur 1. Runde immer anwächst, bis es irgenwann zu einer GURU panic und einem Neustart kommt. Könnte es sein, das das Ergebnis für die alte Runde nicht richtig freigegeben wird? Es scheint auch mehrere Heaps zu geben, leider habe ich bisher noch nicht rausgefunden wie man die unterscheiden kann. Die Größe spricht dafür, dass RAM und PSRAM zusammen gezählt werden, insbesondere die Größe wenn der Kamerabuffer nicht initialisiert wurde. Auch ändert sich largest Block size die ganze Zeit nicht. |
Super Ergebnisse und eine heiße Spur. Kannst ich deinen Code irgendwo runter laden oder kannst du ihn als eigenen "Branch" hier zur Verfügung stellen? Ich habe ein paar Ideen, wie ich schnell eingrenzen kann, wo die 340k allokiert werden. |
Der Code liegt unter hike6688 auf github im Branch find-reboots. Ich hab etwas länger gebraucht um den Trick mit dem Auslesen des Internen Heaps zu finden. Siehe Helper.cpp |
Vielen Dank - habe es gerade runtergeladen und auf mein Testdevice gespielt. Hatte gestern nach deinem Hinweis mit den 340B auch mal schnell meinen Code gescreent und den ROI-Vector im Verdacht, obwohl ich dort eigentlich ein delete verwende. Vielleicht muss ich bei der Vector Konstruktion noch irgendetwas beachten. Ich lasse es jetzt mal den Tag laufen und schaue mir das am WE an. |
Ohne den Code genauer zu kennen: Mir fällt auf, dass in CTFliteClass ein expliziter Destruktor implementiiert ist , in verschieden anderen Klassen aber nicht, Es ist übrigens sehr interesant zu sehen wieviel internen Heap die Kamera und der Webserver beansprucht. Manchmal geht die Initialisierung der Kamera schief
Dann startet das Ganze mit 90100 Bytes anstelle von 32676 Bytes internal heap. |
Ich glaube etwas gefunden zu haben in ClassFlowAnalog: Anscheinend gibt es ein Problem beim Aufräumen von TFLite
TFLite alloziert 48 Bytes Speicher:
aber ein Teil des Heapverbrauchs bei LoadModell und MakeAllocate wird nicht freigegben.
Da sieht für mich so aus, als würde der von LoadModell verbrauchte Heap freigegeben, aber der vom MakeAllocate nicht. Die Zahlen sind nicht bei jedem Durchlauf identisch, aber sehr änlich. Mal sehen, worans jetzt wirklich liegt, sollte auch ähnlich in FlowDigit sein Die Tensor_arenea wird auf dem SPI-Heap angelegt und auch wieder freigegeben
Verdacht: this->interpreter = new tflite::MicroInterpreter(this->model, resolver, this->tensor_arena, this->kTensorArenaSize, this->error_reporter); Ich finde kein delete this->interpreter in LoadModel wird this->model über einen Funktionsaufruf gefüllt, für das CharArray gibt es malloc und free |
Wo genau hast du das denn gefunden. Das habe ich letzte Woche in der Rolling upgedated. Wann hast du sie den gezogen? |
Ein Fehler liegt hier:
Dann wird der Heapverbrauch deutlich kleiner (von 320 byte auf 24 Byte)
Warum bei der ersten und zweiten Runde noch Heapverbraucht wird habe ich noch nicht untersucht. Ich mache gleich ein push auf github |
Vielleicht sind die verbliebenen 24 Byte im error_reporter. Dort gibt es auch kein delete. Wenn du dort noch folgendes ergänzt: delete this->error_reporter; Vielleicht haben wir es dann. |
was ist mit dem static tflite::AllOpsResolver resolver; in MakeAllocate? da wir jetzt wissen das das ein Problem des schwindenden internal heap ist, könnte man ja auch organisiert nach einiger zeit rebooten. Die Grenze liegt irgendwo bei mir bei 17000 -18000 free internal heap. Überschlägig sollte das für 500 Runden , also etwa 2 Tage reichen. |
Gute Idee, ich habe jetzt noch 2020-11-13_19-16-55: before auto_isrunning: Heap: 3228132 Min Free: 3227544 larg. Block: 3207328 SPI Heap: 3207328 NOT_SPI Heap: 20804 Internal Heap: 20804 Internal Min Heap free: 20216 Zumindest in Runde 2 & 3. Echt super Verbesserung. Ich werde das jetzt mal in die Rolling implementieren. Dort hat jetzt zwerk2 auch noch eine rollierendes Löschen der Logfiles eingebaut, damit sollte die SD-Karte auch noch stabiler laufen. |
Bei mir wackelt die Zahl auch zwischen -4 , 0, 12, 16 20, 24 ist nach 21 Runden bei 16. |
Hatte jetzt fast 48h keinen unverstandenen Reboot - außer bei intensiven Webzugriff. |
s.o. |
Hallo @jomjol
Ich habe die Rolling Version vom 25.9.2020 als Ausgangspunkt genommen und diverse Änderungen im Code vorgenommen. Leider habe ich nur sehr,sehr rudimentäre Erfahrungen mit collaborativen Arbeiten mit GIT.
In den neueren Code habe ich noch nicht reingesehen.
Da ich den Wasserzähler leider nicht stabil bekommen habe, habe ich mich an meinem Gaszähler versucht.
Da werden doch häufiger Ziffern richtig erkannt.
Um die Beleuchtung regulieren zu können, habe ich ledc_timer verwendet. da muss man wegen der Verwendung einiger Timer durch die Kamera aufpassen. Ich verwende LEDC_Timer_2 und LED_Channel_7.
Die SD-Card habe ich auf slot_config.width = 1 eingestellt, damit wird GPIO04 frei.
Alle Versuche, den zweiten I2C-Bus zu nutzen ( z.B. für ein OLED-Display) sind gescheitert
Ich habe viele Logging- Funktionen auf ESP_LOGI(TAG," "); umgestellt
Die Logfilegröße habe ich beschränkt und lege die alten Log_files in einem separaten Verzeichnis ab.
Du verwendest stb_xx.h files . Gibt es dazu eine API-Dokumentation?
Wo werden Funktionen verwendet, die in Referenzparametern Ergebnisse zurückliefern,
Bekommen die beim Aufruf einen Ergebnisspeicherblock mitgeliefert oder allozieren die selber Speicher.
Du verwendest an verschiedenen Stelllen user_ctx->scratch, da steht meistens nur ein Namesstring drin, ich habe aber irgendwo auch einmal ein Malloc gesehen, finde das aber nicht mehr
Gruß Hike
The text was updated successfully, but these errors were encountered: