-         

Ergebnis 1 bis 3 von 3

Thema: Interrupt sperren?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.03.2005
    Beiträge
    5

    Interrupt sperren?

    Anzeige

    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?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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...

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    61
    Beiträge
    531
    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)

    Code:
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •