PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wann kann das Sichern von Registern in der ISR entfallen?



chris@franke
22.02.2010, 14:02
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:




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);
.....
}



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.

PicNick
22.02.2010, 14:50
An sich ist GCC zuständig, darauf aufzupassen.

Richard
22.02.2010, 15:17
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

markusj
22.02.2010, 21:44
GCC sichert die von ihm benutzten Register selbst.

mfG
Markus

Besserwessi
22.02.2010, 22:19
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.

Jaecko
22.02.2010, 22:32
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?

yaro
22.02.2010, 22:49
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

markusj
23.02.2010, 00:16
@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

Besserwessi
23.02.2010, 17:49
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.