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?