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?
"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.
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;
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.