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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.