Hallo zusammen, ich frage mich schon seit längerer Zeit, wie ihr eure Kommunikation mit der Außenwelt so realisiert. Angenommen ich habe eine Platine mit Mikrocontroller, diverser Peripherie, Sensoren, Eigenschaften (Seriennummer, Hardwareversion etc). Der Code ist so gut wie möglich in Module aufgeteilt und es werden möglichst keine Daten quer durch alle Module gereicht. Schwierig wird es aber bei einem Kommunikationsmodul (im Prinzip ein Parser für das Kommunikationsprotokoll). Dort wird in Abhängigkeit der Anfrage über CAN/UART/usw versucht, ein Ausgabepuffer mit Informationen zu erstellen. Bei Modulen, die z.B. set/get Funktionen über ihr Interface anbieten geht das. Möchte ich aber mehrere Instanzen von einem Modul erzeugen, kapsel ich das ganze in einer struct und jede Methode/Funktion des Moduls bekommt als 1. Argument den Zeiger auf das entsprechende Objekt. Das heißt ich müsste alle meine Instanzzeiger global machen und im Kommunikationsmodul verwenden. Kommt mir total unhandlich vor. Gibts es andere Möglichkeiten? Wie macht ihr es?
Falls Du damit z.B. Instanzen von Fifos aus Deinem anderen Thread meinst, so hoffe ich, dass diese Frage mit meiner Antwort dort erledigt ist. Jedes Can-Modul (beispielsweise) kann sich beliebig viele Fifos anlegen, ohne zentrale Konfigurations-Datei oder dynamischem Speicher. Ansosnten gib gern ein Beispiel.
Jan K. schrieb: > Das heißt ich müsste alle meine Instanzzeiger global machen Nö, warum? Du übergibst den jeweiligen Zeiger doch bei jedem Methodenaufruf per Argument.
Bernd K. schrieb: > Jan K. schrieb: >> Das heißt ich müsste alle meine Instanzzeiger global machen > > Nö, warum? Du übergibst den jeweiligen Zeiger doch bei jedem > Methodenaufruf per Argument. Ja eben. Trotzdem muss ich meine Zeiger (meine Objekt-"instanzen") durch die verschiedenen Module reichen bzw alle dem Kommunikationsmodul exportieren, um in der auf sowas reagieren zu können "uart sagt: Computer möchte gerne den Wert der ersten Achse meines zweiten Sensors haben", also brauche ich den Instanzzeiger meines zweiten Sensors (was auch immer das für einer sein mag), um z.B. ein "SENSORS_GetValue(&object, axis1)" machen zu können. Wie funktioniert das ohne globale Variablen?
Jan K. schrieb: > Wie funktioniert das ohne globale Variablen? Die Variablen müssen nur dort bekannt sein wo sie verwendet werden. Wenn zum Beispiel jeder Sensor zwei Achsen hat dann kann das struct eines jeden Sensors jeweils die beiden Zeiger auf seine beiden Achsen speichern. Gib doch mal ein konkretes Beispiel (mit Code oder Pseudocode) für Dein vermutetes Problem.
Jan K. schrieb: > Wie funktioniert das ohne globale Variablen? Ein embedded Projekt hat meist einen globalen Kontext. Mit globalem Zugriff, entweder direkt oder hinter mächtigen Interfaces "verborgen". Zweiteres vermeidet globale Variablen meist nur formal und obfustakelt. Nur in wenigen Fällen gelingt die Abstraktion. Darum sind die Kommentare von DerDan und Bernd K. in deinem andern Thread so richtig. Dein Beispiel verstehe ich so, dass es ein Uart-Server-Modul im µC gibt, das Anfragen oder Befehle aus dem PC umsetzt. In solchen Fällen kann ein völlig globaler Ansatz deutlich besser (wartbarer) sein als das übliche "Anmelden in Listen, Durchsuchen nach Identifiern, Ziehen des Interfacepointers und Aufruf mit 3 Indirektionen". Unser Hauptcode (Steuergerät) hat etwa 100 Mannjahre. Jeder neue Programmierer "weiss" natürlich, wie man es besser macht, alle scheitern selbst bei einfachen Beispielen am globalen Kontext. Auch mit C++. So richtig klappt "nicht global" nur bei virtuellen Objekten, z.B. Files, Objekten auf dem Bildschirm, Datensätze, internen Hilfsmitteln, Waren etc. Nicht bei der Geschwindigkeit des Autos oder Drehsensor hinten rechts.
Das Problem mit dem Parser für die UART war hier schon mal durch Zufall angesprochen: Beitrag "Re: schönes Multitasking mit Arduino"
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.