Guten Morgen, ich benötige für meine Applikationen einen Softwareschalter. Dazu habe ich eine Headerdatei erzeugt. In dieser Datei soll der Schalter definiert sein. Ich habe insgesamt zwei Boards. Diese möchte ich in dieser Datei mit einem #if defined aktiveren. Wie kann man sowas in ANSi C realisieren ?
entwickler schrieb: > einen Softwareschalter Was ist das? Präzprozessordirektiven gibt es bei Google und in praktisch jedem C-Buch.
entwickler schrieb: > Wie kann man sowas in ANSi > C realisieren ? Soll Dir jetzt jemand aus einem C-Buch vorlesen oder für Dich googlen? Peter
TargetBoard.h:
1 | #ifndef __TargetBoard
|
2 | #define __TargetBoard
|
3 | |
4 | //#define BOARD1_USED
|
5 | #define BOARD2_USED
|
6 | |
7 | #endif
|
Diese defines werden dann in den entsprechenden C Files angewendet.
1 | #include "targetBoard.h" |
2 | |
3 | #if defined (BOARD1_USED)
|
4 | // Einstellungen für Board 1
|
5 | #elif defined (BOARD2_USED)
|
6 | // Einstellungen für Board 2
|
7 | #endif
|
Gibt es eine bessere Alternative ?
entwickler schrieb: > Gibt es eine bessere Alternative ? Nein, das ist der übliche Weg. Funktioniert problemlos.
entwickler schrieb: > Gibt es eine bessere Alternative ? Steuern via Makefile bzw. defines direkt dem Compiler übergeben? gcc -DBOARD1 -Wall -..... gcc -DBOARD2 -Wall -.....
Es gibt auch die Möglichkeit, die Quelle nicht mit #ifdefs zu übersäen: Die unterschiedlichen Funktion(alität)en pro Board / Variante werden in ein eigenes Modul ausgelagert, das je nach Build-Variante hinzugelinkt wird:
1 | LD = avr-gcc -mmcu=atmega123 |
2 | |
3 | variante1.elf: modul1.o main.o |
4 | $(LD) $(LDFLAGS) $^ -o $@ |
5 | |
6 | variante2.elf: modul2.o main.o |
7 | $(LD) $(LDFLAGS) $^ -o $@ |
Ich würde je Modul eine eigene Config-Headerdatei einbinden und dort ggf. die Fallunterscheidung machen. Dann kann man den Modulcode unabhängig von den Boardeinstellungen pflegen/weitergeben/aktualisieren. Beispiel:
1 | // uart_config.h
|
2 | |
3 | #include "targetBoard.h" |
4 | |
5 | #if defined (BOARD1_USED)
|
6 | // Einstellungen für Board 1
|
7 | #elif defined (BOARD2_USED)
|
8 | // Einstellungen für Board 2
|
9 | #endif
|
1 | // uart.c
|
2 | |
3 | #include "uart_config.h" |
4 | |
5 | // Code
|
Wenn Du die uart.c jemand anderem zur Verfügung stellst, kann er sie ohne Änderungen in sein Projekt aufnehmen, er muss ggf. nur uart_config.h auf seinen eigenen Auswahlmechanismus ändern: - Er kann Einstellungen für seine eigenen Boards ergänzen. - targetBoard.h darf anders heißen. - Das Board kann alternativ per Compileroption definiert werden. - Er nutzt für jedes Projekt eine eigene uart_config.h bzw. inkludiert darin eine, die nur die Einstellungen des richtigen Boards enthält. - Er inkludiert eine globale config.h. - ... Andernfalls müsste er für alle diese Änderungen uart.c ändern. Wenn Du ihm später eine neue Version von uart.c gibst, müsste er darin die Änderungen jedes mal wieder nachziehen. Wenn die Einstellungen vom Code getrennt sind, kann man uart.c dagegen einfach austauschen, solange keine neuen Einstellungen ohne Defaultwert dazu kommen.
>Gibt es eine bessere Alternative ?
Ja. Wenn die Funktionalitäten der beiden Boards sich nicht zu stark
unterscheiden und sonst nichts dagegenspricht, würde ich die Abfrage
zur Laufzeit machen, um nur mit einem identischen Image hantieren
zu müssen.
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.