Forum: Compiler & IDEs [WinAVR 20080402rc1] Bug


von Andreas A. (Firma: Embedded Microtec) (andi) Flattr this


Lesenswert?

Hallo,

  hier im Forum sind ja auch immer wieder Leute unterwegs, die aktiv am 
(Win)AVR-GCC Projekt mitarbeiten... ich denke nämlich, dass es im 
aktuellen Release Candidate von WinAVR (WinAVR 20080402rc1) einen Bug 
gibt.

Und zwar passiert folgendes:
Wenn als Optimierungsflag 's' angegeben wird, ersetzt der Linker 
anscheinend die Adressen falsch. Im .lss File sind dann Funktionen 
teilweise durcheinander gewürfelt und die Sprungadressen stimmen nicht 
mehr.

Z.B.: Aus dem C Code
1
  while(PINA & _BV(PA0));

wird im .lss File
1
 11c:  00 99         sbic  0x00, 0  ; 0
2
 11e:  dd cf         rjmp  .-70       ; 0xda <main+0x4>

Deshalb wird mein Controller auch ständig resetiert. Wenn die 
Optimierung ausgeschaltet wird, passt alles!

mfg
Andreas

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


Lesenswert?

Erstens solltest du Probleme mit der Betaversion an Eric direkt
berichten bzw. als Bug beim sourceforge.net-Projekt von WinAVR
abkippen.

Zweitens kann man aus dem kurzen Fragment rein gar nichts ersehen.
Der Compiler kann völlig korrekt gearbeitet haben, aber es könnte
auch ein Bug sein.

von Andreas A. (Firma: Embedded Microtec) (andi) Flattr this


Lesenswert?

Na gut... dann wende ich mich direkt an Eric bzw. dem SF.net Projekt.

Und BTW. das Codefragment sollte lediglich darstellen, dass der Sprung 
nicht an die richtige Position geht. Der Sprung sollte auf Adresse 0x11c 
und nicht auf 0xda gehen.

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


Lesenswert?

Andreas Auer wrote:

> Und BTW. das Codefragment sollte lediglich darstellen, dass der Sprung
> nicht an die richtige Position geht. Der Sprung sollte auf Adresse 0x11c
> und nicht auf 0xda gehen.

Das ist keineswegs zwangsweise so.  Du hast einfach ein Stück
rausgerissen und irgend jemand (OK, avr-objdump) hat dir eine Zeile
Sourcecode daneben gemalt.  Welchen Zusammenhang die beiden wirklich
haben, kann man erst entscheiden, wenn man alles dazu sieht.

Also wie geschrieben: ich bin erstmal gar nicht davon überzeugt, dass
du überhaupt einen Bug hast, sondern der Optimizer hat den Code nur
anders sortiert, als das früher mal der Fall war.  Aber wenn du nicht
den gesamten (relevanten) Code dafür zeigen möchtest, kann ich dir
auch nicht helfen.

von Andreas A. (Firma: Embedded Microtec) (andi) Flattr this


Lesenswert?

Das ist mir schon klar, dass es möglich ist, dass der Optimizer den Code 
neu sortieren kann bzw. auch Funktionsaufrufe durch Inline Funktionen 
ersetzen kann. Für die oben angeführte einfache Schleife sollten aber 
dennoch die beiden Zeilen ausreichen und der Sprung richtig sein.

Aber zur Vollständigkeit hier noch der gesamte C Code meiner "main" und 
das .lss File dazu:
1
int main(void)
2
{
3
  unsigned char buffer[RECORD_BUFFER_SIZE];
4
  unsigned char key = 0;
5
  unsigned char last_key = 0;
6
  unsigned char state = STATE_IDLE;
7
8
  unsigned int address;
9
  unsigned int address_max;
10
  unsigned int buffer_count;
11
  unsigned int i;
12
13
  usartInit(12);
14
  usartPutLine("Siren Recorder");
15
  
16
  keyledInit();
17
  flashInit();
18
  mp3Init();
19
20
  while(PINA & _BV(PA0));
21
  usartPutLine("Normal");
22
  while(PINA & _BV(PA0));
23
  usartPutLine("Normal");
24
25
  while(1);
26
  return 0;
27
}
1
int main(void)
2
{
3
      d6:  8c e0         ldi  r24, 0x0C  ; 12
4
      d8:  90 e0         ldi  r25, 0x00  ; 0
5
      da:  0e 94 2c 06   call  0xc58  ; 0xc58 <usartInit>
6
  unsigned int address_max;
7
  unsigned int buffer_count;
8
  unsigned int i;
9
10
  usartInit(12);
11
  usartPutLine("Siren Recorder");
12
      de:  80 e0         ldi  r24, 0x00  ; 0
13
      e0:  91 e0         ldi  r25, 0x01  ; 1
14
      e2:  0e 94 55 06   call  0xcaa  ; 0xcaa <usartPutLine>
15
  
16
  keyledInit();
17
      e6:  0e 94 aa 05   call  0xb54  ; 0xb54 <keyledInit>
18
  flashInit();
19
      ea:  0e 94 83 05   call  0xb06  ; 0xb06 <flashInit>
20
  mp3Init();
21
      ee:  0e 94 1c 08   call  0x1038  ; 0x1038 <mp3Init>
22
23
  while(PINA & _BV(PA0));
24
      f2:  00 99         sbic  0x00, 0  ; 0
25
      f4:  f2 cf         rjmp  .-28       ; 0xda <main+0x4>
26
  usartPutLine("Normal");
27
      f6:  8f e0         ldi  r24, 0x0F  ; 15
28
      f8:  91 e0         ldi  r25, 0x01  ; 1
29
      fa:  0e 94 55 06   call  0xcaa  ; 0xcaa <usartPutLine>
30
  while(PINA & _BV(PA0));
31
      fe:  00 99         sbic  0x00, 0  ; 0
32
     100:  ec cf         rjmp  .-40       ; 0xda <main+0x4>
33
  usartPutLine("Normal");
34
     102:  8f e0         ldi  r24, 0x0F  ; 15
35
     104:  91 e0         ldi  r25, 0x01  ; 1
36
     106:  0e 94 55 06   call  0xcaa  ; 0xcaa <usartPutLine>
37
     10a:  ff cf         rjmp  .-2        ; 0x10a <main+0x34>
38
  }
39
}

Und jetzt sag mir bitte nochmal dass die beiden Sprünge richtig sind! 
Das sind sie nämlich unter Garantie nicht (und das war auch der Grund 
warum mein Controller sich immer wieder resetiert hat).

mfg
Andreas

von Roland Schmidt (Gast)


Lesenswert?


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


Lesenswert?

Andreas Auer wrote:

> Und jetzt sag mir bitte nochmal dass die beiden Sprünge richtig sind!

In dem Zusammenhang ist es klar, dass sie es nicht sind.

Roland hat es ja gefunden.  Was auch immer da reingerutscht war...

von Andreas A. (Firma: Embedded Microtec) (andi) Flattr this


Lesenswert?

Jop... anscheinend wurde das schon entdeckt und behoben... wunderbar!

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.