http://www.drtak.org/teaches/ARC/cisp299_bot/book/book/node46.html unten ist im code ... [ccode] volatile unsigned long get_tick_counter(void) { unsigned char oldSREG = SREG; unsigned long tmp; _CLI(); // disable interrupt tmp = tick_counter; if (SREG & (1 << SREG_I)) _SEI(); return tmp; } [/ccode] ich hätte anstatt if (SREG & (1 << SREG_I)) _SEI(); einfach sei(); aufgerufen. ausserdem wie sollte SREG_I gesetzt(1) sein, wenn cli es gelöscht hat? grüsse, daniel
Der Programmierer wollte wahrscheinlich schreiben: volatile unsigned long get_tick_counter(void) { unsigned char oldSREG = SREG; unsigned long tmp; _CLI(); // disable interrupt tmp = tick_counter; if (oldSREG & (1 << SREG_I)) _SEI(); return tmp; } Also nur dann den Interrupt wieder einschalten, wenn er vor dem Aufruf der Funktion auch ein war. Ansosnten würde auch die Variable oldSREG keinen Sinn machen.
>ich hätte anstatt >if (SREG & (1 << SREG_I)) _SEI(); >einfach sei(); aufgerufen. Hmm... if (I-Bit gesetzt) Setze I-Bit; eigentlich macht die Zeile gar nichts, oder? Ich kenne jetzt die CPU deren Eigenarten nicht. Wenn's ein 8 Bit AVR ist, dann ist das in meinen Augen Unsinn. Auffällig ist auch > unsigned char oldSREG = SREG; ... danach wird der Wert aber nicht zur Wiederherstellung der Segmentregister verwendet - halte ich für nicht beabsichtigt.
>Also nur dann den Interrupt wieder einschalten, wenn er vor dem Aufruf >der Funktion auch ein war. Ansosnten würde auch die Variable oldSREG >keinen Sinn machen. Denke ich auch. Aber auch das wäre irgendwie bescheuert gelöst. Was spricht gegen ein SREG = oldSREG; ? Komisches Buch :)
Ne, das würde schon Sinn machen, der Funktion ist's quasi egal ob VOR Aufruf der Funktion der Interrupt enabled war oder nicht, das kann in verzwickten Situationen schon mal vorkommen. Quasi ein push/pop des Intstatus. Allerdings halte ich es im Rahmen des Beispiels trotzdem für reinen Angebercode :-)
irgendwie hab ich die Zeile unsigned char oldSREG = SREG; total übersehen. So macht es schon mehr Sinn if (oldSREG & (1 << SREG_I)) _SEI(); werde mal dem Autor eine Mail schreiben.
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.