Dennis D. schrieb:
> // make sure no other instance can be created
Du scheinst die Befindlichkeiten, die du vom PC her gewöhnt bist, auf
einen Mikrocontroller 1:1 übertragen zu wollen. Hmm...
Also es soll ein Treiber werden, der im µC den Datenverkehr per UART
erledigt.
Nun, der sollte im Prinzip 2 Teile haben:
1. den Teil, der "nach draußen" also zu dem Rest der Firmware arbeitet,
also letztlich von irgendwas, das von main() her kommt, benutzt wird.
Der 2. Teil ist die Interrupt-Serviceroutine. Und beide haben als
Trennstelle je einen Ringpuffer für Sende- und Empfangszweig dazwischen.
So ein Ringpuffer besteht zunächst aus einem Array von chars und dazu
zwei Zeigern oder Indizes, je nachdem was du lieber magst. Ich bevorzuge
Indizes, denn deine Puffer werden gewiß nicht größer als 256 Zeichen
sein. Eher deutlich kleiner, so um die 16 Empfangszeichen und 64
Sendezeichen schätze ich. Man hat ja am µC nicht unendlich viel RAM.
Einer der Zeiger dient zum Füllen des Puffers und der andere zum Leeren.
Und die Instanz, die den Puffer füllt, besitzt auch den Schreib-Zeiger,
während die andere (die ihn wieder leert) den Lese-Zeiger besitzt. Jede
Seite darf beide Zeiger lesen, aber nur diejenige, die ihn besitzt, darf
ihn schreiben.
Das ist eigentlich alles. Damit kommt man sich niemals gegenseitig ins
Gehege und da schlußendlich dieser Treiber ein Teil der Firmware sein
wird, ist es auch ausgeschlossen, daß er mehrfach darin vorkommt. Und
instantiieren ist auch nicht, das Ganze wird ja fest in den
Programmspeicher gebrannt und wird nicht von der Festplatte in den RAM
geladen.
Und ein Treiber tut auch nichts a la "doSomethingWith...", sondern wird
prozedural aufgerufen und Auswertungen irgendwelcher Art finden woanders
statt.
W.S.