Go Down

Topic: [Projekt] Multitasking (Read 5834 times) previous topic - next topic

michael_x

Quote
Anfänger dürften davon profitieren, die von den komplizierten Lösungen wie BlinkWithoutDelay abgeschreckt sind
Das Problem bei Makros ist, dass der Compiler was anderes sieht als was der Anfänger geschrieben hat, und eventuelle Fehlermeldungen dadurch noch viel unverständlicher werden als sie für Anfänger so schon sind.

Wem BlinkWithoutDelay zu komplex ist, dem ist nicht zu helfen  der wird auch mit den Multitasking Makros Probleme haben  :smiley-confuse:

Wenn man weiss, dass diese Makros dazu dienen, heimlich aus der umgebenden Funktion zu verschwinden um beim nächsten Mal genau dort wieder weiter zu machen, und man damit gedanklich zurecht kommt, schön. Damit kann man sicher übersichtlich AblaufSteuerungen definieren.

combie

#16
Jul 29, 2016, 05:32 pm Last Edit: Jul 29, 2016, 05:36 pm by combie
Quote
Wenn man weiss, dass diese Makros dazu dienen, heimlich aus der umgebenden Funktion zu verschwinden um beim nächsten Mal genau dort wieder weiter zu machen,
Das hast du schön formuliert.
.... "heimlich" .... "verschwinden" ....
;-)





Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

skorpi080

playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Doc_Arduino

Hallo,

ich hatte ja schon einmal versucht zu fragen, bekam aber keine Antwort. Im Grunde ist das ja die negative Logik von deinem Intervall Projekt. Womit ich nicht klar komme vom Verständnis her ist folgendes.
Man möchte doch das die loop so schnell wie möglich durchlaufen wird.
Da widerspricht es doch das man hier feste Zeiten für andere Dinge frei gibt.
Statt so schnell wie möglich sein Ding fertig zu machen und dann kann das nächste dran kommen.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#19
Jul 29, 2016, 09:16 pm Last Edit: Jul 29, 2016, 10:32 pm by combie
Quote
ich hatte ja schon einmal versucht zu fragen, bekam aber keine Antwort.
Sorry, ich hatte deine Frage nicht verstanden.
Auch jetzt noch nicht wirklich.

Aber, ich versuchs mal....

Quote
Man möchte doch das die loop so schnell wie möglich durchlaufen wird.
Das stimmt!
Findet bei den ganzen Beispielen ja auch mehr als 100.000 mal pro Sekunde statt.

Quote
Da widerspricht es doch das man hier feste Zeiten für andere Dinge frei gibt.
Nöö...
Denn die "freie" Zeit geht ja an loop(), im Grunde so, wie es das Interval Macro auch macht.

Ich halte es also nicht für inverse Logik, sondern eher für die gleiche.


Hmmm.
War es das, was du wissen wolltest?

Nachtrag:
Ah....
Ich glaube, jetzt... kommts mir...

Zu Anfang sagte ich:
Quote
taskSwitch() Gibt die Rechenzeit an andere Tasks ab. Es wird im nächsten Durchlauf an dieser Stelle weiter gearbeitet.
Der erste Teil ist wohl missverständlich.
Die Rechenzeit wird nicht direkt an andere Tasks abgegeben, sondern der Programmfluss wird per Return an die aufrufende Funktion übergeben, und loop() kann dann andere Tasks aufrufen, bzw. zusätzliche Aufgaben erledigen. Das gilt natürlich auch für die anderen Taskkontrol Dinger..
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

combie

Was gefällt euch an Jomelos simpleThread nicht?
Das kannte ich vorher noch nicht.

Auch sind meine taskMacros vermutlich schon einiges älter.
Hatte sie nur noch nicht aufs Arduino Umfeld portiert.


Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

genau jetzt gehts in die richtige Richtung. Ich hatte noch keine Zeit mir das näher anzuschauen, habe nur deine Texte hier dazu mehrfach gelesen. Also macht der Task sein Ding und wenn er fertig ist gehts in der loop normal weiter. Und wenn der Task selbst aktuell nichts zu tun hat blockiert er auch nicht sondern gibt sich sofort wieder frei zurück an loop.
Okay, dass verstehe ich. Wie dein Intervall nur eben anders verpackt. Sehr schön.  :)   Werde das sicherlich bald selbst testen.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

SebastianHeiden

Was mache ich falsch  :smiley-confuse:

kurze Einleitung:

ich möchte einen Servo ansteuern und nebenbei andere dinge erledigen
doch ich bekomme diese Fehlermeldung und habe keinen schimmer was falsch ist

Bitte um richtigstellung !!

Code: [Select]
#include <TaskMacro.h>
#include <Servo.h>
Servo servo1;

void setup() {
 
  Serial.begin(38400);     
  delay(500);
  servo1.attach(9);

}

void loop() {

 bewegung();
 
}

void bewegung() {
 
 taskBegin();

  int position;


  for(position = 20; position < 180; position += 2)   
  {
    servo1.write(position); 
    taskPause(20);               
  }

 
  for(position = 180; position >= 20; position -= 2)
  {                               
    servo1.write(position); 
    taskPause(20);     
   
  }
 
}




Fehlermeldung:

Code: [Select]


 In function 'void bewegung()':

sketch_aug04a:40: error: expected '}' at end of input

 };

  ^

exit status 1
expected '}' at end of input

 

combie

#23
Aug 04, 2016, 08:38 pm Last Edit: Aug 04, 2016, 08:44 pm by combie
Code: [Select]
#include <TaskMacro.h>
#include <Servo.h>
Servo servo1;

void setup() {
 
  Serial.begin(38400);     
  delay(500);
  servo1.attach(9);

}

void loop() {

 bewegung();
 
}

void bewegung() { 
  static int position;
  taskBegin();

  for(position = 20; position < 180; position += 2)   
  {
    servo1.write(position); 
    taskPause(20);               
  }

 
  for(position = 180; position >= 20; position -= 2)
  {                               
    servo1.write(position); 
    taskPause(20);     
   
  }
  taskEnd();
 
}


Die Meldung sagt:  taskEnd(); vergessen

 int position muss static werden, damit der Wert über mehrere Taskdurchläufe erhalten bleibt.
Die Deklaration sollte vor taskBegin stattfinden.


Evtl fehlt da noch eine Schleife, damit sich das Gezappel wiederholt.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

SebastianHeiden

Danke für die Rückmeldung
nach deinen Verbesserungen klappte es wie gewollt!
Hoffe das es dabei bleibt!!

combie

#25
Aug 04, 2016, 09:09 pm Last Edit: Aug 04, 2016, 09:14 pm by combie
Quote
Hoffe das es dabei bleibt!!
Ach, sicher..... ich habe da volles Vertrauen.

Quote
Danke für die Rückmeldung
Und, dir Danke für den Test!
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

SebastianHeiden

was mach ich jetzt falsch   :(

Code: [Select]
#include <TaskMacro.h>
#include <Servo.h>
Servo servo1;

void setup() {
 
  Serial.begin(38400);     
  delay(500);
  servo1.attach(9);

}



void bewegung() {

if(Serial.available())
{
  if(Serial.read() == "1")
  {

 
 taskBegin();

 static int position;

  while(1){
 
  for(position = 20; position < 180; position += 2)   
  {
    servo1.write(position); 
    taskPause(20);               
  }

 
  for(position = 180; position >= 20; position -= 2)
  {                               
    servo1.write(position); 
    taskPause(20);     
   
  }
  }
  }
  taskEnd();
}


void count() {

  taskBegin();

  static int zahl = 0;

  while(1) {

    Serial.println(zahl);
    zahl++;
    taskPause(100);
  }
  taskEnd();
}

void loop() {

 bewegung();
 count();
}

Fehlermeldung:
Code: [Select]

In function 'void bewegung()':

sketch_aug04a:19: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

   if(Serial.read() == "1")

                       ^

sketch_aug04a:48: error: a function-definition is not allowed here before '{' token

 void count() {

              ^

sketch_aug04a:67: error: expected '}' at end of input

 }

 ^


exit status 1
ISO C++ forbids comparison between pointer and integer [-fpermissive]

Serenifly

#27
Aug 04, 2016, 09:28 pm Last Edit: Aug 04, 2016, 09:36 pm by Serenifly
Der Fehler ist genau was da steht. Du kannst C Strings (d.h. Null-terminiere char Arrays) nicht mit == vergleichen. Und C Strings und Integer vergleichen geht erst recht nicht. Wir sind hier nicht in Visual Basic. C++ ist zwar nur schwach typisiert und macht einige implizierte Konvertierungen, aber du musst schon etwas auf die Datentypen achten.
Da steht was von Zeigern weil Arrays in Zeiger auf das erste Element zerfallen.

Das willst du allerdings auch nicht. 1 als ein ASCII Zeichen ist '1' (ASCII Code 49 und ein Integer) und nicht "1"

Jomelo

Fehlt da nicht noch eine Klammer beim schließen. Ich zähl 5 die du öffnest, aber nur vier die du schließst.

void bewegung() {

...

Wo wird die While Schleife geschlossen ?
while(!success){try++;}

combie

#29
Aug 04, 2016, 10:01 pm Last Edit: Aug 04, 2016, 10:03 pm by combie
Richtig!

Am Besten ordentlich einrücken, dann sieht man auch was zusammen gehört.
Und nochmal: Statische Variablen gehören an den Anfang der Funktion.(und sei es nur für die Übersichtlichkeit

Und auch das  taskEnd(); sollte an die richtige Stelle. Um diese zu finden hilft das Einrücken.

Code: [Select]
#include <TaskMacro.h>
#include <Servo.h>
Servo servo1;

void setup() {
 
  Serial.begin(38400);     
  delay(500);
  servo1.attach(9);

}



void bewegung()
{
  static int position;

  if(Serial.available())
  {
    if(Serial.read() == '1')
    {
       taskBegin();
     
        while(1)
        {
       
            for(position = 20; position < 180; position += 2)   
            {
              servo1.write(position); 
              taskPause(20);               
            }
         
           
            for(position = 180; position >= 20; position -= 2)
            {                               
              servo1.write(position); 
              taskPause(20);     
             
            }
        }
        taskEnd();   
    }
  }
 
}


void count()
{
  static int zahl = 0;
  taskBegin();


  while(1)
  {
    Serial.println(zahl);
    zahl++;
    taskPause(100);
  }
  taskEnd();
}

void loop() {

 bewegung();
 count();
}
)
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Go Up