www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Komisches Verhalten des Optimierers


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe mir ein Board mit einem Cortex M3 gebaut, auch externes 
RAM angeschlossen.

Jetzt habe ich zwei Funktionen geschrieben, welche den Speicher 
beschreiben und auslesen.
In der Hauptschleife rufe ich diese nun auf.
i = 0;

  /* Infinite loop */
  while (1)
  {
    ExtRam_SetByte(i, 0x13);
    check = ExtRam_GetByte(i);
    
    i++;
  
    if(i >= 0x80000)
      i = 0x00000;

  }
}

Der Optimierer macht allerdings voll den Kack daraus, hier mal ein 
Assemblerlisting:
/* Infinite loop */
  while (1)
  {
    ExtRam_SetByte(i, 0x13);
     2113       movs r1, #0x13
     2000       movs r0, #0x00
     F7FFFFB2   bl 0x08000684 <ExtRam_SetByte>
    check = ExtRam_GetByte(i);
     2000       movs r0, #0x00
     F7FFFF87   bl 0x08000634 <ExtRam_GetByte>
    ExtRam_SetByte(i, 0x13);
     2113       movs r1, #0x13
     2001       movs r0, #0x01
     F7FFFFAB   bl 0x08000684 <ExtRam_SetByte>
    check = ExtRam_GetByte(i);
     2001       movs r0, #0x01
     F7FFFF80   bl 0x08000634 <ExtRam_GetByte>
    ExtRam_SetByte(i, 0x13);
     2002       movs r0, #0x02
     2113       movs r1, #0x13
     F7FFFFA4   bl 0x08000684 <ExtRam_SetByte>
    check = ExtRam_GetByte(i);
     2002       movs r0, #0x02
     F7FFFF79   bl 0x08000634 <ExtRam_GetByte>
    
    i++;
     2303       movs r3, #0x03
     E00B       b 0x0800075E
    ExtRam_SetByte(i, 0x13);
     4620       mov r0, r4
     2113       movs r1, #0x13
     F7FFFF9B   bl 0x08000684 <ExtRam_SetByte>
    check = ExtRam_GetByte(i);
     4620       mov r0, r4
     F7FFFF70   bl 0x08000634 <ExtRam_GetByte>
    
    i++;
     1C63       adds r3, r4, #0x1
     2400       movs r4, #0x00
  
    if(i >= 0x80000)
     F5B32F00   cmp.w r3, #0x00080000
     D2F3       bcs 0x08000746
     461C       mov r4, r3
     E7F1       b 0x08000746

er ruft erst dreimal die Funktionen direkt auf und setzt dann 'i' auf 3. 
Irgenwie blöd, oda?

Ich arbeite mit Rowley Crossworks und die Optimierung ist auf Size 
gestellt.

Kann ich da was ändern?

Gruß, Martin

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin wrote:
>
> er ruft erst dreimal die Funktionen direkt auf und setzt dann 'i' auf 3.
> Irgenwie blöd, oda?

Zumindest korrekt... schon mal nicht unwichtig :o)

> Ich arbeite mit Rowley Crossworks und die Optimierung ist auf Size
> gestellt.

Rowley basiert wohl auf GCC? Ich hatte ähnlichen Ärger mit neuen gcc 
4.3.x für AVR: Schleifen wurden aufgerollt trotz -Os, -fno-unroll-loops 
et. al. blieben erfolglos. Sind wohl noch Zicken der neuesten GCC 
Versionen. Die Mainline ist hauptsächlich auf SPeed getrimmt, nicht auf 
Schlankheit.

> Kann ich da was ändern?
Ja. Du hast ja die Quellen :o)
Evtl. ist's für die Mainline (i386) nachvollziehbar daß aufgerollt wird 
trotz -Os. Dann ist die Wahrscheinlichkeit größer, daß das Problem bald 
gefixt wird. Hier wäre dann

   http://gcc.gnu.org/ml/gcc-help

die richtige Anlaufstelle. Das Anrollen der Schleife passiert 
wahrscheinlich im Target-unabhängigen Teil. Wo genau, siehst du mit 
Ausgaben per -fdump-tree-all. Falls der böse Pass verschaltert ist, kann 
angetestet werden, ob dessen Deaktivierung Abhilfe schafft.

Johann

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal.

Bin vorrübergehend auf IAR umgestiegen, hab da zwar nut 32k Code, aber 
das wird schon erstmal reichen.
Das tolle ist auch, dass bei Crossworks beim Speicherlesen und 
-schreiben Fehler kommen und bei IAR nicht. (kann auch mein Fehler sein, 
aber ist gleicher Code)

Gruß, Martin

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.