RFID mit oder ohne Task

Sorry, hatte gestern und heute viel zu tun. Ggf schaffe ich es heute Abend.

ich habe mir den Branch heute auch mal kurz angeschaut und mir sind einige kleine Fehler aufgefallen. Auch sehe ich noch Möglichkeiten zur Verbesserungen an einem Punkt:

Kompilieren mit #define FTP_ENABLE auskommentiert führt zu Fehlern. Einige Variablen werden dann nicht initialisiert, aber in weiteren Funktionen verwendet.
Gleiches Verhalten tritt bei MQTT_ENABLE und NEOPIXEL_ENABLE auf

Wäre es nicht grundsätzlich besser, wenn zwar die global verwendeten _init und _Cyclic konstant definiert bleiben, aber alle anderen Funktionen abhängig des PräCompilers gesetzt werden?
Dann belegen sie auch keinen Speicher im Programm wenn sie nicht genutzt werden.

Mir ist aufgefallen, dass in einigen Modulen noch Abhängigkeiten zu anderen Modulen bestehen, z.B.: in RfidMfrc522.cpp wird Wire.h geladen - auch für den Port-Expander. Da aber auch der AC101 davon abhängig ist, sollten diese Punkte entweder in eine separate Datei oder doch wieder in die main.cpp eingepflegt werden. Insbesondere wenn die Module bei nicht aktivieren des Feature weitestgehend undefiniert bleiben macht das sicherlich Sinn, oder?

Das schaue ich mir noch einmal an. Eventuell baue ich die Überprüfung auch in Github Actions ein.

Ich verstehe aktuell nicht worin der Unterschied zur aktuellen Implementierung liegt. Folgendes habe ich zum Beispiel gemacht:

void Led_Init(void)
{
#ifdef NEOPIXEL_ENABLE
   ....
#endif
}

Die Funktion ist ohne das gesetzte NEOPIXEL_ENABLE leer und wird damit vom Compiler raus optimiert. Auch alle referenzierten Funktionen sowie globalen Variablen werden dadurch raus optimiert. Daher sollte dann auch nichts im Speicher sein. Ich kann das aber gerne in der MAP-Datei überprüfen. Durch das Voranstellen des Modulnamens für die Funktionen und Variablen findet man das auch schnell in der MAP-Datei oder eben auch nicht.

Was meinst du mit Wire.h geladen? Ein Header enthält ja (eigentlich) nur Deklarationen. Das Einbinden eines Headers sorgt noch nicht dafür, dass irgendwelche Ressourcen verwendet werden. Wenn ein Header eingebunden wird, aber keine Funktion, welche im Header deklariert ist, aufgerufen wird, dann wird auch nichts gelinkt und es landet letztendlich auch nichts im Binary. Daher macht es keinen Unterschied wo und wie oft ein Header eingebunden wird. Das Grundprinzip lautet, dass man ein Header dort einbindet, wo er benötigt wird.

ich habe zu schnell geschrieben und nicht intensiv geschaut.
Bei allen Dateien ist das von mir bemängelte natürlich umgesetzt.
Lediglich in der System.cpp sind noch einige Zeilen, die auf MQTT verweisen und der String nicht gefunden wird.

In Bezug auf Wire.h meinte ich primär das gesamte Handling des I2C und der TwoWire Instanzen. Ich habe das gerade bei mir schon Branch angepasst. Ich würde das nochmals testen und dann einen PR erstellen

Das mit dem MQTT schaue ich mir an.
Ich habe jetzt mal zum Beispiel NeoPixel auskommentiert:


Bei mir werden alle Konfigurationen gebaut. Es wäre super, wenn du die settings-Datei für eine fehlerhafte Konfiguration zur Verfügung stellen könntest. Am besten über Github Gist oder so.

@biologist Willst du weiterhin die MQTT Topics konfigurierbar in settings.h haben oder können die in Mqtt.h? Auf jeden Fall sollte das #ifdef für die MQTT Topics raus. Bezüglich der Ressourcen würde es keinen Unterschied machen.

Das soll auf jeden Fall an der Stelle drin bleiben. Kannst ja den Usern nicht zumuten, da in x Dateien einen Blick zu werfen.

Alles klar. Im übrigen ist der Log nun auch über IP/log erreichbar. Aktuell werden die letzten 2k an Logeinträgen angezeigt. Ist ganz praktisch um im laufenden Betrieb oder bei Fehlern mal einen Blick darauf zu werfen. Das mit den fehlerhaften Umlauten muss aber noch behoben werden.

1 „Gefällt mir“

In welchem Speicher werden die 2k eigentlich allokiert?
Wegen Umlauten: Wir gestern hier vor einer Weile eine langere Diskussion wegen Zeichensatz. Am Ende ist es cp437 geworden, weil man nur damit arbeiten kann, wenn man Files via Webtransfer, FTP-Transfer und direktem SD-Transfer kopieren will. Das hätte zur Folge, dass die Dateinamen mit Umlauten im Log nicht mehr gepasst haben. Aus meiner Sicht ist das aber zu tolerieren.
Also wenn das das Problem ist, dann brauchst da keine Arbeit reinstecken.

Der Speicher wird im internen RAM allokiert. Ich vermute du fragst wegen dem PSRAM. Ich könnte die Lib auch so ändern, dass der Buffer extern erstellt werden kann. Allerdings sollte man schauen, was man in den PSRAM liegt und was nicht. „Kleine“ Dinge lohnen sich ja nicht wirklich. Wie ist denn aktuell die Auslastung? Was sind denn die größten Verbraucher im RAM? Genau das wollte ich mir noch anschauen. Fällt dann aber eher unter Optimierung. Ich will das Ganze ja letztendlich auf einem S2 laufen lassen. Der hat ja weniger Ressourcen.
Das mit den Umlauten ist ja nur ein optischer Makel. Dann lassen wir das erst mal so.

Da ich anfänglich mehrfach gegen die Wand gefahren bin, weil der statische RAM voll war, habe ich mir angewöhnt, alles Mögliche ich den Heap zu stecken. 2k finde ich jetzt nicht so wenig. Es braucht auch nicht viel Durchsatz, insofern wäre psram schon eine Möglichkeit. Also mir geht’s am Ende des Tages einfach nur darum, dass wegen sowas nicht der esp abstürzt.

Ich hab’s mir leider nach wie vor nicht genauer angeschaut. Zu viel anderer Kram aktuell 🤷

Ich schaue mir die RAM-Auslastung bei Gelegenheit an. Den Ringbuffer passe ich für den PSRAM an. Ich habe mich jetzt für ein S2 Board entschieden. Das Board wird 8MB PSRAM und 16MB Flash haben. Für mich wird dann auch OTA wieder ein Thema werden. Falls gewünscht und sinnvoll kann ich das dann auch Upstream bringen, zumindest für 16MB Flash-Boards.

1 „Gefällt mir“

Habe gestern den Code umformatiert. Irgendwie ist meine VSC-Code-Installation einigermaßen im Arsch (schon länger), so dass verschiedene Sachen nicht (mehr) funktionieren. Das Umformatieren von Code gehört dazu. Ich habe es dann von Hand erledigt, was zwar lästig ist, aber dann muss ich mich wenigstens nicht mit dem Geraffel rumplagen und es ist dann genau so, wie ich es gerne hätte. Auf lange Sicht werde ich die VSC-Installation wohl mal plattmachen müssen und neu installieren.

Sei es drum. Wenn man eine RFID-Nummer per MQTT einkippt, passiert komischer Kram:

MQTT-Nachricht empfangen: [Topic: Cmnd/ESPuino/Rfid] [Command: 018030087052]
RFID-Karte empfangen: p��?␐~�?|��?
[E][Preferences.cpp:473] getString(): nvs_get_str len fail: p��?␐~�?|��? NOT_FOUND

Vielleicht wird hier jetzt zu früh mit free() aufgeräumt. Schaue ich mir heute Abend an.
Eigentlich schreibe ich diesen Post nur, um zu sagen, dass es wieder vorangeht :slight_smile:

Alternativ kann man die IDE auch in der Cloud aufrufen, dann muss man sich nicht mit so etwas rumschlagen :grinning_face_with_smiling_eyes:. Zum Beispiel mit Gitpod.

Mit welchen RFID hast du getestet? Bei mir ging es mit dem PN5180. Den MRF522 hatte ich mir nicht angeschaut, allerdings habe ich bei beiden die Queue angepasst. Eventuell ist mir hier für den MRF522 ein Fehler unterlaufen. Zuvor wurde ein Pointer für den String übergeben. Aktuell wird der String über die Queue übergeben. Etwas verwirrend war, dass die Queue für die Größe des Strings ausgelegt war, aber dann nur der String-Pointer übergeben wurde.

Grundsätzlich halte ich es immer für riskant (meine persönliche Meinung), wenn Speicher an einer Stelle allokiert wird und an einer anderen (z.B. andere Task) wieder freigegeben. Manchmal geht es aufgrund der Ressourcen nicht anders, aber ob man jetzt 4 Bytes für den Pointer oder 10-20 Bytes für den String benötigt, macht bei einer Queue-Länge von 1 keinen großen Unterschied.

Ich kann mir das Problem anschauen, komme aber vermutlich erst morgen dazu.

Ich habe es auf mehrere Arten und Weisen probiert, aber hinsichtlich Reformatierung ist genau gar nix passiert. Ich habe dann online was gefunden, aber das hat mir auch nicht ganz so gepasst von der Formatierung. Also habe ich es dann kurzerhand von Hand gemacht. Nervig halt, aber da weiß ich wenigstens, dass ich am Ende ein Ergebnis habe. Mit VSC habe ich seit einer Weile größere Probleme. Beispielsweise Code-Assist funktioniert, bis auf Klammern, überhaupt nicht mehr. Auch syntaktische Fehler werden nicht mehr markiert. Projekte werden mitunter auch mehrfach angezeigt. Also kurzum: Es ist ziemlich „am Sack“ :slight_smile:

Ich hab’s auch mit dem PN5180 getestet. Der hat, warum auch immer, erst nicht funktioniert. Nachdem ich nochmal geflasht hatte, ging es aber. 522 habe ich noch nicht getestet. D.h. neue Karten auflegen geht, aber via MQTT geht es nicht. Grundsätzlich geht das ja fast komplett den gleichen Weg, aber vielleicht wird durch MQTT irgendwas im Speicher überschrieben, was bei Auflegen halt nicht der Fall ist.

Ich schaue heute Abend drauf. Dann kann ich auch 522 mal testen.

1 „Gefällt mir“

So, also das geht jetzt. Habe eben mal einen Commit gemacht, damit die ganzen Code-Umformatierungen online sind.
Verschiedene Sachen habe ich getestet, RC522 jedoch noch nicht. Vieles funktioniert.

Was mir aufgefallen ist:

  • Der Upload von Files funktioniert nicht. Weder Webtransfer, noch FTP. Also scheinbar läuft der Transfer normal durch, jedoch ist das File beim nächsten Mal nicht mehr da. Es kommt auch direkt beim Anfang der Übertragung zu einem Fehler.
  • Wenn z.B. Webradio schon läuft und man danach erst auf die Webgui geht, dann funktioniert der Filebrowser nicht.

Hallo,
Wir habem auch einmal versucht den neuen Code zu conpilieren. Muss man dabei noch irgendwas beachten? Wir erhalten immer eine Fehlermeldung:
src/Button.cpp:117:5: error: ‚Button_Timer‘ was not declared in this scope
Wir haben die Infrarot Fernbedienung aktiviert.

Schaue ich mir später mal an. Muss sicherlich gefixt werden.

@MusikHexe: Ist jetzt gefixt im Refactoring-Branch.
Danke für den Hinweis.

Oh super, danke. Dann probiere ich morgen weiter!