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


von COMPILIERENli (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Karl H. (kbuchegg)


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

von COMPILIERENli (Gast)


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!!

von Gabriel W. (gagosoft)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von COMPILIERENli (Gast)


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

von Werner A. (homebrew)


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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von COMPILIERENli (Gast)


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

von Werner A. (homebrew)


Lesenswert?

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

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.