avrgcc abi: ramp register

Gast #3610183
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?
#3610192
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.
Persönliche Seite #3610410
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;

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