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