C: Datenkapselung in Kommunikationsmodul

OP #4735458
Lesenswert?

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?
Gast #4737469
Lesenswert?

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.
OP #4738478
Lesenswert?

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?
#4738610
Lesenswert?

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.
Gast #4738696
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren