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


von Sebastian (Gast)


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)


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)


Lesenswert?

Möglichkeit 3: Benutze keine verschachtelte For-Schleifen.
1
move to start position
2
loop:
3
  check CAN signals
4
  if CAN says stop:
5
    save current position
6
    exit loop
7
  
8
  measure at current postion
9
10
  step x
11
  if x is at end:
12
    move x to start pos
13
    step y
14
    if y is at end:
15
      exit loop

von Nick M. (Gast)


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)


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)


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:
1
loop()
2
{
3
  // mache was auf Zelle x,y
4
  x++; if(x>maxx) { x=0; y++; if(y>maxy) y=0;
5
  // bearbeite ev. Neupositionierung die per CAN reinkam
6
}

von Peter D. (peda)


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)


Lesenswert?

Man setzt in der unteren Ebene der verschachtelten FORs einfach einen 
checkForInterruptDataAndProcessIt(); ein

von Tom (Gast)


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. (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.