PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt sperren?



bernd19631
28.04.2005, 18:46
Dass man mitunter Interrupts sperren muss ist mir eigentlich klar. Aber ist das auch bei Zeilen wie

REGISTER |= 1;

erforderlich?
Das Register müsste ja gelesen, der Wert verodert und anschließend wieder geschrieben werden. Wenn sich nun zwischen dem Lesen und dem Schreiben ein Interrupt schiebt, dann kann der ja den Registerinhalt verändern. Oder irre ich mich da?

Oder, wie kann man sich mit AvrStudio genau eine bestimmte C-Zeile im Assembler ansehen, um obiges Beispiel zu untersuchen?

uwegw
28.04.2005, 21:12
dann kann der ja den Registerinhalt verändern
das sollte der interrupt halt nicht tun... generell sollte man alle register die man im interrupt benutzt (und das statusregister sowieso) am anfang der interruptroutine pushen und hinterher wieder poppen...

wenn du in C proggst wird das normalerweise alles automatisch erledigt... sollte also keine probleme machen... aber wenn du ein reines assemblerprogramm schreibts dann halt vorgehne wie oben beschrieben...

Arexx-Henk
29.04.2005, 21:13
Oder, wie kann man sich mit AvrStudio genau eine bestimmte C-Zeile im Assembler ansehen, um obiges Beispiel zu untersuchen?

Die Assembler Zeile befinden sich im .lst Datei

Hier ein Beispiel von einem assembler listing bein Interrupt Anfang und Interrupt Ende.
Welche Register Pushed/Popped sind ist abhangig vom Program. (In diesem fall sind es etwas viele)


SIG_OVERFLOW interrupt Anfang.

375 0176 1F92 push __zero_reg__
376 0178 0F92 push __tmp_reg__
377 017a 0FB6 in __tmp_reg__,__SREG__
378 017c 0F92 push __tmp_reg__
379 017e 1124 clr __zero_reg__
380 0180 FF92 push r15
381 0182 0F93 push r16
382 0184 1F93 push r17
383 0186 2F93 push r18
384 0188 3F93 push r19
385 018a 4F93 push r20
386 018c 5F93 push r21
387 018e 6F93 push r22
388 0190 7F93 push r23
389 0192 8F93 push r24
390 0194 9F93 push r25
391 0196 AF93 push r26
392 0198 BF93 push r27
393 019a CF93 push r28
394 019c EF93 push r30
395 019e FF93 push r31


wirkliche interrupt function befinded sich hier


SIG_OVERFLOW interrupt Ende.

671 030c FF91 pop r31
672 030e EF91 pop r30
673 0310 CF91 pop r28
674 0312 BF91 pop r27
675 0314 AF91 pop r26
676 0316 9F91 pop r25
677 0318 8F91 pop r24
678 031a 7F91 pop r23
679 031c 6F91 pop r22
680 031e 5F91 pop r21
681 0320 4F91 pop r20
682 0322 3F91 pop r19
683 0324 2F91 pop r18
684 0326 1F91 pop r17
685 0328 0F91 pop r16
686 032a FF90 pop r15
687 032c 0F90 pop __tmp_reg__
688 032e 0FBE out __SREG__,__tmp_reg__
689 0330 0F90 pop __tmp_reg__
690 0332 1F90 pop __zero_reg__
691 0334 1895 reti