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...
Und wenn Du dann noch "#eldeif" ersetzt durch ein einfaches "#else", dann funktioniert die Chose sogar.
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 ##?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.