Ich versuche gerade meine eigenen Definitionen für Interruptvektoren zu generieren. Das ganze soll für eine USART so ablaufen: Ich definiere nur welche USART benutzt wird und alles andere soll via ## Operatoren generiert werden. Hier der Code:
Wenn ich das kompiliere kommt der folgende Fehler:
source/test.c:13:29: Fehler: das Einfügen von »)« und »_RXC_vect« ergibt kein gültiges Präprozessor-Token
Wenn ich aber interrupt.h nicht einbinde und statt dessen die auskommentierten Zeilen verwende funktioniert es. Die auskommentierten Zeilen sind die für den Interrupt notwendigen Definitionen aus interrupt.h und sfr_defs.h. USART0_RXC_vect habe ich aus der über io.h eingebundenen Hardwarebeschreibungsdatei.
Ich benutze MPLABX Version 6.10 und avr-gcc in Version 5.4.0.
Ich habe auch versucht das Konzept für andere Sachen als den Interruptvektor zu verwenden. Sobald ich aber irgendwas aus der avr Library einbinde passiert genau dasselbe. Irgendwas in dieser Library verhindert also, dass das richtig übersetzt wird.
Hat jemand vielleicht eine Idee was das sein könnte und wie man das umgehen kann?
Läuft denn der Preprozessor alleine durch? Dann kannst du dir doch anschauen, was der da zusammenbastelt.
Ansonsten wird wohl niemand für dich sich durch die Sourcen der avrlibc wühlen, um dein ganz spezielles Problem zu lösen. Das musst du schon selber machen.
Läuft denn der Preprozessor alleine durch? Dann kannst du dir doch
anschauen, was der da zusammenbastelt.
Ansonsten wird wohl niemand für dich sich durch die Sourcen der avrlibc
wühlen, um dein ganz spezielles Problem zu lösen. Das musst du schon
selber machen.
Oliver
Es ist ja ein Präprozessorfehler, da vermute ich dass er gar keine Ausgabe generiert. Deshalb habe ich da gar nicht gesucht. Aber ich werde es Mal probieren.
So speziell ist das Problem meiner Ansicht nach gar nicht, ## wird auch in der avr-libc benutzt.
Ich dachte halt dass es dieses Problem eventuell schon Mal gab und ich könne die Fehlersuche etwas beschleunigen.
Zwischen diese Makros packe ich den spezifischen Code. Mein Editor zeigt
mit hellgrauer Schrift, welche Blöcke inaktiv sind.
Mehrfach verschachtelte Makros vermeide ich, denn sie führen manchmal zu
Fehlermeldungen, die ich nicht durchblicke.
Ja, so hatte ich das vorher auch. Aber vor Jahren hatte ich auch schon Mal das mit dem ## benutzt. Es erscheint mir irgendwie logischer. Damals ging es; also würde ich es gerne wieder so machen.
Ich dachte halt dass es dieses Problem eventuell schon Mal gab und ich
könne die Fehlersuche etwas beschleunigen.
Da der avr-gcc 12 auf meinem Rechner das fehlerfrei compiliert (siehe oben), ists wohl entweder ein Problem deines Uraltcompilers, oder deine Installation ist kaputt.
Wenn ich das kompiliere kommt der folgende Fehler:
source/test.c:13:29: Fehler: das Einfügen von »)« und »_RXC_vect« ergibt
kein gültiges Präprozessor-Token
Für welche AVR-Familie soll Dein Code genutzt werden? Ich vermute, dass in dem Header mit den Registerdefinitionen Deiner MCU USART0 und USART1 bereits als Pointer auf eine Struktur definiert sind, z.B. so:
#define USART0 (*(USART_t ) 0x0800)
#define USART1 ((USART_t *) 0x0820)
Mein Vorschlag: Bau das Symbol aus drei Elementen zusammen.
Das erste ist das konstante Schlüsselwort "USART"
das zweite ist ein Makro, das die Ziffer 0 oder 1 enthält
das dritte ist das konstante Schlüsselwort "_RXC_vect"
Ich dachte halt dass es dieses Problem eventuell schon Mal gab und ich
könne die Fehlersuche etwas beschleunigen.
Da der avr-gcc 12 auf meinem Rechner das fehlerfrei compiliert (siehe
oben), ists wohl entweder ein Problem deines Uraltcompilers, oder deine
Installation ist kaputt.
Ich habe den genommen der im Ubuntu Repository ist. Dort ist leider nur diese Version. Ich habe auch Mal nach einer neueren gesucht, aber damals nichts gefunden. Ich werde also nochmal suchen.
Prozessor ist ein AVR128DA32.
Ich habe jetzt Mal in dem Präprozessorlisting geschaut, und da wird USART0 durch eine Adresse ersetzt. Siehe die Antwort von Volker. Das probiere ich jetzt Mal.
Für welche AVR-Familie soll Dein Code genutzt werden? Ich vermute, dass
in dem Header mit den Registerdefinitionen Deiner MCU USART0 und USART1
bereits als Pointer auf eine Struktur definiert sind, z.B. so:
#define USART0 (*(USART_t ) 0x0800)
#define USART1 ((USART_t *) 0x0820)
Mein Vorschlag: Bau das Symbol aus drei Elementen zusammen.
Das erste ist das konstante Schlüsselwort "USART"
das zweite ist ein Makro, das die Ziffer 0 oder 1 enthält
das dritte ist das konstante Schlüsselwort "_RXC_vect"