ANSI C - Softwareschalter definieren

Gast #3000737
Lesenswert?

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 ?
Gast #3000831
Lesenswert?

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 ?
Persönliche Seite #3000860
Lesenswert?

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 $@
#3000916
Lesenswert?

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.
Gast #3003157
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren