hallo zusammen, ich habe 3 makros innerhalb einer headerdatei (spi.h) definiert. diese macros sind geschachtelt bzw. rufen sich gegeneitig auf. sie werden von einem c-file aufgerufen (rf.c) nach folgendem schema. in den kommentierten zeilen erscheinen dann einige fehler. ich benutze den code composer. der code wurdeaus einem anderen projekt übernommen. in diesem wurde ein anderer compiler eingesetzt. (vermutlich mspgcc?) die makros befinden sich innerhalb von spi.h: //////////////////////////////////////////// #ifndef SPI_H_ #define SPI_H_ #include "msp430x22x4.h" #define SPI_WAITFOREOTx() while ((IFG2 & UCA0TXIFG) == 0) #define FASTSPI_TX_ADDR(a) \ do { \ UCA0TXBUF = a; \ SPI_WAITFOREOTx(); \ } while (0) #define FASTSPI_STROBE(s) \ do { \ P3OUT &= ~0x02; \ FASTSPI_TX_ADDR(s); \ FEHLER 1 P3OUT |= 0x02; \ FEHLER 2 } while (0) #endif /*SPI_H_*/ /////////////////////////////////////////// in rf.c wird FASTSPI_STROBE(s) aufgerufen: //////////////////////////////////////////// #include "spi.h" #define CC2420_SXOSCON 0x01 FASTSPI_STROBE(CC2420_SXOSCON); /////////////////////////////////////// FEHLER 1: - expected a declaration FEHLER 2: - this declaration has no storage class or type specifier - expected a ";" - unrecognized token - declaration is incompatible with "volatile unsigned char P3OUT" (declared at line 478 of "C:/Programme/Texas Instruments/ccsv4/msp430/include/msp430x22x4.h") - expected a declaration ich freue mich über antworten...
..wenn man den kaputten Quellcode repariert (Blöcke ausserhalb von Funktionen, fehlende Header, undefinierte Identifier, ..) dann compilierts einwandfrei, ergo liegt der Fehler bei Dir woanders. Liefer mal den kompletten(!) Quellcode in compilierbarer Form (oder speck ihn so weit ab dass er noch compilierbar ist und der selbe Fehler trotzdem noch auftritt und liefer dann das vollständig und compilierbar). HTH und nix für ungut
g457 schrieb: > ..wenn man den kaputten Quellcode repariert (Blöcke ausserhalb von > Funktionen, fehlende Header, undefinierte Identifier, ..) hier handelt es sich nur um macros, nicht um funktionen. was meinst du mit blöcken außerhalb von funktionen? der header "msp430x22x4.h" bindet die msp-spezifischen define-bezeichnungen ein. die "parameter" a und s der macros sind nur platzhalter. oder beziehst du dich auf den rest des codes, den ich nicht gepostet habe? g457 schrieb: > dann > compilierts einwandfrei, ergo liegt der Fehler bei Dir woanders. wenn man nur diesen code-ausschnitt compiliert ist alles ok? makros innerhalb von makros aufrufen ist also möglich (auch mit parametern).
> was meinst du mit blöcken außerhalb von funktionen? > FASTSPI_STROBE(CC2420_SXOSCON); ..expandiert ausserhalb jeglicher Funktion zu einem Block, das funtioniert nicht. > makros innerhalb von makros aufrufen ist also möglich Selbstverständlich. Würde mich schwer wundern wenn Dein Compiler das nicht unterstützt. HTH
vielen dank für deine antwort. ich nehme den code schritt für schritt auseinander um zu schauen, wo der fehler liegt. hier ein code der sich fehlerfrei compilieren lässt...
macros in interrupt service routinen sind wie zu erwarten auch unproblematisch. allerdings scheinen die variablen vor der main()-funktion deklariert werden zu müssen. in meiner code-vorlage werden die variablen innerhalb der isr deklariert. diese variante konnte ich nicht fehlerfrei compilieren. gibt es diesbezüglich unterschiede bei verschiedenen compilern?
den in diesem code kommentierten fehler konnte ich nicht auf die schnelle beheben. bei zeigern bin ich leider noch nicht intuitiv genug ;) WICHTIG: die kommentare in macro.h innerhalb der macrodefinitionen unbedingt vor dem compilieren entfernen. sonst gibts massig fehlermeldungen.
> for (spiCnt = 0; spiCnt < (c); spiCnt++) {\ ^ > FASTSPI_RX(((unsigned char*)(p))[spiCnt]);\ // hier fehler? ..da oben ist eine überzählige Klammer.
vielen dank. leider behebt die korrektur aber nicht das problem. ich erhalte beim kompilieren immer noch die selbe fehlermeldung. es bringt auch nichts die deklaration von spiCnt innerhalb von FASTSPI_READ_FIFO_NO_WAIT vor den do-block zu platzieren... die fehlermeldung scheint sich auf die zeiger-deklaration innerhalb des macros zu beziehen.
der code composer erlaubt keine castings (die vermeintlichen zeiger) und variablendeklarationen innerhalb von macro-blöcken. der mspgcc unterstützt beides.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.