Forum: Compiler & IDEs avrgcc abi: ramp register


von avr (Gast)


Lesenswert?

Hi

Wenn ich Assemblerfunktionen aus C heraus aufrufe, welche die 
Ramp-Register verändern, muss ich diese dann wiederherstellen? Seit 4.7 
unterstützt der avrgcc das memx Attribute wodurch er dann zumindest 
teilweise die Ramp Register verwalten muss. Geht er davon aus, dass sie 
geändert worden sind oder dass sie wiederhergestellt werden?

von Peter D. (peda)


Lesenswert?

"Call-Used Registers

The call-used or call-clobbered general purpose registers (GPRs) are 
registers that might be destroyed (clobbered) by a function call.

R18–R27, R30, R31
    These GPRs are call clobbered. An ordinary function may use them 
without restoring the contents. Interrupt service routines (ISRs) must 
save and restore each register they use.
R0, T-Flag
    The temporary register and the T-flag in SREG are also 
call-clobbered, but this knowledge is not exposed explicitly to the 
compiler (R0 is a fixed register)."

Alle anderen Register müssen gesichert werden.

von avr (Gast)


Lesenswert?

Danke für die schnelle Antwort.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

avr schrieb:
> teilweise die Ramp Register verwalten muss. Geht er davon aus, dass sie
> geändert worden sind oder dass sie wiederhergestellt werden?

Dabei geht es nur um das RAMPZ Register, ds evtl. zusammen mit LPM 
verwendet wird.

1) Wenn RAMZ nur fur den Flash-Zugriff verwendet wird, ist der Wert 
egal, d.h. muß weder in einer ISR noch in einer normalen Funktion 
gesichert werden. Jedes mal, wenn ein LPM Zugriff ansteht, setzt avr-gcc 
RAMPZ wie er es brauch. Beispiel ist ein ATmega128.

2) Wenn RAMPZ auch für den RAM-Zugriff verwendet wird (z.B. ATXmega mit 
RAM > 64 KiB), dann muß RAMPZ nach der Verwendung auf 0 gesetzt werden, 
denn RAMPZ wird auch in LD[D] und ST[D] Z verwendet, und davor wird 
RAMPZ eben nicht gesetzt.  Allerdings wird RAMPZ in ISRs gesichert / 
restauriert wenn es möglicherweise verwendet wurde, d.g. wenn Z 
verwendet wurde.

__memx ist übrigens mehr als ein Attribut, nämlich ein Qualifier und 
kann damit auch Teil von Adresszielen sein wie

 const __memx char *p;

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Siehe auch "3.17.4.2 Handling of the RAMPD, RAMPX, RAMPY and RAMPZ 
Special Function Registers" im GCC Manual:

http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/AVR-Options.html#index-g_t_0040code_007bRAMPD_007d-1162

von avr (Gast)


Lesenswert?

Johann L. schrieb:
> 
http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/AVR-Options.html#index-g_t_0040code_007bRAMPD_007d-1162

Danke, sowas habe ich gesucht. Irgendwie habe ich öfters Probleme den 
richtigen Teil der Dokumentation zu suchen.

> RAM larger than 64 KiB is not supported by GCC for AVR targets.
Über __memx geht es doch?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

avr schrieb:
> Johann L. schrieb:
>> RAM larger than 64 KiB is not supported by GCC for AVR targets.
> Über __memx geht es doch?

Nein, das ist nur Flash oder normales RAM, also solches, das keine RAMP* 
braucht.

Um RAMP* gescheit zu unterstützen, dafür ist dieses Feature zu abartig 
-- oder GCC, wie man's nimmt.

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.