PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AtmelStudio 7.0.634 - Probleme mit typedef



oberallgeier
20.02.2016, 09:28
Guten Morgen,

bitte um Rat zu folgendem Problem mit Studio 7. Ich hatte gestern AtmelStudio 7.0.634 installiert und so den Umstieg von AVRStudio 4.18 Build 700 vorbereitet. Win7 Pro SP1, Notebook Sony Vaio SVE171A11M / SVE1711G1EW, 2,30 GHz, 4 GB. Vor der Installation wurden sämtlichen vorherigen Files zu WINAVR und Studio 4 entfernt, sie tauchen auch wirklich nicht mehr auf (kontrolliert mit File-Explorer).

Ich verwende eine Headerdatei mydefs.h (von P.Dannegger, mit eigenen Erweiterungen) zur einfacheren Verwendung von "allerlei". Bisher, im Studio4, hatte ich damit keinerlei Probleme.
Ein kurzer Auszug davon :

// Easier type writing:
typedef unsigned char u8;
typedef signed char s8;
typedef uint16_t u16; //typedef unsigned short u16;
typedef int16_t s16; //typedef signed short s16;
typedef unsigned long u32;
typedef signed long s32;

Als Umstiegstest dient ein eher kurzes Quellprogramm zum Betreiben eines Encodermotors mit einer Ansteuerung wie ein Modellbauservo, darin werden Variablen z.B. aus der typedef-Umbenennung verwendet. Daraus entstehen die folgenden, im Studio4 nicht aufgetretenen Fehlermeldungen (NUR diese, dazu noch einige Warnungen wie "implizit" etc.) :

Description Project File Line
(x) unknown type name 'u8' S-bbo_1a C:\..\Sbbyo_inf13.c 48
(x) 'RX0_SIZE' undeclared (first use in this function) S-bbo_1a C:\..\Sbbyo_inf13.c 48
(i) each undeclared identifier is reported ... S-bbo_1a C:\..\Sbbyo_inf13.c 48
(x) 'rxrawb' undeclared (first use in this function) S-bbo_1a C:\..\Sbbyo_inf13.c 48
(x) 'rx_buff' undeclared (first use in this function) S-bbo_1a C:\..\Sbbyo_inf13.c 48
(x) unknown type name 'int16_t' S-bbo_1a C:\..\Sbbyo_inf13.c 77
(x) unknown type name 'uint16_t' S-bbo_1a C:\..\Sbbyo_inf13.c 84

Der zugehörige File, auszugsweise, die entsprechenden Textzeilen sind (farbig) markiert in der richtigen Reihenfolge :

// ================================================== =========================== =
// == Lies den Puffer rx_buff[RX0_SIZE] und gib ihn auf UART aus
// Der Puffer rx_buff[RX0_SIZE] wird kopiert nach rxrawb [RX0_SIZE]
// und anschließend wird rxrawb auf UART ausgegeben
// ================================================== =========================== =
void wrrxua (void) // Schreib den RX-Puffer auf die UART
{ //
uputs0 ("\t=> wrrxua\r\n"); //
cli(); // Beim Kopieren kein Interrupt erlaubt
for (u8 i = 0; i<(RX0_SIZE-1); i++) rxrawb [i] = rx_buff[i]; // line 48
// rxrawb [RX0_SIZE-1] = "\0"; // String abschließen
sei(); //
// uputs0 ( *rxrawb ); //
} //
// ================================================== =========================== =
// ================================================== =========================== =


// ================================================== =========================== =
// ================================================== =========================== =
// Initialisiere USART0 mit vorgegebener Baudrate 07Dez2012 übernommen von
// Code:von PDannegger http://www.mikrocontroller.net/topic/101472
// Zum Senden von Zeichen wie char irgendwas[] = "meintext" verwenden:
// uputs0 (irgendwas); oder direkt
// uputs0 ("meinText"); verwenden
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Vor dem 07Dez2012 hießen die Programme: siehe:
// RSeTe_x10_24Aug13_0936_Menue-6-7-8-9-u-12-gut_vor-Versionsaenderung-auf-x20

// ================================================== =========================== =
// Hilfsfunktion, um Zahlen über das UART auszugeben
void uputs0i(const int val) // Zahlen signed Integer8 über UART0 ausgeben
{
char buffer[8];
uputs0 ( itoa(val, buffer, 10) );
}
// ================================================== =========================== =
// ================================================== =========================== =
void uputs0i2 ( int16_t val ) // Zahl signed 16bit üb UART ausgeben lib // line 77
{
char buffer[8];
uputs0 ( itoa(val, buffer, 10) ); // lib
}
// ================================================== =========================== =
// ================================================== =========================== =
void uputs0u( uint16_t val ) // Zahl unsigned16bit üb UART ausgeben lib // line 84
{
char buffer[8];
uputs0 ( utoa(val, buffer, 10) ); // lib
}
// ================================================== =========================== =

Die beanstandeten Variablentypen werden auch an anderer Stelle wiederholt verwendet ohne Fehlermeldung. Kann es sein, dass die Fehlermeldung nur in einer Parameterliste auftreten ?
Die Fehlermeldungen sind mir rätselhaft.
Ich bitte um Hilfe, Aufklärung, Hinweise . . . und danke im Voraus.

Wsk8
20.02.2016, 11:01
1. Fehler:
C erlaubt erst ab C99 die Variablen deklaration in der Initializer list.
Header nicht inkludiert?

2. Fehler:
stdint.h nicht inkludiert.

mfg

Peter(TOO)
20.02.2016, 11:59
Hallo Geier,

Die Fehlermeldungen sind mir rätselhaft.
Wie schon geschrieben wurde:
C erlaubt erst ab C99 die Variablen deklaration in der Initializer list.

Aber der Compiler scheint u8, int16_t und uint16_t nicht zu kennen, was auf eine vergessene mydefs.h schliessen lässt.

Allerdings gibt es noch gemeine Fehler, welche sich in einer Headerdatei verstecken können.
z.B. kann ein vergessenes ';' oder ',' dazu führen, dass weitere Headerdateien irgendeinem Macro oder so zugeschlagen werden.
Eine Fehlermeldung taucht dann erst viel später auf :-)

Grundsätzlich kann man z.B. ein Macro auf mehrer Headerdateien verteilen.
Der Preprocessor fügt bei einem #include wird einfach die angegebene Datei eingefügt.
#defines werden dann wie "suchen und Ersetzen" bei einem Texteditor aufgelöst.


Und in C darf man nur den ersten Fehler beachten!
Der Rest sind meistens Folgefehler weil der Parser aus den Trott kommt.

MfG Peter(TOO)

oberallgeier
20.02.2016, 13:23
Danke Wsk8, danke Peter für die Antworten, insbes. den Hinweis auf C99. Dazu musste ich ja im Studio4 seinerzeit schon ne entsprechende Einstellung erledigen in den Custom Compilation Options. Dort steht nun im linken Fenster in Projekt-Options
[All files]
SERVObabyo_1.c
[Linker Options]

Im rechten Fenster in Projekt-Options steht
-Wall
-gdwarf-2
-std=gnu99
-Os
-funsigned-char
-funsigned-bitfields
-fpack-struct
-fshort-enums

Möglicherweise gibts ähnliche Einstellungen im Studio 7 - dazu muss ich mich aber dort erst Mal besser zurechtfinden - noch habe ich keine entsprechende Einstellmöglichkeit gefunden.

Verschiedene Header wie stdint.h hatte ich eingebunden (mal alle, mal den einen oder andern weggelassen) und natürlich die mydefs.h. Letztere "irgendwo" in einer Subdirektory - für "alle" Projekte zugreifbar - die ich entsprechend referenziert hatte. In meiner Verzweiflung hatte ich testweise die mydefs.h. auch als Datei im Projektorder liegen - mit entsprechendem "datei.h"-Include statt <datei.h>-Include. Selbst die Änderung der includierten mydefs.h mit "//" Kommentaren stets in einer gesonderten Zeile brachte keine Besserung. Lief alles ein bisschen nach der Art experimentelle Softwareentwicklung.

Ich mach mich also auf die Suche nach der Stelle zum Einschalten der std=gnu99-Option.

oberallgeier
20.02.2016, 17:10
So, ich hab Einstellmöglichkeiten für das Projekt gefunden in Werkzeugleiste "Project", Zeile "S-bbo_1a Propertiees...ALT-F7". Das führt zum File, C:\tools\..\S-bbo_1a\S-bbo_1a.cproj. Darin gibt es Einstellmöglichkeiten, z.B. [AVR/GNU C Compiler]. Darin gibts das Fenster "All Options" - in dem das Folgende gelistet ist (ohne Zeilenvorschub, den habe ich darunter der besseren Lesbarkeit hinzugefügt:

Das Orignal:

-x c -funsigned-char -funsigned-bitfields -DDEBUG -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0. 90\include" -I"../../../../CLib_01" -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega328p -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0. 90\gcc\dev\atmega328p" -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"

... in besserer Lesbarkeit

-x
c
-funsigned-char
-funsigned-bitfields
-DDEBUG
-I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0. 90\include"
-I"../../../../CLib_01"
-O1 -ffunction-sections
-fdata-sections -fpack-struct -fshort-enums
-g2
-Wall
-mmcu=atmega328p
-B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0. 90\gcc\dev\atmega328p"
-c
-std=gnu99
-MD -MP
-MF "$(@:%.o=%.d)"
-MT"$(@:%.o=%.d)"
-MT"$(@:%.o=%.o)"

Fazit: Der Schalter gnu99 steht auf "ein" - mir erscheint alles richtig. Trotzdem kommen immer noch die oben vorgestellten Fehlermeldungen.

Weiß bitte jemand wo vielleicht doch der Fehler stecken kann ?

damfino
21.02.2016, 12:37
Lösche mal den Tippfehler mit "u8" raus, wahrscheinlich kommt der Compiler über diese Stelle gar nicht drüber.