mikrocontroller.net

Forum: Compiler & IDEs Fehler wegen Optimierungsniveaus


Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

ich habe eine Fehlermeldung

C:/WinAVR/avr/include/avr/eeprom.h:233: error: can't find a register in 
class `BASE_POINTER_REGS' while reloading `asm'

bekommen wenn das Optimierungsniveau im AVR Studio auf "-Os" gesetzt 
wird. Der betroffene Code sieht wie folgt aus:
asm volatile ( 
            ".%=_start:" CR_TAB
            "sbiw %2,1" CR_TAB
            "brlt .%=_finished" CR_TAB
             XCALL " __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB
            "st z+,__tmp_reg__" CR_TAB
            "rjmp .%=_start" CR_TAB
            ".%=_finished:" 
          : "=x" (pointer_eeprom),
            "=z" (pointer_ram),
            "+w" (size)
           : "x" (pointer_eeprom), 
             "z" (pointer_ram)
           : "memory");

Was soll ich jetzt machen?

MfG
Senmeis

: Verschoben durch Admin
Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt's ein übersetzbares d.h. compilerbares Beispiel? Muss nicht 
linkfähig sein zum Testen.

In Zeile 233 der eeprom.h steht lediglich ein normales Define.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Offenbar verwendest du eine nicht sonderlich aktuelle Version von WinAVR 
bzw. avr-libc. Wäre nett, darauf hinzuweisen...

Das Problem ist, daß das asm-Schnippel in einer Inline-Funktion steht 
und der Fehler ohne Kontext nicht reproduzierbar ist.

Vermutlich tritt er nur zusammen mit hoher Registerlast auf, da der 
Schnippel viele obere Register verwendet.

Du kannst versuchen die Registerlast auf die obereg GPRs etwas zu 
reduzieren, indem du folgendes inline Asm verwendest:
      asm volatile (
            ".%=_start:" CR_TAB
            "subi %A2,1" CR_TAB
            "sbci %B2,0" CR_TAB
            "brlt .%=_finished" CR_TAB
            "%~call __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB
            "st z+,__tmp_reg__" CR_TAB
            "rjmp .%=_start" CR_TAB
            ".%=_finished:"
          : "+x" (pointer_eeprom),
            "+z" (pointer_ram),
            "+d" (size)
           :: "memory");

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank.

Ich habe diesen Assembler Code entsprechend verändert. Nun lässt der 
Code kompilieren, aber der Arbeitsspeicher (RAM) wird nicht damit 
gespart. Bei mir beträgt dies immer 93,2%. Wieviel kann das eingespart 
werden in normalen Fällen?

MfG
Senmeis

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das RAM voll ist, dann wirft man einen Blick in das Mapfile um 
rauszufinden, womit es belegt ist.

> Wieviel kann das eingespart werden in normalen Fällen?

Zwischen 0 und 77,48%, je nach Einzelfall.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Owen Senmeis schrieb:

> Ich habe diesen Assembler Code entsprechend verändert. Nun lässt der
> Code kompilieren, aber der Arbeitsspeicher (RAM) wird nicht damit
> gespart. Bei mir beträgt dies immer 93,2%. Wieviel kann das eingespart
> werden in normalen Fällen?

Es gibt keine "normalen" Fälle. Es gibt einzig und allein konkrete 
Fälle.

Wie bitte soll man Einsparpotential beurteilen, ohne irgendwas über 
die Quelle, die verwendete Toolchain-Version oder die Build-Optionen zu 
wissen???

Der Code ober behebt ein Compilerproblem bei hoher Registerlast, es ist 
keine Optimierung. Das gleiche Problem ist übrigens bei 
eeprom_write_block zu erwarten.

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.