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
>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(); |
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.
@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.
Neuerdings benutzt man ATOMIC_BLOCK dafür. http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html
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.