Forum: Compiler & IDEs AVR-GCC 4.8.1: unrecognizable insn


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

nach einer Rechner-Neuinstallation hat mir Atmel-Studio den AVR-GCC 
4.8.1 untergeschoben, mit dem ein Altprojekt, das mit AVR-GCC 4.7.2 noch 
problemlos lief, mit dem Fehler "unrecognizable insn" den Build 
abbricht.

Zurückführen konnte ich alles auf die folgende Zeile (von deren Typ es 
mehrere gibt):
1
snprintf_P(glstr_Buf,N_TEXTBUF,menudata[item].menutext,\
2
          *menudata[item].puint8);

Nicht zum Fehler führt die folgende Abwandlung mit einem konstanten 
String im Flash:
1
snprintf_P(glstr_Buf,N_TEXTBUF,PSTR("u=%u"),\
2
        *menudata[item].puint8);

Das Struct "menudata" ist etwas komplizierter aufgebaut:
1
// Header
2
    #define constflash const __flash
3
4
  enum datatype_e {
5
        nothing,
6
    voidFcn,
7
    uint8,
8
    uint16,
9
    int8,
10
    int16
11
  };
12
13
14
__extension__ typedef struct {
15
      constflash char *menutext; 
16
      enum datatype_e datatype;   // Datentyp des Zeigers "pointer"
17
                           
18
        union {
19
            voidFcn_t pvoidFcn;     // Funktionszeiger
20
            uint8_t  *puint8;       // Zeiger auf Variablentypen
21
            uint16_t *puint16;
22
            int8_t   *pint8;
23
            int16_t  *pint16;
24
            void     *pvoid;
25
        };
26
      const int16_t varMin;       // Untere Grenze numerische Variable
27
      const int16_t varMax;       // Oberere Grenze numerische Variable
28
    } menudata_t;                   // Struct wird terminiert mit einer Zeile,
29
                                    // wo in .menutext ein Nulltext
30
                                    // ({'\0'}) steht.
31
32
// C-File
33
constflash char MT_SAVEANDRET[]    = "\033vspeichern\033f & \033vzurück\033f";
34
constflash char MT_Z_MAX_DEF[]     = "Z\033smax,norm    \033n : %3umm";
35
constflash char MT_VAR_LIFTTIM[]   = "t\033slift        \033n : %3us";
36
constflash char MT_VAR_LIFTHEI[]   = "Z\033slift        \033n : %3imm";
37
38
39
40
41
    
42
43
constflash menudata_t calibmenu[] = {
44
  {MT_SAVEANDRET   ,voidFcn,{.pvoid = NULL},0,0}, // Rueckgabewert interessant
45
  {MT_ABORT        ,voidFcn,{.pvoid = NULL},0,0}, // Rueckgabewert interessant
46
  {MT_Z_MAX_DEF    ,uint8  ,{.puint8=&gls_setting.z_max_default},Z_MAX_DEFAULT_MIN ,Z_MAX_DEFAULT_MAX },
47
  {MT_VAR_LIFTTIM  ,uint8  ,{.puint8=&gls_setting.lift_time}    ,LIFT_TIME_MIN     ,LIFT_TIME_MAX     },
48
  {MT_VAR_LIFTHEI  ,int8   ,{.pint8= &gls_setting.lift_height}  ,LIFT_HEIGHT_MIN   ,LIFT_HEIGHT_MAX   },
49
}
Ich bekomme es also bei einem Zeiger im Flash auf einen String im Flash 
mit einem internen Kompilerfehler zu tun.

Ich habe das Ganze noch nicht mit neueren AVR-GCC-Versionen ausprobiert, 
ob der Fehler schon gefixed ist.

Da die Version 4.8.1 mit dem Atmel Studio 6 SP2 ausgeliefert wird, 
dürfte sie weit verbreitet sein. Deswegen suche ich erst einmal einen 
Workaround für diese Compilerversion.


Viele Grüße
W.T.

: Verschoben durch User
von Walter T. (nicolas)


Lesenswert?

OK, ich habe meinen Workaround gefunden. strncpy_P scheint von diesem 
Compilerfehler nicht betroffen zu sein und mit dem Zwischenschritt, die 
Zeichenkette erst ins SRAM zu kopieren kann ich vorerst leben, da ich 
ohnehin einen Puffer für Zeichenketten vorhalten muß.

: Bearbeitet durch User
von hp-freund (Gast)


Lesenswert?

Vielleicht hilft auch ein:
-fno-optimize-sibling-calls

von Walter T. (nicolas)


Lesenswert?

Hmmm.... ist eigentlich folgendes erlaubt:
1
// Header
2
#define N_BUF 100
3
char buffer[100];
4
5
// Funktion
6
strncpy(buffer,"u=%u",N_BUF);
7
snprintf(buffer,N_BUF,buffer,10U);

und wenn nein: Wo finde ich die Einschränkung?

Viele Grüße
W.T.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

hp-freund schrieb:
> Vielleicht hilft auch ein:
> -fno-optimize-sibling-calls

Ich habe es gerade einmal ausprobiert: Das bewirkt keinen Unterschied in 
Bezug auf den Compilerfehler.

von Klaus W. (mfgkw)


Lesenswert?

Walter T. schrieb:
> und wenn nein: Wo finde ich die Einschränkung?

In deinem Oberstübchen.

snprintf() wird den Formatstring lesen (bis zu einer abschließenden 0) 
und den Zielpuffer dabei überschreiben.
Daß snprintf() dazu einen temporären Zwischenspeicher nimmt, kann man 
nicht erwarten, weil ja im Voraus nicht klar ist, wie groß der sein 
müsste.

Davon auszugehen, daß das funktioniert, ist etwas gleichbedeutend mit 
"ja, ich will bis zum Ende meines Lebens der hier anwesenden..."

von Walter T. (nicolas)


Lesenswert?

@Mod: Danke für's verschieben, hatte beim Erstellen vergessen, das 
richtig zu setzen.


Klaus W. schrieb:
> In deinem Oberstübchen.
>
> snprintf() wird den Formatstring lesen (bis zu einer abschließenden 0)
> und den Zielpuffer dabei überschreiben.

Von der gleichen Funktionsweise gehe ich auch aus. Aber:

1. mein Oberstübchen sagt mir, daß Einschränkungen einer Funktion der 
Standard-Library irgendwo explizit niedergeschrieben sein sollten 
anstelle daß sich der Nutzer Gedanken über die interne Funktionsweise 
machen sollte,

2. manche Implementierungen der vsprintf benötigen explizit malloc und

3. ich habe es gerade ausprobiert und es funktioniert (zumindest 
oberflächlich)

Vielleicht ist für die Diskussion über sprintf ein eigener Thread 
sinnvoll.

Falls der oben beschriebene AVR-GCC-Bug als bekannt anzunehmen ist, ist 
das Threadthema, für mich allerdings erst einmal erledigt - ansonsten 
würde ich mich noch hinsetzen für ein Minimalbeispiel.

: Bearbeitet durch User
von tictactoe (Gast)


Lesenswert?

Walter T. schrieb:
> 1. mein Oberstübchen sagt mir, daß Einschränkungen einer Funktion der
> Standard-Library irgendwo explizit niedergeschrieben sein sollten
> anstelle daß sich der Nutzer Gedanken über die interne Funktionsweise
> machen sollte,

Im Papier N1539 (einem Draft von C11) steht:

7.21.6.5 The snprintf function
Synopsis
#include <stdio.h>
int snprintf(char * restrict s, size_t n,
   const char * restrict format, ...);

Beachte das 'restrict': es bedeutet, dass die Funktion davon ausgehen 
kann, dass alle so in der Parameterliste gekennzeichneten Pointer auf 
nicht-überlappende Speicher zeigen.

> 3. ich habe es gerade ausprobiert und es funktioniert (zumindest
> oberflächlich)

Wenn du hinter dem %u noch was anderes dranhängst, würde ich einen Crash 
erwarten.

von Klaus W. (mfgkw)


Lesenswert?

Walter T. schrieb:
> 3. ich habe es gerade ausprobiert und es funktioniert (zumindest
> oberflächlich)

bei mir klappt es schon mal nicht (wenn ich anschließend den den Puffer 
ausgeben, kommt nichts).
Wesentlich wahrscheinlicher geht es auch bei dir schief, wenn du nicht 
%u gnädigerweise mit nur 2 Zeichen aus der 10 überschreibst, sondern mit 
einer Zahl, die mehr Stellen braucht.

Daß etwas in einem Fall auf einem System funktioniert, ist kein starkes 
Argument :-)

von Klaus W. (mfgkw)


Lesenswert?

Wobei das auch mal eine interessante Technik wäre: während eines 
sprintf() %-Direktiven auszugeben, die dann im weiteren Verlauf wieder 
interpretiert werden.
Damit kann man bestimmt schöne Sachen bauen (wenn auch nur bedingt 
portabel). Wenn auch eher als abschreckendes Beispiel...

von Karl H. (kbuchegg)


Lesenswert?

Klaus W. schrieb:
> Wobei das auch mal eine interessante Technik wäre: während eines
> sprintf() %-Direktiven auszugeben, die dann im weiteren Verlauf wieder
> interpretiert werden.

Der OCCC wartet :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

tictactoe schrieb:
> Beachte das 'restrict': es bedeutet, dass die Funktion davon ausgehen
> kann, dass alle so in der Parameterliste gekennzeichneten Pointer auf
> nicht-überlappende Speicher zeigen.

Es steht auch noch explizit drin:
1
If copying takes place between objects
2
that overlap, the behavior is undefined.

von Walter T. (nicolas)


Lesenswert?

tictactoe schrieb:
> Im Papier N1539 (einem Draft von C11) steht:

Jörg W. schrieb:
> Es steht auch noch explizit drin:
> If copying takes place between objects
> that overlap, the behavior is undefined.

OK, damit gehört der N1570 zukünftig zu meinen Standardquellen.

Danke!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Walter T. schrieb:
> mit dem Fehler "unrecognizable insn"

Und wie lautet nun die Fehlermeldung?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Falls der oben beschriebene AVR-GCC-Bug als bekannt anzunehmen ist,

Da sowohl Testfall als auch Optionen und Fehlermeldung geheim sind:

Vielleicht ja.  Vielleicht nein.

von Walter T. (nicolas)


Lesenswert?

Johann L. schrieb:
> Da sowohl Testfall als auch Optionen und Fehlermeldung geheim sind

Weder der Testfall noch die Fehlermeldung sind geheim. Das Projekt ist 
lediglich mal wieder ein Weilchen liegengeblieben.

Im Wesentlichen sieht der Testfall so aus:
1
/* aus *.h-Datei: */
2
  enum datatype_e {
3
        nothing,
4
    voidFcn,
5
    uint8,
6
    uint16,
7
    int8,
8
    int16
9
  };
10
11
12
    __extension__ typedef struct {
13
      constflash char *menutext; // Menueeintrag/Funktionsname
14
      enum datatype_e datatype;   // Datentyp des Zeigers "pointer"
15
                                  // Bei function pointer wird die Funktion
16
                    // gestartet, bei Zeigern auf normale Daten
17
                    // der Datentyp im Menue bearbeitet.
18
        union {
19
            voidFcn_t pvoidFcn;     // Funktionszeiger
20
            uint8_t  *puint8;       // Zeiger auf Variablentypen
21
            uint16_t *puint16;
22
            int8_t   *pint8;
23
            int16_t  *pint16;
24
            void     *pvoid;
25
        };
26
      const int16_t varMin;       // Untere Grenze numerische Variable
27
      const int16_t varMax;       // Oberere Grenze numerische Variable
28
    } menudata_t;                   // Struct wird terminiert mit einer Zeile,
29
                                    // wo in .menutext ein Nulltext
30
                                    // ({'\0'}) steht.
31
32
33
/* aus *.c-Datei: */
34
35
36
/* Sichtbare Menuetexte darstellen (inkl. Hervorhebung des aktuellen Texts)   */
37
/*   firstItem: Anfang des darstellten Bereichs (Index)
38
 *   actItem:   Hervorgehobenes Element (Index)
39
 *   height:    Hoehe des Dargestellten Bereichs in Zeilen; von unterer 
40
 *              Displaykante
41
 */
42
#if (__GNUC__ == 4 && __GNUC_MINOR__ == 8 && __GNUC_PATCHLEVEL__ == 1)
43
  /* WORKAROUND:
44
     Unter AVR-GCC 4.8.1 sorgt die direkte Verwendung von
45
       "menudata[item].menutext" mit "snprintf_P" fuer einen Compilerfehler 
46
       ("unrecognizable insn"). Konkret lautete die Zeile:
47
  
48
       snprintf_P(glstr_Buf,N_TEXTBUF,menudata[item].menutext,*menudata[item].puint8);
49
   
50
       Als Workaraound wird der String zuerst ins SRAM kopiert und anschliessend 
51
       die snprintf-Funktion genutzt. */
52
     #warning "GCC 4.8.1 needs workaround for flash strings"
53
     //#define WORKAROUND_STRING
54
#endif
55
56
57
void 
58
draw_menutext(constflash menudata_t menudata[],\
59
    uint8_t firstItem,uint8_t selectedItem,uint8_t nItem, uint8_t nHeadline) 
60
{
61
    uint_fast8_t i, item;
62
  #ifdef WORKAROUND_STRING
63
    char tempstr[N_TEXTBUF];  
64
  #endif
65
  
66
    item = firstItem;
67
    for (i = 0; i<nItem ; i++) {
68
      uint16_t pos;
69
70
      pos = ( (uint16_t) i+nHeadline);
71
      pos *= LINEWIDTH;
72
      pos += 9U;
73
74
        glcd_setpos(pos);
75
    
76
      switch(menudata[item].datatype) {
77
      case nothing:
78
        // Falltrough
79
80
      case voidFcn:
81
        // Menutexte fuer Funktionen werden einfach dargestellt
82
        strncpy_P(glstr_Buf,menudata[item].menutext,N_TEXTBUF);
83
        glstr_Buf[N_TEXTBUF-1] = '\0';
84
        break;
85
86
      case uint8:
87
        // Texte fuer Einstellkonstanten werden mit printf
88
        // interpretiert
89
        #ifdef WORKAROUND_STRING
90
          strncpy_P(tempstr,menudata[item].menutext,N_TEXTBUF);
91
          tempstr[N_TEXTBUF-1] = '\0';
92
          snprintf(glstr_Buf,N_TEXTBUF,tempstr,*menudata[item].puint8);
93
        #else
94
          snprintf_P(glstr_Buf,N_TEXTBUF,menudata[item].menutext,\
95
          *menudata[item].puint8);
96
        #endif
97
        break;
98
99
      case uint16:
100
        // Texte fuer Einstellkonstanten werden mit printf
101
        // interpretiert      
102
        #ifdef WORKAROUND_STRING
103
          strncpy_P(tempstr,menudata[item].menutext,N_TEXTBUF);
104
          tempstr[N_TEXTBUF-1] = '\0';
105
          snprintf(glstr_Buf,N_TEXTBUF,tempstr,*menudata[item].puint16);
106
        #else
107
          snprintf_P(glstr_Buf,N_TEXTBUF,menudata[item].menutext,\
108
          *menudata[item].puint16);
109
        #endif      
110
        break;
111
112
      case int8:
113
        // Texte fuer Einstellkonstanten werden mit printf
114
        // interpretiert
115
        #ifdef WORKAROUND_STRING
116
          strncpy_P(tempstr,menudata[item].menutext,N_TEXTBUF);
117
          tempstr[N_TEXTBUF-1] = '\0';
118
          snprintf(glstr_Buf,N_TEXTBUF,tempstr,*menudata[item].pint8);
119
        #else              
120
          snprintf_P(glstr_Buf,N_TEXTBUF,menudata[item].menutext,\
121
            *menudata[item].pint8);
122
        #endif
123
        break;
124
125
      case int16:
126
        // Texte fuer Einstellkonstanten werden mit printf
127
        // interpretiert
128
        #ifdef WORKAROUND_STRING
129
          strncpy_P(tempstr,menudata[item].menutext,N_TEXTBUF);
130
          tempstr[N_TEXTBUF-1] = '\0';
131
          snprintf(glstr_Buf,N_TEXTBUF,tempstr,*menudata[item].puint16);
132
        #else      
133
          snprintf_P(glstr_Buf,N_TEXTBUF,menudata[item].menutext,\
134
            *menudata[item].pint16);
135
        #endif
136
        break;
137
    }
138
139
           
140
        // Normale und hervorgehobene Menuepunkte
141
        if (selectedItem == item) glcd_putstr_P(PSTR("\033i")); // Hervorgehoben
142
        glcd_putstr(glstr_Buf);
143
        if (selectedItem == item) glcd_putstr_P(PSTR("\033n")); // Hervorhebung
144
                                                          // zuende
145
    
146
        item++;
147
    }
148
}
Das Ganze ist eher unübersichtlich und weit entfernt von einem 
Minimalbeispiel - falls das hilfreich ist, kann ich das aber noch 
nachliefern.

Mit den folgenden Build-Optionen:
 avr-gcc.exe"  -x c -funsigned-char -funsigned-bitfields 
-DF_CPU=7372800UL  -Os -ffunction-sections -fdata-sections -fpack-struct 
-fshort-enums -Wall -Wextra -Wundef -pedantic -mmcu=atmega32 -c 
-gdwarf-2 -std=gnu99 -fwrapv -H -Wsign-conversion -v -MD -MP -MF 
"common/src_menu/menu.d" -MT"common/src_menu/menu.d" 
-MT"common/src_menu/menu.o"   -o "common/src_menu/menu.o" 
"../common/src_menu/menu.c"
    Using built-in specs.

sieht die Konsolen-Ausgabe wie folgt aus:
1
C:\Users\Nicolas\Desktop\SVN\2015_Rotorsteuerung\Firmware_AVR\Pulsgenerator04\common\src_menu\menu.c(177,6): warning: #warning is a GCC extension [enabled by default]
2
         #warning "GCC 4.8.1 needs workaround for flash strings"
3
          ^
4
C:\Users\Nicolas\Desktop\SVN\2015_Rotorsteuerung\Firmware_AVR\Pulsgenerator04\common\src_menu\menu.c(177,6): warning: #warning "GCC 4.8.1 needs workaround for flash strings" [-Wcpp]
5
    ../common/src_menu/menu.c: In function 'draw_menutext':
6
C:\Users\Nicolas\Desktop\SVN\2015_Rotorsteuerung\Firmware_AVR\Pulsgenerator04\common\src_menu\menu.c(273,1): error: unrecognizable insn:
7
     }
8
     ^
9
    (insn 71 70 72 11 (set (reg:QI 99)
10
            (subreg:QI (mem/f:HI (reg/f:HI 47 [ D.2725 ]) [3 _20->menutext+0 S2 A8 AS1]) 1)) ../common/src_menu/menu.c:219 -1
11
         (nil))
12
C:\Users\Nicolas\Desktop\SVN\2015_Rotorsteuerung\Firmware_AVR\Pulsgenerator04\common\src_menu\menu.c(273,1): error: in extract_insn, at recog.c:2150
13
    Please submit a full bug report,
14
    with preprocessed source if appropriate.


Leider gibt es also keine wirklich sinnvolle genauere Fehlermeldung.

Viele Grüße
W.T.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Vermutlich

https://gcc.gnu.org/PR61443

...aber nur geraten, weil das Beispiel sich nicht compilieren lässt.  Du 
hast wohl nie versucht, den angeblichen Testfall zu übersetzen :-/

von Karl H. (kbuchegg)


Lesenswert?

Walter T. schrieb:

> Das Ganze ist eher unübersichtlich und weit entfernt von einem
> Minimalbeispiel - falls das hilfreich ist, kann ich das aber noch
> nachliefern.

Ein Minimalbeispiel ist immer hilfreich.
Die wenigsten Fehler sind so, dass man sie nur durch hinsehen sofort 
weiß, was Sache ist.

Dir ist schon aufgefallen, dass in der geposteten Funktion die 
Block-Klammerung nicht stimmt? Da ist eine } zu viel.

Ob das was damit zu tun hat?
Keine Ahnung. Vielleicht ist das ja auch nicht der komplette 
Original-Code.

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich habe mal ein "nicht-ganz-Minimalbeispiel" gemacht. In Atmel-Studio 
6.2 sollte es direkt build-bar sein und mit dem ein- und auskommentieren 
der Zeile 61 in main.c ist der Fehler erzeugbar.

Ich habe kein noch kleineres Minimalbeispiel erstellt, weil ich sonst 
befürchten muß, daß

a) ich aus dem ursprünglichen Fehler in einen ganz anderen laufe 
(Flüchtigkeitsfehler bei der Minimierung) und

b) ansonsten die unweigerliche Frage kommt (nicht unbedingt von 
bisherigen Thread-Teilnehmern), warum ich solche Konstruktionen mit 
struct arrays im Flash mit Zeigern auf char arrays im Flash überhaupt 
nutzen will

c) ich immer noch nicht 100% ausschließen kann, daß bei mir noch ein 
Programmierfehler liegt.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Walter T. schrieb:

> c) ich immer noch nicht 100% ausschließen kann, daß bei mir noch ein
> Programmierfehler liegt.

Da kann ich dich beruhigen.
Wenn der Compiler abkratzt, dann ist das ein Fehler im Compiler.

Egal was du schreibst, und sei es der größte Unsinn, der Compiler darf 
nicht abschmieren.

von Walter T. (nicolas)


Lesenswert?

Hallo Karl-Heinz,
wenn wir ehrlich sind, kratzt der Compiler nicht ab, sondern stellt 
seine Tätigkeit mit einer mehr oder weniger definierten Fehlermeldung 
ein. Nicht auf optimale Weise, aber immerhin muß das Betriebssystem 
nicht hinterher die Scherben wegkehren.

Kann bitte einer der C-Experten prüfen, ob er das aufgrund eigentlich 
korrekten Codes macht (womit es ein echter Compilerfehler ist) oder nur 
die anderen Compilerversionen so großzügig sind, das erwartete Verhalten 
bei ungültigem Code zu liefern (womit es nur ein ungünstiges 
Compilerverhalten, aber kein Fehler ist).

Ich habe mir die Sachen jetzt leider schon so oft angesehen, daß ich 
einen Fehler noch nicht einmal mehr dann sehen würde, wenn er rot 
blinkte.

Viele Grüße
W.T.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Eine unrecognizable INSN ist immer ein „echter Compilerfehler“.

Johann hatte ja weiter oben bereits eine Vermutung geäußert, um welchen
Bug es sich handelt.  Ich würde diese Vermutung bestätigen: wenn du in
der Funktion, bei der der Fehler auftritt, den Aufruf nach snprintf
auskommentierst, dann compiliert er durch.

von Walter T. (nicolas)


Lesenswert?

Jörg W. schrieb:
> Johann hatte ja weiter oben bereits eine Vermutung geäußert, um welchen
> Bug es sich handelt.  Ich würde diese Vermutung bestätigen

OK, wenn ihr beiden sagt, daß es ein bekannter Bug ist, dann gehe ich 
mal davon aus, das das stimmt. Das spart mir auch den Gegentest mit dem 
AVR-GCC 4.9.1 oder 4.8.4, falls am Wochenende das Wetter schlecht genug 
ist.

Für mich ist die Sache damit erledigt  - es sei denn, einem geneigten 
Mitleser fällt noch ein besserer Workaround als das Kopieren des 
gesamten Strings ein.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Walter T. schrieb:
> es sei denn, einem geneigten Mitleser fällt noch ein besserer Workaround
> als das Kopieren des gesamten Strings ein.

Benutzung von GCC 4.8.4 oder 4.9.1, für beide nennt der Bugreport die
Sache als erledigt.  Johann hat den Fix auf beide Branches zurück
portiert.

von Walter T. (nicolas)


Lesenswert?

Jörg W. schrieb:
> Benutzung von GCC 4.8.4 oder 4.9.1

Du beschreibst hier eine sinnvolle Lösung, keinen Workaround :-)

Solange die Atmel-Toolchain noch auf den AVG-GCC 4.8.1 setzt, werde ich 
aber wohl oder übel noch diese Version unterstützen müssen.

Wobei der Grund dazu aber schon Off-Topic ist: Ich bin der Meinung, wenn 
ich meine Projekte (als abschreckendes Beispiel) Open Source mache, 
sollte ich nicht auf irgendwelche aufwendig installierbare 
Build-Umgebungen setzen. Und die Atmel-Toolchain ist noch auf AVR-GCC 
4.8.1, WinAVR auf 4.3.3.

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
Noch kein Account? Hier anmelden.