Fehler wegen Optimierungsniveaus

OP #1762364
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
Persönliche Seite #1762925
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");
Persönliche Seite #1763571
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren