Präprozessor und Konfigurationsbasierte Typengenerierung

Gast #3762618
Lesenswert?
• ▲
▼
Hallo Forum.
Ich hab gerade folgendes Problemchen:
Ich will für mein RTOS-basiertes CortexM4 Programm meine ADC Routinen 
refaktorieren. Tatsächlich brauch ich für jeden Kanal der in 
Verwendung ist ein Mutex.
Ob ein Kanal verwendet wird sagt mir die Konfigurationsdatei mit 
USE_ADC_X , wobei X die Kanalnummer ist.
Ich will natürlich um den Speicher zu schonen nicht jetzt 18 (soviele 
Kanäle sinds) Mutex-Ids erzeugen.
Meine Struktur dazu schaut jetzt so aus:
1
#ifdef USE_ADC1
2
  osMutexId adc_ch1_mutex_id;
3
#endif /* USE_ADC2 */
4

5
#ifdef USE_ADC2
6
  osMutexId adc_ch2_mutex_id;
7
#endif /* USE_ADC2 */
8

9
#ifdef USE_ADC3
10
  osMutexId adc_ch3_mutex_id;
11
#endif /* USE_ADC3 */
12

13
// et cetera et cetera...

Und das ist noch nichtmal alles, in der Initialisierungsroutine würde 
sich das ähnlich wiederholen..
Copypaste von der schlimmsten Sorte, nochdazu was wenn ich plötzlich 
noch eine zweite Variable pro Kanal erzeugen muss z.B.
1
 
2
int16_t ch1_kalibration_irgendwas;
Dann müsste ich die 18mal hinzufügen. Wie kann ich das verbessern? Kann 
ich das ganze mit einem Präprozessormakro erzeugen lassen zb
1
#define ADC_GENERATE_VARS(x)          \
2
#ifdef USE_ADC(x)                     \
3
  osMutexId adc_ch(x)_mutex_id; \ 
4
#endif /* USE_ADC(x) */               \
Ich befürchte nein weil Präprozessoranweisungen in einem Makro 
vorkommen.
Ausserdem was wenn ich pro erzeugten Variablen auch Javadoc generieren 
will? Kann ich die Javadocs auch in die Makros reinschreiben und wird 
das Makro dann von Doxygen aufgelöst? z.B.:
1
#define ADC_GENERATE_VARS(x)                                 \
2
#ifdef USE_ADC(x)                                            \
3
  osMutexId adc_ch(x)_mutex_id; /**< Mutex for ch(x)   \ 
4
#endif /* USE_ADC(x) */                                      \
Ich befürchte nicht!
Grüsse
M.

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