Forum: Compiler & IDEs Interrupts unter C beim Atmel


von Peter (Gast)


Lesenswert?

Hallo Leute,
jetzt versuche ich mal mein ersten Projekt unter C mit dem Atmel, habe 
bis jetzt nur ASM gemacht.

Wenn ich in der main schreibe

PORTA = PORTA | (1 << PA5 );

dann, sind ja mehre ASM befehle. Auslesen des Port, Setzen des Bits und 
zurückschreiben.

Wass passiert jetzt wenn zwischen den Schritten ein Interrupt auftritt 
und auch den PORTA ändert? Also direkt nach dem Auslesen, damit wird die 
änderrung vom Interrupt ja wieder gelöscht.

Das gleiche kann auch bei variable++ passieren, welche auch im interrupt 
geändert wird.

Welche möglichkeit, aussen die Interrupts abzuschalten gibt es da?

Bei dem Port könnte ich mir noch mit inline asm und sbi behelfen.

mfg
Peter

von Matthias L. (Gast)


Lesenswert?

>Welche möglichkeit, aussen die Interrupts abzuschalten gibt es da?

Keine. Das ist genau so gedacht:
1
cli();
2
// mach was, was nicht unterbrochen werden darf
3
sei();

von Klaus (Gast)


Lesenswert?

Bei dem von dir genannten Beispiel mit dem Port ist es tatsächlich nur 
ein Assemblerbefehl (natürlich nur, wenn du mit Optimierung 
kompilierst), da die Portregister im bitadressierbaren Bereich liegen.

von Falk B. (falk)


Lesenswert?

Siehe Interrupt, atomare Zugriffe.

von Peter (Gast)


Lesenswert?

@Klaus
ja, das hatte ich auch gelesen, aber leider ist das ganze ist mir zu 
riskant, wenn man ein neuer compieler kommt und er sich dabei etwas 
anderes denkt geht es schief, wenn ich schon C mache dann sollte der 
code auch möglichst portabel sein. Also wird wohl nichts anderes 
übrigbleiben als die Interrupts abzuschalten.

von Simon K. (simon) Benutzerseite


Lesenswert?

Neuerdings benutzt man
ATOMIC_BLOCK dafür.
http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html

von Matthias L. (Gast)


Lesenswert?

>ATOMIC_BLOCK dafür.

Sehr interessant. Danke für den Link

von Klaus (Gast)


Lesenswert?

wow, cool, das kannte ich noch nicht :)

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
Noch kein Account? Hier anmelden.