MikroKopter-Wiki   •   SHOP   •   Video-Liste   •   MikroKopter-FAQ   •    English translation

Mikrocontroller- & MicroSPS-Forum » Newbie - Bereich » ? zu sei() und cli() im Vergleich zu SREG I-Bit setzen

? zu sei() und cli() im Vergleich zu SREG I-Bit setzen

Moderatoren: jamiro, ligi, P_Latzhalter.

Seite: 1

Autor Neuer Beitrag
Mitglied
Registriert seit: Jun 2008
Beiträge: 24
Ort: Offenbach am Main
Hallo zusammen,

Habe da mal eine Frage zum Global Interrupt enable/disable

Wie man aus den MK-Quellcodes erkennen kann wird in der Regel
der Befehl sei(); zum Einschalten des Global Interrupt verwendet
und zum Abschalten cli();

Ich habe es bisher immer so gemacht, daß ich das I-Bit aus dem Register
SREG umgeschaltet habe:


SREG |= (1<<7); // oberstes Bit setzen = I-Bit Global Interrupt enable
entspricht
sei(); // define sei() __asm__ __volatile__ ("sei" ::)

und

SREG &= ~(1<<7); // oberstes Bit löschen = I-Bit Global Interrupt disable
entspricht
cli();

Hat die Methode per sei(); und cli(); irgendwelche Vorteile ?

Gruß
Bernhard
« Bearbeitet von dk9nw am 18.08.2008. »
MK-Betatester, Wiki-Team
Registriert seit: Apr 2007
Beiträge: 463
Ort: Bei Berlin
sei und cli lässt sich einfach schneller schreiben. Ansonsten machts nix anderes.

Eigentlich sollte man zuvor noch das SREG register sichern und später zurückschreiben, so wie in Killagregs Code.

uint8_t sreg = SREG;
cli();

//todo

SREG = sreg;
_______________
http://www.quadrokopter-berlin.de
MK-Betatester
Registriert seit: May 2007
Beiträge: 574
Ort: Otterbach bei Kaiserslautern
Hi,

außerdem ist sei() und cli() universeller.
Wenn du mal den Code portieren willst ist nicht gesagt das das Bit in dem Register das noch macht.
Da sei() und cli() über die entsprechenden libs eingebunden werden, sollte der Code dann auch auf anderen Professoren ohne große Änderungen funktionieren.


Bye
Mikeljo

Der grade ein Programm von Mega32 auf Mega644p portiert. :roll: Blöde Idee das. :roll:
Und man sollte das Migrationspapier dazu auch lesen! :twisted:
Mitglied
Registriert seit: Sep 2007
Beiträge: 96
Ort: 21271 Asendorf
sei und cli sind garantiert atomar (1 cpu cycle) und die schnellste Möglichkeit.
Die Mask Operation kann ansonsten entweder mit sbi/cbi (2cycles) oder ld+and/or+st ($viele cycles) erreicht werden.
_______________
"Sir! We are surrounded!" - "Excellent! We can attack in any direction!"
Mitglied
Registriert seit: Jun 2008
Beiträge: 24
Ort: Offenbach am Main
Hallo zusammen,

Vielen Dank für die schnellen Antworten.

Zitat
Eigentlich sollte man zuvor noch das SREG register sichern und später zurückschreiben, so wie in Killagregs Code.

Da ich ja nur das eine Bit verändere, bleibt SREG ansonsten bestehen. Deswegen muß ich SREG eigentlich nicht sichern.

Aber dieses Argument ist überzeugend:
Zitat
sei und cli sind garantiert atomar (1 cpu cycle) und die schnellste Möglichkeit.


und der Code ist besser auf andere Mikrocontroller portierbar.

Gruß
Bernhard

Seite: 1

Mikrocontroller- & MicroSPS-Forum » Newbie - Bereich » ? zu sei() und cli() im Vergleich zu SREG I-Bit setzen

© Holger Buss & Ingo Busker   •  Mikrocontroller- & MicroSPS-Forum is powered by UseBB Forum Software