Forum: Compiler & IDEs Fehler wegen Optimierungsniveaus


von Owen S. (senmeis)


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:
1
asm volatile ( 
2
            ".%=_start:" CR_TAB
3
            "sbiw %2,1" CR_TAB
4
            "brlt .%=_finished" CR_TAB
5
             XCALL " __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB
6
            "st z+,__tmp_reg__" CR_TAB
7
            "rjmp .%=_start" CR_TAB
8
            ".%=_finished:" 
9
          : "=x" (pointer_eeprom),
10
            "=z" (pointer_ram),
11
            "+w" (size)
12
           : "x" (pointer_eeprom), 
13
             "z" (pointer_ram)
14
           : "memory");

Was soll ich jetzt machen?

MfG
Senmeis

: Verschoben durch Admin
von Johann L. (gjlayde) Benutzerseite


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.

von Johann L. (gjlayde) Benutzerseite


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:
1
      asm volatile (
2
            ".%=_start:" CR_TAB
3
            "subi %A2,1" CR_TAB
4
            "sbci %B2,0" CR_TAB
5
            "brlt .%=_finished" CR_TAB
6
            "%~call __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB
7
            "st z+,__tmp_reg__" CR_TAB
8
            "rjmp .%=_start" CR_TAB
9
            ".%=_finished:"
10
          : "+x" (pointer_eeprom),
11
            "+z" (pointer_ram),
12
            "+d" (size)
13
           :: "memory");

von Owen S. (senmeis)


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

von (prx) A. K. (prx)


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.

von Johann L. (gjlayde) Benutzerseite


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.

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.