An sich ist GCC zuständig, darauf aufzupassen.
Hallo,
ich möchte in einer ISR unter berstimmten Bedingungen einen Pin ein/ausschalten. Der Code der ISR würde in Etwa so aussehen, wobei SetBit ein einfaches Makro ist:
Welche Register muss ich nun in der ISR sichern, oder erkennt das gar der GCC selbst und sichert nur das was notwendig ist? Ich mache mir die Gedanken deshalb, weil die ISR bis zu ~15.000 mal pro Sekunde aufgerufen werden kann.Code:if (ON) { if (EnableBit0) SetBit(PortX,0); if (EnableBit1) SetBit(PortX,1); if (EnableBit2) SetBit(PortX,2); ..... } else { if (EnableBit0) ClearBit(PortX,0); if (EnableBit1) ClearBit(PortX,1); if (EnableBit2) ClearBit(PortX,2); ..... }
An sich ist GCC zuständig, darauf aufzupassen.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Mit dem GCC kenne ich mich nicht aus, aber wenn sicher gestellt ist das deine
ISR und die Programme in derselben, keine Register überschreiben die noch
gebraucht werden kann man das übergehen.
Gruß Richard
GCC sichert die von ihm benutzten Register selbst.
mfG
Markus
Um das sichern der Register kümmert sich GCC schon (wenn man es nicht expizit abschaltet für die ISR, per Zusatz "naked"). Man sollte nur vermeiden in der ISR eine funktion aufzurufen. Dann kann es passieren, dass GCC alle register sichert, obwohl es nicht nötig ist. Ein Makro ist aber OK, genau wie eine Inline Funktion..
So oft ist 15000 mal die Sekunde noch nicht.
D.h. wenn ich z.B. in einer Timer-ISR nur ne volatile-Variable hochzählen lass, dann kann ich die ISR als naked verbauen? Aber muss der die Variable dazu nicht auch in ein Register laden, wobei ein evtl. Wert überschrieben wird?
#ifndef MfG
#define MfG
Nicht wenn du deine Variable als "register" Variable deklariert hast, dann bleibt sie immer in einem bestimmen Register (weiß allerdings nicht, wie das bei Variablen ist, die mehr als ein Byte groß sind).
Diese Variable kannst du dann beliebig hoch oder runterzählen. Was du sonst noch damit machen kannst hängt davon ab, in welchem Register sie gespeichert wird.
Gruß, Yaro
@Jaecko: Vorsicht!
Das Hochzählen verändert das Statusregister SREG - du musst also zumindest das Status-Register sichern (und danach wiederherstellen), bevor du Operationen durchführst, die dieses verändern.
mfG
Markus
Die Möglichkeit das Register retten zu unterdrücken ist fast nur für Assembler Code sinnvoll. Nur da weiss man von vornherrein welche Register gerettet werden müssen. Kurzen Stücke kann man so als inline ASM einbinden. Nur mit C Code geht das fast nicht, denn da wird oft das SREG verändert.
Bei einer ISR in ASM ist der normale Weg aber eher die ganze ISR in ein extra File (xxx.s) auszulagern.
Lesezeichen