mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Contollerunabhängige Programmierung


Autor: Klaus Skibowski (skibby)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe für einen Sensor der über I2C angesprochen wird ein 
Softwaremodul in C für einen LPC21xx programmiert. Nun möchte ich gerne 
dieses Modul auf einen MSP430 portieren. Das ist im Prinzip kein 
Problem. Nun habe ich mir aber überlegt ob ich das ganze nicht so 
gestalten könnte, dass mein Softwaremodul völlig controllerunabhängig 
programmiert wird und die controllerabhängigen Funktionen ausserhalb 
implementiert werden.
Wie stelle ich das am geschicktesten an ? (Ich dachte mal an 
Funktionszeiger doch leider stehe ich mit Zeigern etwas auf Kriegsfuss 
und vielleicht gibt es ja auch andere Methoden ...)

Danke im voraus,
Klaus Skibowski

Autor: l0wside (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lösungs*skizze*:
- Controllerabhängigen und controllerunabhängigen Code trennen (jeweils 
eigene Quellcode- und Headerdateien). Gibt dann vier Dateien, die z.B. 
i2c.h, i2c.c, transceive.h und transceive_lpc.c heißen könnten.
- In transceive.h werden die controllerabhängigen Funktionen 
deklariert (z.B. i2c_send(), i2c_recv() oder was auch immer)
- In transceive_lpc.c werden die in transceive.h deklarierten Funktionen 
dann für den LPC definiert.
- Für den MSP430 musst Du dann "nur" noch eine transceive_msp.c 
schreiben, die die in transceive.h deklarierten Funktionen dann für den 
MSP430 definiert.
- Projekt bestehend aus i2c.h, i2c.c, transceive.h und transceive_msp.c 
anlegen, compilieren, linken, glücklich sein.

Schwierig dabei ist am ehesten, verschiedene Controllerarchitekturen zu 
verheiraten, in die Abstraktion der in transceive.h deklarierten 
Funktionen muss man ggf. einiges an Hirnschmalz stecken.

Viel Erfolg!

Gruß,

Max

P.S.: #define-Gräber gehen natürlich auch, das macht aber sehr schnell 
gar keinen Spaß mehr.

Autor: cskulkw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Automotive-Welt (und sicherlich auch wo anders) nennt das 
Hardware-Abstraction-Layer (HAL)

Ich programmiere schon seit langem so und verbanne hardwareabhängige 
Programmteile in eine Low-Lewel-Treiberdatei und versuche so 
generalisierte Schnittstellen festzulegen. wie Schreibe_spi ; lese_spi ;
setze_Selektion usw.

Gerade externe Controler wie der MCP2515 für CAN benötigen eine 
Reihenfolge von Befehlen. Das ist bei vielen anderen Sensoren und 
Aktoren ähnlich. Diese Reihenfolgen müssen immer von allen 
Implementierungen strikt eingehalten werden. Da ist es doch naheliegend, 
diesen Softwarepart in einem Modul hardwareneutral zu kapseln.


Für die Hardware gilt, dass im Grunde genommen alle nur mit Wasser 
kochen und sich den Schnittstellenstandards unterwerfen müssen. Deshalb 
braucht man nur eine Schublade, wo der Kontroller zugriff - 
Targetabhängig definiert ist.

Über ein übergeordnetes Define wählt man dann die Lowlevel-Treiber für 
Prozessor 1 2 etc. aus. So bleibt die angelegenheit übersichtlich. Man 
hat nur soviel Dateien, wie man Treiber programmiert hat. Außerdem 
erspart man sich die Unübersichtlichkeit der vielen #ifdef ... etc. Bei 
Eclipse geht das ja noch, aber bei anderen Editoren macht das dann 
keinen Spass mehr.

Viel Erfolg und lass mal hören, wie erfolgreich Du warst.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe auch "Adapter Pattern" bzw. Wrapper-Funktionen.

Autor: Klaus Skibowski (skibby)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten, jetzt weiss ich mal wo ich ansetzen kann.
Gibt es irgendein einfaches Referenzprojekt wo man sich die 
Implementierung eines HAL mal anschauen kann ?

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.