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.
Oliver
Wie sieht die GCC-Kommandozeile aus?
Bezieht sich die in der Fehlermeldung angegebene Zeilennummer 13
wirklich auf den geposteten Code? In dieser Zeile steht ein
unverdächtiges
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.
Oliver S. schrieb:> 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.
Georg
Yalu X. schrieb:> Wie sieht die GCC-Kommandozeile aus?>> Bezieht sich die in der Fehlermeldung angegebene Zeilennummer 13> wirklich auf den geposteten Code? In dieser Zeile steht ein> unverdächtiges>>
>> 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.
Georg
Georg P. schrieb:> 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.
Für welchen AVR compilierst du denn?
Oliver
Georg P. schrieb:> 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"
So zum Beispiel:
#define cfgDBG_USART_NO 0
...
#define dbgRXC_VECT CONCAT3(USART, cfgDBG_USART_NO, _RXC_vect)
Grüßle,
Volker
Oliver S. schrieb:> Georg P. schrieb:>> 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.>> Für welchen AVR compilierst du denn?>> Oliver
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.
Danke, Georg
Volker B. schrieb:> 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">> So zum Beispiel:>> #define cfgDBG_USART_NO 0> ...> #define dbgRXC_VECT CONCAT3(USART, cfgDBG_USART_NO, _RXC_vect)>> Grüßle,> Volker
Ich habe jetzt auch gefunden dass USART0 durch die Speicheradresse
ersetzt wird. Ich denke das war es dann. Ich bin gerade dabei das
abzuändern.
Danke, Georg