www.mikrocontroller.net

Forum: PC-Programmierung Kompilieren in Abhängigkeit vom Target-System


Autor: COMPILIERENli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin an einer Studienarbeit. Dazu muss ich eine Kommunikation 
zwischen uC und PC herstellen. Der Code ist dabei auf dem PC und dem uC 
weitgehend gleich, allerdings unterscheiden sie sich beim Versenden und 
Empfangen.
Dazu gibt es für den PC und den uC bereits Funktionen, die ich verwenden 
möchte. Diese unterscheiden sich durch (natürlich) den Funktionsname und 
der Parameterliste die übergeben wird.
Zur Benutzerfreundlichkeit wäre es gut, wenn der Benutzer, welche die 
Software evtl anpassen und neu kompilieren möchte einfach ein Flag oder 
ähnlich setzen können für welches Zielsystem das Programm kompiliert 
werden soll und dann die Richtigen Funktionen zum Versenden und 
Empfangen verwendet werden.
Geht das überhaupt und wenn ja: wie? Gibt es darüber eine Homepage oder 
so, wo sowas in der Art beschrieben ist?
Wie so oft fehlen mir einfach die Suchbegriffe dafür. Könnte man das mit 
Pointer auf Funktionen lösen? Oder ist das der völlig falsche Ansatz?

Danke für jede Hilfe

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das nennt man bedingte Compilation und kann in C mit Makros erreicht 
werden:


#ifdef PC_SEITE
  machwas_fuer_den_pc();
#else
  machwas_fuer_den_uc();
#endif

Allerdings wird der Code für beide Systeme sowieso mit unterschiedlichen 
Compilern übersetzt, daher ließe sich auch eines der von den jeweiligen 
Compilern automatisch definierten "Flags" auswerten. MS-Compiler 
beispielsweise definieren WIN32, und das wird ein Compiler für einen µC 
kaum tun.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
COMPILIERENli wrote:

> Zur Benutzerfreundlichkeit wäre es gut, wenn der Benutzer, welche die
> Software evtl anpassen und neu kompilieren möchte einfach ein Flag oder
> ähnlich setzen können für welches Zielsystem das Programm kompiliert
> werden soll und dann die Richtigen Funktionen zum Versenden und
> Empfangen verwendet werden.
> Geht das überhaupt und wenn ja: wie?

Sowas kann man mit dem Präprozessor erledigen

zb so:

[C]
#define MIKRO         // uncomment if you are compiling for the mc
                      // comment this definement if you are compiling
                      // for a PC

....
#ifdef MIKRO
     call_Function_A( arg1, arg2, arg3 );
#else
     call_Function_B( arg3, arg1 );
#endif

> Könnte man das mit
> Pointer auf Funktionen lösen? Oder ist das der völlig falsche Ansatz?

In dem Fall: ja
Denn der jeweils 'falsche' Funktionsaufruf darf im Quelltext gar
nicht auftauchen. Durch die Klammerung mit einem Makro wirft
der Präprozessor den jeweils falschen Aufruf bereits aus dem
Source Code hinaus, noch bevor der eigentliche Compiler den
Quelltext zu sehen kriegt.

Am besten versteckt man diesen Präproz-Mambo-Zamba in jeweils einer
eigenen Funktion, so dass der Rest des Programmes nicht durch
übermässige Makroinflation unlesbar wird

Autor: COMPILIERENli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Hab grad meine Frage nochmals gelesen, und habe festgestellt, dass ich 
nicht erwähnt habe, dass es um C-Programmierung geht. Aber ihr habt das 
offenbar richtig in der Kristallkugel gesehen.
Vielen dank für die Tipps, das scheint es zu sein.
Sehe ich das richtig, dass diese verwendeten #ifdef etc. direkt im Code 
verwendet werden?
Kann auch mehr als eine Zeile Code zwischen #ifdef und #else stehen, das 
wäre sehr praktisch!

Habt vielen Dank!!

Autor: Gabriel Wegscheider (gagosoft)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klar, zwischen #ifdef, #else und #endif kann sich ein ganzes Programm 
verstecken. Der C-Preprocessor (im Compiler integriert) schmeisst dann 
das ungenutzte Zeug raus, bevor es dem eigentlichen Compiler vorgesetzt 
wird.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann auch mehr als eine Zeile Code zwischen #ifdef und #else stehen, das
> wäre sehr praktisch!

Selbstverständlich. Da kann beliebig viel drinstehen, sogar 
plattformabhängige #includes können darin verpackt werden.

Autor: COMPILIERENli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, danke! Dann sollte dem erfolgreichen Umsetzen nichts mehr im Wege 
stehen (nur noch die knappe Zeit und die 1000 anderen Dinge die ich noch 
vergessen habe)...
Ich komm auf euch zurück wenns nicht vorangeht ;-) Danke

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei du vielleicht "besser" die Funktionen unterschiedlich deklarierst.
So ala
#ifdef PC
  #define usart_write(format, args)   usart_write_PC(PSTR(format) , ## 
args)
#eldeif
  #define usart_write(format, args)   usart_write_UC(PSTR(format) , ## 
args)
#endif

Damit brauchst du keine ifdef Orgie im code machen...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn Du dann noch "#eldeif" ersetzt durch ein einfaches "#else", 
dann funktioniert die Chose sogar.

Autor: COMPILIERENli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Hilfe, aber kann mir jemand noch kurz erklären wie 
das von  Werner A. (homebrew) funktioniert?
Also das #ifdef ... #elseif hab ich verstanden, dann kommt eine 
Funktionmit zwei Parametern, diese wird im Code ersetzt durch 
usart_write_PC(PSTR(format) , ##args), aber was machen die ##?

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das benutzt man für eine variable Anzahl von Parametern. Kannst du 
ignorieren. Es reicht ja wenn die Funktion beim Compilieren ersetzt 
wird.

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.