Steuern Sie ein UART-Protokoll mit FreeRTOS oder Interrupts [geschlossen]

Ich versuche, ein UART-Protokoll zu entwickeln, um die Kommunikation zwischen zwei Karten Master_Board und Slave_Board zu ermöglichen. Master_Board soll Befehle über UART an Slave_Board senden und letzteres soll antworten. Die Sache ist, dass Befehle unterschiedliche Prioritäten haben und einige Befehle rechtzeitig ausgeführt werden müssen. Wenn beispielsweise das Master_board "GET_VALUE" an Analysis_Board sendet, soll letzteres 20 Sekunden lang Werte an Master_board senden. Wenn beim Empfangen von Daten etwas Schlimmes passiert, sendet Master_board "ABORT" an Analysis Board. Letzteres soll das Senden von Werten stoppen, auch wenn die 20 Sekunden nicht erreicht werden. Ich denke, es gibt 2 Möglichkeiten, dies zu tun. Implementieren Sie das UART-Protokoll, das von Interrupts oder RTOS verwaltet werden soll. Welcher Weg ist in meinem Fall besser? Welcher Weg ist einfacher zu handhaben und garantiert die beste Performance?

Sie fragen nach Implementierungsmeinungen. Was sehr breit ist. Das ist besser geeignet für ein Forum.
Hängt wirklich von der Protokollspezifikation ab. Wenn das Protokoll sagt, dass Sie nach einigen Bitzeiten nach Erhalt des Abbruchbefehls aufhören müssen, würde ich mich auf Interrupts verlassen. Wenn es heißt, dass Sie 100 ms Zeit haben, um das Senden von Sachen zu stoppen, würde ein RTOS das auch gut handhaben, denke ich.

Antworten (2)

Sie haben Ihre Timing-Toleranzen nicht angegeben (z. B. Jitter - muss es 1 s oder 1 ms sein). Wenn es 1s ist, dann kann es "egal was" leicht gemacht werden (es sei denn, etwas ist sehr schlecht codiert ...) sowohl Bare-Metal als auch mit einem RTOS. Ist das RTOS wirklich notwendig? Sie verwenden RTOS nicht nur, um etwas "schneller" zu machen, sondern um die Verwaltung vieler paralleler und voneinander abhängiger Aufgaben zu vereinfachen.

Einige Ideen:

  1. Innerhalb der RTOS-Aufgabe: Laden Sie das UART-Datenregister, fragen Sie das Übertragungsabschluss-Flag ab, wenn Sie dies nicht getan haben, rufen Sie vTaskDelay (oder eine andere Verzögerungsfunktion in Ihrem RTOS) auf. Primitive und garantiert keine Zeitangaben.

  2. Die RTOS-Task lädt den TX-Puffer, startet den UART TX-Interrupt, es gibt einen Interrupt für jedes Byte, die Task wartet auf ein Flag oder eine bedingte Variable, die durch den letzten Transmit Complete Interrupt gesetzt wird. Für jedes Byte gibt es einen Interrupt. Interrupts mit höheren Prioritäten können die Timings beeinflussen.

  3. Die RTOS-Task lädt den TX-Puffer, konfiguriert DMA, um alle Daten zu übertragen, die Task wartet auf ein Flag oder eine bedingte Variable, die durch den DMA-Transfer-Complete-Interrupt gesetzt wird. Es gibt einen einzigen Interrupt für die gesamte Übertragung. Sehr kleine Faktoren können die Zeitabläufe beeinflussen (im Grunde nur andere DMA-Übertragungen – dies kann mit DMA-Prioritäten oder Round-Robin-DMA-Scheduling behandelt werden).

  4. Gestalten Sie alles als zeitgesteuertes System. Dies gibt Ihnen 100% zuverlässige Timings (na ja ... 99,99%) auf Kosten einer geringeren Spitzenleistung (dh Ihre schnelle CPU wird die meiste Zeit sehr wenig tun, um Reserven für die Ausführungszeit im schlimmsten Fall zu haben). Zu diesem Thema gibt es ein großartiges kostenloses Buch Patterns for Time-Triggered Embedded Systems . Mit dieser Methode erhalten Sie den geringstmöglichen Jitter.

Dies hängt von den anderen Spezifikationen Ihres Systems ab. Sie können mit Unterbrechungen tun, was Sie brauchen. Die Verwendung eines RTOS wird einen Overhead hinzufügen, der meiner Meinung nach nicht nur durch die Kommunikationsschnittstelle des Systems gerechtfertigt ist.