Nicht angemeldet. · Kennwort vergessen · Registrieren

beckus
LTE, DL1CHB
(Moderator)
Avatar
Mitglied seit 10/2010
101 Beiträge
Betreff: Lost Update
Wegen des Lost-Update Problems:

In der folie gibt es das beispiel mit dem auto:

  1. int main(){
  2.     while(1){
  3.         waitsec(60);
  4.         send (cars);
  5.         cars=0;
  6.     }
  7. }
  8. ISR...(){
  9.     cars++;
  10. }
Es wird beschrieben wenn ich cars sende, und danach eins vorbeifährt, die ISR das inkrementiert das dann verloren geht weil die main das danach gleich auf 0 setzt. Also deaktiviere ich interruppts vor dem senden: ich sende cars ab, das auto fährt vorbei (ich registrier das gar nicht weil ja meine interrupts aus sin), ich setzte cars auf 0 und habs auch verloren. Oder wird der interrupt auch nach einem cli() gestacked? Und wäre es dann nicht sinnvoller nur den einen interrupt zu deaktivieren (GIMSK etc?), denn man stelle sich eine Anlage vor wo ein Notaus/sonstwas über nen interrupt geht der ja immer funktionieren soll und da dann so nen verpasstes Teil zu gunsten der Sicherheit egal ist?
E-Mail: christopher.beck@fau.de
GPG-Fingerprint: AE1A C931 2BAF C5A1 F0BE 2083 3117 1121 2F9D 4F14
D.Kay
Mitglied seit 10/2010
15 Beiträge
Es wird doch ein Interrupt pro Quelle gepuffert. Und da die ISR möglichst kurz sein sollte gehe ich mal davon aus, dass der eine auch nicht verloren geht und danach bearbeitet wird. So wäre zumindest meine Vermutung.
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Jep, du sperrst die Bearbeitung, nicht den Interrupt. Die Beste Lösung wäre übrigens:
  1. int main(){
  2.     while(1){
  3.         waitsec(60);
  4.         cli();
  5.         int lcars = cars;
  6.         cars=0;       
  7.         sei();
  8.         send (lcars);
  9.     }
  10. }
  11. ISR...(){
  12.     cars++;
  13. }
weil send üblicher Weise länger dauern könnte.
beckus
LTE, DL1CHB
(Moderator)
Avatar
Mitglied seit 10/2010
101 Beiträge
Ah okay, wenn der dann da gestacked wird isses okay.
Nur noch 2 kleine Fragen: Wenn mir das lost update Problem nichts macht (ich setzte die variable z.b. nicht auf 0, lösche also nichts sondern inkrementier / dekrementiere nur über einen wert der wenn um +/- 1 schwank nichts kaputt macht) gibt es dann Punkteabzug oder mus sich das dann hinschreiben warum ich das cli() weggelassen habe? Bzw andersum: ist es da eher sinnvoll das generell mit cli() und sei() zu machen?
Und die andre (eher jetzt nicht so Prüfungsrelevant): mit cli() kann ich ja wie eben herauskam den interrupt stacken, stacke aber alle anderen interrupts (deswegen hast du verm. die lösung mit dem späterem send gemacht). Kann auch die bearbeitung eines einzelnen interrupts sperren aber alle andren weiter laufen lassen?

Schonmal danke, jetzt hab ichs denke ich geraff :)
E-Mail: christopher.beck@fau.de
GPG-Fingerprint: AE1A C931 2BAF C5A1 F0BE 2083 3117 1121 2F9D 4F14
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Zitat von beckus:
Ah okay, wenn der dann da gestacked wird isses okay.
Da wird nix gestackt. Beim Betreten ds Interrupts wird ein Bit glöscht. Bei eintreten des Interrupts gesetzt. Sind die Interrupts gesperrt wird der Interrupt nicht bearbeitet.

Zitat von beckus:
Nur noch 2 kleine Fragen: Wenn mir das lost update Problem nichts macht (ich setzte die variable z.b. nicht auf 0, lösche also nichts sondern inkrementier / dekrementiere nur über einen wert der wenn um +/- 1 schwank nichts kaputt macht) gibt es dann Punkteabzug oder mus sich das dann hinschreiben warum ich das cli() weggelassen habe?
Das kommt immer darauf an, ob es zu Problemen führen kann oder nicht. Meist ist das eindeutig.

Zitat von beckus:
Bzw andersum: ist es da eher sinnvoll das generell mit cli() und sei() zu machen?
So selten und kurz wie möglich, so oft und lang wie nötig... ;)

Zitat von beckus:
Und die andre (eher jetzt nicht so Prüfungsrelevant): mit cli() kann ich ja wie eben herauskam den interrupt stacken, stacke aber alle anderen interrupts (deswegen hast du verm. die lösung mit dem späterem send gemacht). Kann auch die bearbeitung eines einzelnen interrupts sperren aber alle andren weiter laufen lassen?

Nicht Stacken, aber ja es gibt das GICR und noch zwei Register oder so mit dem man Interrupts gezielt sperren kann.....
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen