mikrocontroller.net

Forum: PC-Programmierung Verschachtelte For Schleife pausieren und wieder fortsetzen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sebastian (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe ein Problem und mir fällt gerade keine elegante Möglichkeit 
ein, dass zu lösen.

Ich habe zwei verschachtelte For-Schleifen um x und y Verschiebung eines 
Messtisches zu ermöglichen. Das wird genutzt, um ein Raster zu 
vermessen. Jetzt würde ich gerne die Möglichkeit haben, diese Messung zu 
pausieren und später dort weiter zu machen. Auch soll vorgesehen werden, 
die Messung abbrechen zu können. Die Steuerung erfolgt über CAN. Das 
Einlsen der Botschaft per Interrupt. Das Decodieren der CAN Matrix und 
somit die Auswertung des Befehls aber außerhalb des Interrupts. Daher 
bräuchte ich sowas wie einen Interrupt für meine verschachtelten 
For-Schleifen. Kriege ich einen Interrupt durch die Can Botschaft, soll 
wenn die Botschaft komplett ist, in die Auswertung der Botschaft 
gesprungen werden und danach zurück in die aktuelle Position der 
For-Schleife, um ggf. dort mit dem ausgewerteten Kommando was tun zu 
können.

Wie kann man sowas lösen? Mir fällt jetzt nur ein, die aktuellen 
Positionen der For-Schleifen zu speichern, komplett die Schleifen zu 
verlassen. Die Auswertung zu machen und die Schleifen neu zu starten mit 
den zuletzt gespeicherten Werten. Dabei muss ich dann aber wieder 
Sonderfälle für die Initialisierung des Messequipment berücksichtigen, 
weshalb das erstmal nicht so schön wäre.

Gruß und Danke,
Sebastian

von nurmalso (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Möglichkeit 1:
Bau dir einen eigenen Interrupt

Möglichkeit 2:
Nutze ein RTOS

Möglichkeit 3:
fällt vielleicht jemand anderes ein

von Eric B. (beric)


Bewertung
1 lesenswert
nicht lesenswert
Möglichkeit 3: Benutze keine verschachtelte For-Schleifen.
move to start position
loop:
  check CAN signals
  if CAN says stop:
    save current position
    exit loop
  
  measure at current postion

  step x
  if x is at end:
    move x to start pos
    step y
    if y is at end:
      exit loop

von Nick M. (muellernick)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Daher
> bräuchte ich sowas wie einen Interrupt für meine verschachtelten
> For-Schleifen. Kriege ich einen Interrupt durch die Can Botschaft, soll
> wenn die Botschaft komplett ist, in die Auswertung der Botschaft
> gesprungen werden und danach zurück in die aktuelle Position der
> For-Schleife,

Das kann man doch durch polling innerhalb der inneren Schleife machen. 
Oder ist das zu lahm?

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Dabei muss ich dann aber wieder
> Sonderfälle für die Initialisierung des Messequipment berücksichtigen,
> weshalb das erstmal nicht so schön wäre.

Statemachine

von Michael B. (laberkopp)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Daher
> bräuchte ich sowas wie einen Interrupt für meine verschachtelten
> For-Schleifen.

Nein.

Du musst nur programmieren lernen.

Deine Programm-Huptschleife, nennen wir sie loop, zählt einfach in 2 
Dimensionen:
loop()
{
  // mache was auf Zelle x,y
  x++; if(x>maxx) { x=0; y++; if(y>maxy) y=0;
  // bearbeite ev. Neupositionierung die per CAN reinkam
}

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Man schreibt die Schleife nicht als Schleife, sondern als Funktion, die 
je Aufruf nur eine Iteration macht.
Die Variablen definiert man static, somit bleiben sie erhalten.
Über Argumente bestimmt man, ob sie fortsetzen soll oder neu starten.
Nun ruft man diese Funktion im Wechsel mit der CAN-Funktion in der 
Mainloop auf.

von Jens M. (schuchkleisser)


Bewertung
0 lesenswert
nicht lesenswert
Man setzt in der unteren Ebene der verschachtelten FORs einfach einen 
checkForInterruptDataAndProcessIt(); ein

von Tom (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Was soll denn am Ende der for-Schleife passieren, wenn sie ohne 
Interrupt durchlaufen sein sollte?

Ist das folglich überhaupt das richtige Mittel der Wahl oder braucht man 
nicht eine ganz andere Umsetzung?

von Claus W. (claus_w)


Bewertung
0 lesenswert
nicht lesenswert
Man könnte die Berechnungen in einem niederprioren Interrupt ausführen 
und das Flag für Aktivieren dieses Interrupts wahlweise manchmal 
ausschalten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.