ESP32 Multitasking für zeitkritische Systeme

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.

  1. Ich starte einen interrupt wenn Nachrichten ankommen und HMI läuft in der Loop.
  2. 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. :slight_smile:

Das ist richtig. Schau mal nach Semaphoren, die zur Verwaltung gemeinsam genutzter Ressourcen verwendet werden können. Jede Task muß die Ressource für sich reservieren, bevor sie darauf zugreifen darf.

Bist du!

Auf dem ESP32 läuft FreeRTOS.
Eins der besten, gut dokumentierten, Real Time (OS?) für µC

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos.html

Der ESP32 hat CAN-Bus eingebaut, meinst Du möglicherweise MCP2551 als Bustreiber?

@agmue: Der hat nur einen Transreceiver verbaut, ich benötige aber zwei separate CAN-Schnittstellen, da unterschiedliche Teilnehmer nicht direkt miteinander kommunizieren sollen. Deshalb die Lösung mit MCP2515 über SPI.
Will zwar bei Gelegenheit den integrierten auch mal testen, aber erstmal läufts so.

@DrDiettrich @combie: Danke euch. Insbesondere der Link ist zu dem freeRTOS Turorial ist mir sehr hilfreich.

Eine spezielle Anforderung, OK.

Im Thema duty cycle messen eines PWM-Signals bei 20kHz habe ich mal ein Beispiel von Espressif für die Arduino-IDE verändert. Möglicherweise hilft es Dir.