Hallo zusammen,
Die Überschrift ist etwas Flappsig formuliert, ich versuch mal mein Projekt zu beschreiben.
Ich habe mit einem ESP32 und zwei MCP2515 ein gateway für CAN-Kommunikation gemacht (Arduinos waren hier etwas langsam beim durchreichen der Nachrichten).
Das funktioniert erstmal ganz prima und macht auch was es soll. Nun hätte ich noch gern ein kleines HMI in Form eines LCD oder auch Web Oberfläche (bin noch unentschlossen, da eigentlich als mobile Anwendung gedacht).
Nun ist es ja so, dass gerade solche HMI Geschichten beachtlich Ressourcen verschlingen können und ich mich aber darauf verlassen muss, dass die Nachrichten in Echtzeit (max. 10ms) gelesen, verarbeitet (CRC und andere Rechnungen) und weitergeleitet werden.
Hätte nun zwei Möglichkeiten.
- Ich starte einen interrupt wenn Nachrichten ankommen und HMI läuft in der Loop.
- Ich nutze den zweiten Core, der eigentlich nur WiFi und Bluetooth steuert (sofern ich es richtig verstehe).
Ersteres ist leicht umsetzbar, aber möchte mich trotzdem mit Möglichkeit 2 zusätzlich auseinandersetzen.
Ich finde leider nur ein paar einfache Blink_Led Beispiele, bei denen die Cores unabhängig eine LED blinken lassen, aber sonst nichts machen. Daraus kann ich mir aber noch nicht ganz erklären, was passiert, wenn man eine Abhängigkeit hat (=gemeinsame Variablen).
Ich vermute mal ich muss die Variablen analog zu Interrupts mit Volatile Kennzeichen, aber im Gegensatz zu Interrupts kann es beim Multitasking ja tatsächlich vorkommen, dass der eine Core auf die Variable zugreifen will, die gerade vom anderen verwendet wird.
Frage:
- bringt es mir einen Vorteil z. B. ein LCD über einen Task "HMI" in Core 0 zu aktualisieren, wenn die Loop in Task 1 läuft?
- Wie muss ich auf Variablen zugreifen, die von beiden Tasks (Loop, HMI) verwendet werden?
- Was macht Core 1 (Loop), wenn Core 0 (HMI) grad eine Variable liest oder schreibt, auf die er zugreifen will? Konflikt oder wartet er dann?
Hoffe ich bin nicht total auf dem Holzweg.