mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C: Datenkapselung in Kommunikationsmodul


Autor: Jan K. (jan_k)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan K. (jan_k)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem mit dem Parser für die UART war hier schon mal durch Zufall 
angesprochen:
Beitrag "Re: schönes Multitasking mit Arduino"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.