Forum: Mikrocontroller und Digitale Elektronik C: Datenkapselung in Kommunikationsmodul


von Jan K. (jan_k)


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?

von Achim (Gast)


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.

von Bernd K. (prof7bit)


Lesenswert?

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.

von Jan K. (jan_k)


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?

von Bernd K. (prof7bit)


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.

von Achim (Gast)


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.

von chris_ (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.