Forum: Compiler & IDEs Problem mit avr-gcc und Optimierung


von Raul (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

die Funktionen in der angehängte Datei werden vom Hauptprogramm 
aufgerufen (erst Init, und dann die anderen zyklisch).
Compiliere ich das ganze mit -O2 landen beim Aufruf von BmpInit() max 9 
Bit in den einzelnen Feldern von _C[].
Verwende ich dagegen eine andere Optimierungsstufe, schreibe:
1
volatile uint16_t _C[MS561101BA_PROM_REG_COUNT];
 oder greife innerhalb der Funktion auf _C[] zu, wie zB im 
auskommentierten Teil, funktioniert alles wie es soll.

Ich compiliere mit
1
avr-gcc -c -mmcu=atmega644p -I. -gstabs   -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums  -Wall -Wstrict-prototypes -Wa,-adhlns=ms5611.lst  -std=gnu99 -DF_OSC=3686400  -MD -MP -MF .dep/ms5611.o.d ms5611.c -o ms5611.o

Auszug aus ms5611.lst:
1
32:ms5611.c      ****     i2c_start(MS561101BA + I2C_READ);
2
 162                    .LM10:
3
 163 004e 8DEE                  ldi r24,lo8(-19)
4
 164 0050 0E94 0000             call i2c_start
5
  33:ms5611.c      ****     _C[i] = i2c_readAck();
6
 166                    .LM11:
7
 167 0054 0E94 0000             call i2c_readAck
8
  34:ms5611.c      ****     _C[i] <<= 8;
9
 169                    .LM12:
10
 170 0058 E0E0                  ldi r30,lo8(0)
11
 171 005a EF01                  movw r28,r30
12
 172 005c F801                  movw r30,r16
13
 173 005e D183                  std Z+1,r29
14
 174 0060 C083                  st Z,r28
15
  35:ms5611.c      ****     _C[i] |= i2c_readNak();
16
176                    .LM13:
17
 177 0062 0E94 0000             call i2c_readNak
18
 178 0066 282F                  mov r18,r24
19
 179 0068 30E0                  ldi r19,lo8(0)
20
 180 006a 2C2B                  or r18,r28
21
 181 006c 3D2B                  or r19,r29
22
 182 006e F801                  movw r30,r16
23
 183 0070 2193                  st Z+,r18
24
 184 0072 3193                  st Z+,r19
25
 185 0074 8F01                  movw r16,r30
26
  36:ms5611.c      ****     i2c_stop();

Ich kann zwar so gut wie kein Assembler, aber müsste nicht r24 
ausgewertet werden?
1
~$ avr-gcc -v
2
Using built-in specs.
3
COLLECT_GCC=avr-gcc
4
COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/4.5.3/lto-wrapper
5
Target: avr
6
Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --disable-libssp --build=i686-linux-gnu --host=i686-linux-gnu --target=avr
7
Thread model: single
8
gcc version 4.5.3 (GCC)


Kann mir einer Helfen wo hier der Fehler steckt?

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


Angehängte Dateien:

Lesenswert?

Das liegt bestimmt daran, dass _C ein reservierter Bezeichner ist. ;-)

Im Ernst: Bezeichner, die mit einem Unterstrich, gefolgt von einem
Großbuchstaben oder mit zwei Unterstrichen beginnen, sind für Compiler
und Bibliothek reserviert.  Benutze solche Namen nicht in deinem
Programm, es sei, denn, die Dokumentation fordert dich ausdrücklich
dazu auf.

Ansonsten wäre natürlich compilierfähiger Quellcode schön gewesen.

Mein Bauchgefühl lässt mich vermuten, dass es sich um eine Inkarnation
von Bug PR46779 handelt:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46779

Abhilfe: den angehängten Patch benutzen oder eine neuere Compilerversion
benutzen (GCC 4.7.2 wurde gerade freigegeben).

von Raul (Gast)


Lesenswert?

danke für die schnelle Antwort. Es lag tatsächlich am gcc. Mit einer 
aktuellen Version funktioniert alles wie es soll.


Jörg Wunsch schrieb:
> Das liegt bestimmt daran, dass _C ein reservierter Bezeichner ist. ;-)
>
> Im Ernst: Bezeichner, die mit einem Unterstrich, gefolgt von einem
> Großbuchstaben oder mit zwei Unterstrichen beginnen, sind für Compiler
> und Bibliothek reserviert.  Benutze solche Namen nicht in deinem
> Programm, es sei, denn, die Dokumentation fordert dich ausdrücklich
> dazu auf.

danke für den Hinweis, das wusste ich nicht oder nicht mehr :-)

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


Lesenswert?

Raul schrieb:
> Mit einer
> aktuellen Version funktioniert alles wie es soll.

Dann wird's wohl wirklich Bug 46779 gewesen sein.

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.