[WinAVR 20080402rc1] Bug

OP (Firma: Embedded Microtec) #827586
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
OP (Firma: Embedded Microtec) #828483
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.
Moderator Persönliche Seite #828602
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.
OP (Firma: Embedded Microtec) #828885
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.