Not logged in. · Lost password · Register
Forum: Grundstudium 2. Semester Informatik (GDI II) SPiC RSS
Klausur Juli 2009
Page:  1  2  next 
Stefan #1 -- for 2 months · 31 posts
Show profile · Link to this post
Subject: Klausur Juli 2009
Es geht um die Ankreuzaufgabe:

b) Ein Hauptprogramm und eine Interruptbehandlung greifen nebenläufig
auf die Variable uint16_t foo zu. Das Hauptprogramm verwendet foo
in der Anweisung uint16_t bar = foo; der Interrupthandler verwendet
foo im Vergleich if(foo == 5). Welches Nebenläufigkeitsproblem kann
auftreten?
❏ Lost-Update
❏ Lost-Wakeup
❏ keines
❏ Das Hauptprogramm könnte einen inkonsistenten Wert lesen, da foo aus 2 Bytes
besteht und nicht mit einer Instruktion geladen werden kann.

Ich denke ja, dass die ersten beiden Antworten hier nicht möglich sind.
Eigentlich wird doch die Variable foo im Interrupthandler gar nicht verändert.
Deswegen sollte doch dann auch kein Problem auftreten?

Weiterin wollte ich fragen, ob eine derartige globale Variable, wie foo, volatile gesetzt werden muss.
Im Prinzip verändert der Handler ja nichts an der Variablen.

Danke für eine Antwort
angua #2 -- for 2 months · 6 posts
Show profile · Link to this post
Hallo Stefan

Tatsächlich tritt hier KEIN Nebenfäufigkeitsproblem auf, weil auf foo außschließlich lesend zugegriffen wird.


Grüße
Wanja #3 -- for 2 months · 17 posts
Show profile · Link to this post
Hi Stefan,

kurz noch hierzu:

Quote by Stefan:
Weiterin wollte ich fragen, ob eine derartige globale Variable, wie foo, volatile gesetzt werden muss.
Im Prinzip verändert der Handler ja nichts an der Variablen.

Damit hast du Recht. Anhand des Ausschnitts ist es schwer zu beurteilen, ob volatile noetig waere, da wir die Stelle ja nicht sehen, wo foo veraendert wird. Ein Programm, bei dem foo im Hauptprogramm lesend benutzt wird und in der ISR auch, aber in dem foo nie *geschrieben* wird, macht wahrscheinlich wenig Sinn...

-Wanja
Stefan #4 -- for 2 months · 31 posts
Show profile · Link to this post
Okay Danke für die Antworten.

Aber würde dann ein Nebenläufigkeitsproblem auftreten, wenn foo im Hauptprogramm hochgezählt wird
und im Handler nur lesend darauf zugegriffen wird? Also durch den Interrupt nicht verändert wird?
Wanja #5 -- for 2 months · 17 posts
Show profile · Link to this post
Lass uns noch ein bisschen mehr an deinen Gedanken teilhaben. Was denkst du denn, an welcher Stelle es kritisch werden koennte und warum?
Stefan #6 -- for 2 months · 31 posts
Show profile · Link to this post
Eigentlich denke ich nicht, dass es in diesem Fall gefährlich wird, weil ja bei einem reinen Lesen im Interrupthandler
nichts mehr auf die Variable zurückgeschrieben werden muss.Somit kann die Variable die ja im Hauptprogramm
hochgezählt wird nicht durch einen Interrupt verändert werden.
Das heißt für mich, dass kein Problem auftreten kann.
Wanja #7 -- for 2 months · 17 posts
Show profile · Link to this post
OK, aber was passiert, wenn das Hauptprogramm genau waehrend des "Hochzaehlens" durch den Interrupt unterbrochen wird? Aus welchen Teiloperationen (= Maschineninstruktionen) besteht denn dieses Hochzaehlen einer 16-Bit-Variable?
Stefan #8 -- for 2 months · 31 posts
Show profile · Link to this post
Die Schritte für das Hauptprogramm sind mir schon klar. Ist ja wie in den Folien.
Aber für die if - Abfrage im Handler nicht ganz.
Wird der Inhalt von foo hier auch in zwei Schritten geladen und anschließend wieder zurückgeschrieben?
Wenn der Inhalt wieder zurückgeschrieben wird ist mir das Problem klar, sonst nicht ganz.
Wanja #9 -- for 2 months · 17 posts
Show profile · Link to this post
Hi,

im Handler wird foo auch in zwei Schritten geladen, ja. Allerdings stoert das da ja nicht, da der Handler nicht selbst unterbrochen werden kann. Im Hauptprogramm kann allerdings das *Schreiben* in zwei Schritten eben durch den Handler unterbrochen werden. Und genau dann haben wir ein Problem, naemlich wenn das Hauptprogramm ein Byte schon geschrieben hat, das zweite Byte aber noch "alt" ist und dann der IRQ eintritt. Dann liest der Handler einen inkonsistenten Wert, bestehend aus einem alten und einem neuen Byte. Alles klar? Ansonsten frag nochmal nach.
Stefan #10 -- for 2 months · 31 posts
Show profile · Link to this post
Ja ist klar.

Danke
Stefan #11 -- for 2 months · 31 posts
Show profile · Link to this post
Noch eine Frage...

Hauptprogramm:
zaehler = 0; z2=0;
while (1) {
if(zaehler > 0)   Betreffende Stelle
print(++z2);
cli();
zaehler --;
sei();
}
}
Interruptbehandlung:
zaehler++;

Wenn die Variable zaehler im Hauptprogramm für die If- Bedingung verwendet wird, müssen die Interrupts doch auch gesperrt werden?
Wieso ist das in Aufgabe3 Klausur Juli 2007 nicht der Fall?
morty (Administrator) #12 -- since Sep 2003 · 730 posts · Location: Erlangen
Show profile · Link to this post
Wo stammt der Code her? Kann ihn gerade nicht finden. Vor allem kommt es auf die Architektur und den variablen-typ von zaehler an.
Ansonsten bitte für jede neue Frage einen neuen Thread aufmachen. und [code=c] ... [/code] - Tags verwenden
Stefan #13 -- for 2 months · 31 posts
Show profile · Link to this post
Stammt aus der Musterlösung für Klausur Juli 2007.
Wanja #14 -- for 2 months · 17 posts
Show profile · Link to this post
Hi Stefan,

du meinst anscheinend die Loesung zu der Klausur, die wir online gestellt haben, oder? Schreib das beim naechsten Mal am besten gleich hin, damit wir nicht suchen muessen.
[Sorry, da haben sich unsere Antworten wohl ueberlappt; danke fuer die Klarstellung.]

Im Prinzip hast du Recht, dass du dir die betreffende Stelle genauer anschaust. Falls "zaehler" breiter ist als ein Wort (z. B. 16 Bit auf dem AVR), dann muesste man da auch noch IRQs sperren, da man sonst evtl. einen inkonsistenten Wert liest. Da davon hier aber nichts steht, kann man davon ausgehen, dass der Wert in ein Wort passt; damit hat man beim Lesen kein Problem, sondern nur beim Herunterzaehlen (entspricht Lesen, Veraendern, Zurueckschreiben). Alles klar?
Stefan #15 -- for 2 months · 31 posts
Show profile · Link to this post
Ja angenommen die Variable muss in zwei Schritten geladen werden.
Und zwischen diesen Schritten kann dann der Interrupt auftreten.
Dann könnte doch beim laden folgendes passieren:
zaehler = 00 ff  es müssen 2Byte geladen werden.
Jetzt wird zunächst 00 geladen.
Interrupt tritt ein.
Zählt die Variable um eins nach oben.
Zaehler = 01 00
Jetzt wird dann das zweite Byte geladen.
also auch 00
Insgesamt steht jetzt also 00 00 zum Vergleich in der if- Abfrage.
Das ist natürlich falsch!
Ist doch richtig so?
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  1  2  next 
Go to forum
Unclassified NewsBoard 1.6.4 © 2003-5 by Yves Goergen
Page created in 645.8 ms (434.9 ms) · 141 database queries in 107.5 ms
Current time: 2010-09-10, 04:26:41 (UTC +02:00)