-         

Ergebnis 1 bis 6 von 6

Thema: AtmelStudio 7.0.634 - Probleme mit typedef

  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551

    AtmelStudio 7.0.634 - Probleme mit typedef

    Anzeige

    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 :
    Code:
    //            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.) :
    Code:
           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 :
    Code:
    // ============================================================================= =
    // ==   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.
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    1. Fehler:
    C erlaubt erst ab C99 die Variablen deklaration in der Initializer list.
    Header nicht inkludiert?

    2. Fehler:
    stdint.h nicht inkludiert.

    mfg

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo Geier,
    Zitat Zitat von oberallgeier Beitrag anzeigen
    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)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    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.
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    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:
    Code:
    -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
    Code:
    -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 ?
    Geändert von oberallgeier (20.02.2016 um 18:18 Uhr) Grund: Schreibfehler
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    500
    Lösche mal den Tippfehler mit "u8" raus, wahrscheinlich kommt der Compiler über diese Stelle gar nicht drüber.
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

Ähnliche Themen

  1. Atmega32u4 Timer 3 Probleme; PWM Probleme
    Von Mons im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 01.03.2014, 11:47
  2. Problem mit typedef struct
    Von flo1 im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 11.11.2009, 15:09
  3. Typedef-Problem (Expected Declaration Specifiers etc...)
    Von Jaecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 24.08.2008, 18:29
  4. Typedef
    Von Arexx-Henk im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 13.02.2006, 10:42
  5. Frage uber 'typedef enum'
    Von Arexx-Henk im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 01.03.2005, 11:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •