Forum: Compiler & IDEs Variable defines erstellen


von Norbert S. (norton)


Lesenswert?

Hallo ich würde gerne über nur eine define änderung zwichen 
verschiedenen Countern umschalten können (es werden teilw. verschiendene 
Prozessoren verwendet).

Ich hätte mir das ganze zirka so vorgestellt:
1
#define MV_TIMER 3
2
3
#define MV_TIMER_COMPA_VECT   TIMER##MV_TIMER##_COMPA_vect  
4
#define MV_TIMER_COMPB_VECT   TIMER##MV_TIMER##_COMPB_vect
5
#define MV_TIMER_OVF_VECT   TIMER##MV_TIMER##_OVF_vect

das Problem ist, dass MV_TIMER nicht aufgelöst wird.

Gibt es ergendwie die Möglichkeit einfach umzustellen ohne jede Zeile 
einzeln zu ändern?

Gruß Norton

von Stefan E. (sternst)


Lesenswert?

> (es werden teilw. verschiendene Prozessoren verwendet).

Da sind dann aber auch die Namen teilweise leicht unterschiedlich.

Warum nicht einfach so?
1
#if defined (__AVR_ATmega48__)
2
3
#  define MV_TIMER_COMPA_VECT   TIMER0_COMPA_vect
4
#  define MV_TIMER_COMPB_VECT   TIMER0_COMPB_vect
5
#  define MV_TIMER_OVF_VECT     TIMER0_OVF_vect
6
7
#elif defined (__ATtiny26__)
8
9
#  define MV_TIMER_COMPA_VECT   TIMER1_CMPA_vect
10
#  define MV_TIMER_COMPB_VECT   TIMER1_CMPB_vect
11
#  define MV_TIMER_OVF_VECT     TIMER1_OVF1_vect
12
13
#elif defined ...
14
15
...
16
17
#endif

So funktioniert die Umstellung sogar automatisch, je nach dem halt, was 
man beim Compilieren als mcu verwendet.

von Norbert S. (norton)


Lesenswert?

Die Prozessoren sind soweit ich es benötige kompatibel.

die Lösung mit den "#if defined ..." ist mir bewusst, wollte ich aber 
nicht verwenden weil wenn eine Änderung nötig ist, muss ich für alle 
Zweige (Prozessoren) die Änderung vornehmen.

Außerdem dachte ich mir eigentlich, dass der Austausch der Zahlen kein 
Problem darstellen sollte. (jetzt denke ich anders)

Aber danke für den Rat

von Mino (Gast)


Lesenswert?

laut meinen bisherigen programmierkentnissen ist es bei 
präprozessordirektiven nicht anders möglich als "#if defined ..." bzw. 
"#ifdef ..." zu benutzen.

mfg. Mino

von Norbert S. (norton)


Lesenswert?

ich währe auch mit einer Makrolösung zufrieden, aber auch diese Variante 
funktioniert leider nicht.

so inetwa:
1
#define SET_TIMER_NR (TimerNr)   \
2
   #define MV_TIMER_COMPA_VECT   TIMER##TimerNr##_COMPA_vect   \
3
   #define MV_TIMER_COMPB_VECT   TIMER##TimerNr##_COMPB_vect
4
5
SET_TIMER_NR(3)

von Stefan E. (sternst)


Lesenswert?

Was gehen würde, ist folgendes:
1
#define MV_TIMER 3
2
3
#define MV_TIMERCOMPAVECT(x)   TIMER ## x ## _COMPA_vect
4
#define MV_TIMER_COMPA_VECT(x) MV_TIMERCOMPAVECT(x)
5
6
...
7
...
8
9
ISR(MV_TIMER_COMPA_VECT(MV_TIMER))

von Norbert S. (norton)


Lesenswert?

Danke!

das Funktioniert zwar, aber es währe schön gewesen, wenn es einfacher 
und übersichtlicher funktioniert hätte.

Ich dachte, da es ja nur um eine Textersetzung geht sollte es einfacher 
sein "Zeichen" auszutauschen.

Mal sehen wie ich das machen werde.

Oder hat jemand noch eine andere Idee?

von yalu (Gast)


Lesenswert?

Hier ist noch eine Möglichkeit, die auf dem gleichen Grundgedanken wie
Stefans Vorschlag beruht. Man kann damit Makros definieren, die aus
beliebigen drei Teilen zusammengesetzt sind, von denen jeder vor dem
Zusammenfügen expandiert wird.

Statt
1
#define m a##b##c

schreibst du
1
#define m CONCAT3(a, b, c)

In deinem Beispiel:
1
#define MV_TIMER 3
2
3
#define MV_TIMER_COMPA_VECT CONCAT3(TIMER, MV_TIMER, _COMPA_vect)
4
#define MV_TIMER_COMPB_VECT CONCAT3(TIMER, MV_TIMER, _COMPB_vect)
5
#define MV_TIMER_OVF_VECT   CONCAT3(TIMER, MV_TIMER, _OVF_vect)
6
7
// CONCAT3 expandiert die drei Argumente und fügt sie zu einem Token
8
// hintereinander
9
#define CONCAT3H(arg1, arg2, arg3) arg1##arg2##arg3
10
// CONAT3H ist ein Hilfsmakro für CONCAT3
11
#define CONCAT3(arg1, arg2, arg3) CONCAT3H(arg1, arg2, arg3)
12
13
ISR(MV_TIMER_COMPA_VECT) {
14
}
15
16
ISR(MV_TIMER_COMPB_VECT) {
17
}
18
19
ISR(MV_TIMER_OVF_VECT) {
20
}

von Stefan E. (sternst)


Lesenswert?

> das Funktioniert zwar, aber es währe schön gewesen, wenn es einfacher
> und übersichtlicher funktioniert hätte.

Schön finde ich das auch nicht, deshalb habe ich dir ja erst was 
anderes vorgeschlagen. Ich sehe übrigens immer noch nicht, was dir daran 
nicht gefällt. Du musst ja nicht auf Basis des Typs unterscheiden, du 
kannst ja auch nach MV_TIMER unterscheiden:
1
#define MV_TIMER 3
2
3
#if (MV_TIMER == 0)
4
5
...
6
7
#elif (MV_TIMER == 1)
8
9
...
10
11
#elif ...
12
13
...
14
15
#endif

von Norbert S. (norton)


Lesenswert?

Danke an alle!

Ich habe die "CONCAT3" Variante gewählt. Ist für meine Zwecke die 
schönste.

@Stefan Ernst
Ich bin dabei eine Art "Library" (.c .h files mit Funktionen) zu 
erstellen. Diese Funktionen sollen von allen verwendet werden. Und nur 
durch Parametrierung angepasst werden.
Wenn ich eine Funktion habe möchte ich grundsätzlich nur an einer Stelle 
Anpassungen machen müssen wenn eine Änderung nötig ist.
Weiters habe ich extra eigene Defines verwendet um von der HW unabhängig 
zu sein (HAL). Würde ich eine Änderung am Timer vornehmen müssen müsste 
ich das bei der #ifdef Variante bei allen nachziehen müssen so nur 
einmal.
Weiters bin ich so mit dem derzeitigen Print sehr schnell im Stande den 
Timer zu wechseln -> ist jetzt ja nur noch ein Define.
Ich weiß nicht ob ich mein Anliegen verständlicher gemacht habe, aber 
ich hoffe doch.

Ich bedanke mich nochmals recht herzlich bei allen die Vorschläge 
gemacht haben.

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
Noch kein Account? Hier anmelden.