Hallo. Stolpere gerade über die Textübergabe innerhalb der Präprozessor-Makros. #define PORT_AKKU (PORTB,PB4) // Globale Vorgabe ... #define BATT_ON (AUSGANG_SET_HIGH (PORT_AKKU)) // statt (PORTB,PB4) #define BATT_OFF (AUSGANG_SET_LOW (PORT_AKKU)) // statt (PORTB,PB4) ... Compiler meckert! Ist es nicht möglich, mehr als 1 Wert gleichzeitig zu übergeben?
Gast
#4507405
__Son´s B. schrieb: > AUSGANG_SET_HIGH (PORT_AKKU) Überlege doch einmal, was der Präprozessor daraus macht? Und wo ist AUSGANG_SET_HIGH definiert? Setze einmal den Compilerschalter, dass er nur den Präprozessor ausführt. Dann schaue Dir das Ergebnis an......
@__Son´s Bersi__ (bersison)
>Stolpere gerade über die Textübergabe innerhalb der Präprozessor-Makros.
Nimm Funktionen mit gescheiten Parameter. Deine Aufgabe braucht mit an
Sicherheit grenzender Wahrscheinlichkeit KEINE hyperschnellen
Inline-Makrofunktionen.
Peter M. schrieb: > Und wo ist AUSGANG_SET_HIGH definiert? Im Kopf definiert; #define AUSGANG_SET_HIGH(port,mask) ((port) |= (1<<mask)) #define AUSGANG_SET_LOW(port,mask) ((port) &= ~(1<<mask)) Einzelne Parameter/Konstanten wie PI= 3.1415 werden problemlos ersetzt. Bei 2 Parametern "PORTB" und "PB4" klappt´s nicht. Finde auch nichts in Fachliteratur. Falk B. schrieb: > Nimm Funktionen mit gescheiten Parameter. Deine Aufgabe braucht mit an > Sicherheit grenzender Wahrscheinlichkeit KEINE hyperschnellen > Inline-Makrofunktionen. --1-- Mir geht es darum, einen Startblock zu schaffen, in dem alle relevanten Parameter, übersichtlich zusammengefasst werden. --2-- Nutze Makro gerne um dauerwiederkehrende Funktionen ab zu legen. Warum sollte das falsch sein?
__Son´s B. schrieb: > Ist es nicht möglich, mehr als 1 Wert gleichzeitig zu übergeben? Doch, über ein Zwischenmakro. Nur in der ersten Instanz wird die Argumentenzahl geprüft.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Vielen Dank für deine Info!
Gast
#4507804
Andere Variante:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Wird vom Compiler ebenfalls perfekt optimiert. Diese Makros funktionieren auch mit Registern und Integer Variablen. Aber sprechende Makros wie "LED_ON" und "LED_OFF" finde ich hilfreicher.
Gast
#4507880
Ich denke es sind die Klammern in
1 | |
Denn das ergibt ein
1 | |
Der Präprozessor macht an dieser Stelle stumpf eine Textersetzung.
__Son´s B. schrieb: > #define BATT_ON (AUSGANG_SET_HIGH (PORT_AKKU)) // statt (PORTB,PB4) > #define BATT_OFF (AUSGANG_SET_LOW (PORT_AKKU)) // statt (PORTB,PB4) > ... > > Compiler meckert! > Ist es nicht möglich, mehr als 1 Wert gleichzeitig zu übergeben? Ist ja auch logisch. Das Leerzeichen in "(AUSGANG_SET_HIGH (PORT_AKKU))" wird nicht als Leerzeichen erkannt sondern als Delimiter, also Trenner von Argumenten. ;)
Hallo - komme jetzt erst zum Weitermachen... Habe immer noch das Problem, dass ich es nicht schaffe Macros zu verschachteln. Ich würde gerne aus; #define AUSGANG_SET_HIGH(port,mask) ((port) |= (1<<mask)) #define BATT_ON (AUSGANG_SET_HIGH(PORTA,PA4)) (Funktioniert einwandfrei!) solche Parametrierung machen; #define AUSGANG_SET_HIGH(port,mask) ((port) |= (1<<mask)) #define PORT_BATT_OUT(PORTA,PA4) #define BATT_ON (AUSGANG_SET_HIGH(PORT_BATT_OUT)) Compiler meckert. Obwohl nach meine Verständnis folgender Ersatz raus kommen sollte; #define BATT_ON (AUSGANG_SET_HIGH((PORTA,PA4))) Syntaxfehler?
Gast
#4534932
> #define PORT_BATT_OUT(PORTA,PA4)
Das ist ein Syntaxfehler. Du definierst hier ein Makro mit zwei
Parametern, aber dahinter steht nicht, durch welchen Text PORT_BATT_OUT
sersetzt werden soll.
Versuche es mal mit
#define PORT_BATT_OUT (PORTA,PA4)
Also mit Leerzeichen vor der geöffneten Klammer
Stefan U. schrieb: > #define PORT_BATT_OUT (PORTA,PA4) > > Also mit Leerzeichen vor der geöffneten Klammer Compiler meckert genau so.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.