2 Prozesse möglich?

Mir kam gerade mit einem Kumpel folgende fragestellung. Ist bei Arduino möglich einen 2ten Prozess zu initialisieren wie bei c# ?

Beispiel

void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void clear(){
 for(int i=0; i < strip.numPixels(); i++){
   strip.setPixelColor(i,0,0,0);
 }


int auswahl=0;

void loop() {

    while (Serial.available() == 0) { // Schaue ob Im Serialbuffer Argumente sind
    auswahl = Serial.parseInt();
    Serial.println(auswahl);
    }
   Serial.println(auswahl);
  switch (auswahl){
    case 0:
      clear();
      break;
    case 1:
      clear();
      rainbowCycle(20);
      break;
 
}}

Sprich das ich wärend der RainbowCycle läuft weiter auf den Serielen Port lausche und das Case setze?

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:

Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Der Wachmann

Multitasking Macros
Intervall Macro

Hallo,

überlege einmal. Wieviel Rechenkerne hat unser 8 Bitter?
Du musst so programmieren das alles ständig durchlaufen werden kann. Bedeutet die for Schleife umbauen und ohne hartes delay,
Vielleicht reicht es schon aus nur das delay umzuprogrammieren. Die for Schleife darf nur nicht länger dauern bis das der serielle Buffer volllaufen kann. Kommt auch darauf wie oft, wieviel und wie schnell Zeichen empfangen werden müssen. Sodass er rechtzeitig geleert wird - sprich abgehandelt. Wenn du das wiederum in deiner while machst, blockiert auch das den Rest vom Sketch. Darum for und while zu if umbauen.

Theseus erklärt millis()

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung

einfaches Bsp. ohne delay, blockiert nicht.

const byte LED13 = 13;

void setup()
{
  pinMode(LED13, OUTPUT);           
}

void loop()
{
  heartbeat();
}


void heartbeat ()                         // Kontrolle ob Sketch blockiert
{
  static unsigned long last_ms = 0;
  static bool state = LOW;
  const unsigned int INTERVAL = 500;
  
  if (millis() - last_ms > INTERVAL) {
    last_ms = millis();
    state = !state;
    digitalWrite(LED13, state);
  }
}

Ist bei Arduino möglich einen 2ten Prozess zu initialisieren

Bei Arduino gibt es überhaupt keinen Prozess. Die Zeile

while (true) loop ();

als Betriebssystem zu bezeichnen ist etwas übertrieben.

@michael_x
wenn man

setup();

vorne dazuschreibt konnte es dann was werden? :wink: :wink: :wink:
Grüße Uwe

Doc_Arduino:
Hallo,

überlege einmal. Wieviel Rechenkerne hat unser 8 Bitter?

Reichen die nicht aus, um einen Taskscheduler auszuführen?

wenn man
setup();
vorne dazuschreibt konnte es dann was werden? :wink: :wink: :wink:

Es Betriebssystem nennen? Wenn du willst, von mir aus.
Man kann auch etwas bauen und dann Taskscheduler nennen. Auch wenn es hinterher in einem einzigen Prozessor-Kern läuft.

Sinnvoller finde ich aber, die Überlegungen in die entgegengesetzte Richtung zu lenken: wie löst man das Problem ohne solchen Schnickschnack.

:wink:

Hier mal eine vereinfachte Lösung um das vielleicht zu verstehen…

int wait = 0;
uint16_t i, j;
boolean stopper = false;
unsigned long previousMillis = millis();

void rainbowCycleUpdate() {
if( !stopper && millis() - previousMillis > wait)
  if (j < 256 * 5) { // 5 cycles of all colors on wheel
    if ( i < strip.numPixels()) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
      i++;
    } else {
      i = 0;
previousMillis =millis();
    }
    strip.show();
    j++;
  } else {
    j = 0;
    stopper = true;
  }
}


int auswahl = 0;
void loop() {

  if (Serial.available() > 0) { // Schaue ob Im Serialbuffer Argumente sind
    auswahl = Serial.parseInt();
    Serial.println(auswahl);
  }
  Serial.println(auswahl);
  switch (auswahl) {
    case 0:
      clear();
      break;
    case 1:
      clear();
      i = 0;
      j = 0;
      wait = 20;
      stopper = false;
      break;

  }

    rainbowCycleUpdate();

}

Rintin:
Reichen die nicht aus, um einen Taskscheduler auszuführen?

Du kannst Task verwenden, verbietet niemand. Das würde jedoch nichts am grundlegenden Ablauf ändern. Parallele Ausführungen sind nicht möglich. Die Task würden "auch nur" nacheinander aufgerufen. Jede Programmzeile wird nacheinander abgearbeitet. Daran beißt die Maus keinen Faden ab.

Hier hatte ich mal gezeigt, wie man 2 unabhängige Animationen gleichzeitig laufen lassen kann:

Wenn die einzelnen Funktionen nicht blockierend sind, kann man auf diese Art ziemlich viel "gleichzeitig" (in Wahrheit schnell nacheinander) machen - und das auf einem einzigen Kern.

Gruß,

Helmuth

Doc_Arduino:
Du kannst Task verwenden, verbietet niemand. Das würde jedoch nichts am grundlegenden Ablauf ändern. Parallele Ausführungen sind nicht möglich. Die Task würden "auch nur" nacheinander aufgerufen. Jede Programmzeile wird nacheinander abgearbeitet. Daran beißt die Maus keinen Faden ab.

Das gilt aber grundsätzlich für alle Betriebssysteme - auch wenn im Computer ein Mehrkernprozessor steckt. Selbst bei einem 8-Kerner: Schau mal wieviel Prozesse unter Windows oder Linux 'parallel' laufen. Da bleibt auch auf einem Mehrkerner nichts anderes übrig, als die (zeit)scheibchenweise nacheinander auszuführen. Auch wenn dann ein paar davon tatsächlich mal parallel laufen.

hendrikator:
Mir kam gerade mit einem Kumpel folgende fragestellung. Ist bei Arduino möglich einen 2ten Prozess zu initialisieren wie bei c# ?

Mein Blutschokoladespiegel ist gerade ziemlich niedrig, aber für eine Antwort genügt das noch:

Man kann durchaus so programmieren, dass mehrere Dinge quasi gleichzeitig erledigt werden. Da die meisten Arduinos aber nur sehr wenig RAM haben und auch nur einen einzigen Prozessorkern, muss man hin und wieder tricksen, um alles zu erledigen, was erledigt werden muss. Höchste Priorität hat dabei, dass es nichts gibt, das den Prozessor blockiert (delay() ist Gift). Vielleicht wird klar, was ich meine, wenn Du das hier liest.

Gruß

Gregor

PS: Hier ist es wie bei einem Kaffeekränzchen. Es schwirren nur andere Begriffe durch die Luft.

MicroBahner:
Das gilt aber grundsätzlich für alle Betriebssysteme - auch wenn im Computer ein Mehrkernprozessor steckt. Selbst bei einem 8-Kerner: Schau mal wieviel Prozesse unter Windows oder Linux 'parallel' laufen. Da bleibt auch auf einem Mehrkerner nichts anderes übrig, als die (zeit)scheibchenweise nacheinander auszuführen. Auch wenn dann ein paar davon tatsächlich mal parallel laufen.

Wir reden hier aber nicht von Betriebsystemen sondern von einem µController ohne Betriebsystem mit einem einzigen fest programmierten Programm drauf.

Antwort auf die Fragfe das TO:
Nein, Arduino kann keine 2 Sketche unabhängig voneinander laden und ausführen. Arduino kann einen Sketch ausführen der schnell hintereinander 2 Sachen macht.

Arduino kann kein C#.

Grüße Uwe

Multitasking lief unter Windows schon auf dem 80186, der eher weniger konnte und langsamer war als ein heutiger Arduino. Es kommt also auf die Ansprüche und Erwartungen an, die man an so ein "System" stellt. Kooperatives Multitasking, wie bis Win98 üblich, läßt sich auch auf einem Arduino machen, solange man mit dem Speicher auskommt.

Einen einfachen Einstieg ermöglichen die Task Makros. die erst einmal die Scheu vor der Programmierung paralleler Prozesse nehmen. Sie verstecken eigentlich nur die dicksten Brocken, die auf den Neuling zukommen, nämlich das Hantieren mit millis() und delay(), und die Konstruktion von Automaten. Seltsamerweise kann ich keine derartige Bibliothek mehr finden, weder von Combie noch meine eigene?

Seltsamerweise kann ich keine derartige Bibliothek mehr finden, weder von Combie noch meine eigene?

Hmmm...
Meinen Kram habe ich oben schon verlinkt, und wenn mich nicht alles täuscht, hast du deinen Kram irgendwo in den Tiefen des Threads verlinkt.
Für einen aufmerksamen Leser besteht also die Chance es zu finden.

hendrikator:
Mir kam gerade mit einem Kumpel folgende fragestellung. Ist bei Arduino möglich einen 2ten Prozess zu initialisieren wie bei c# ?

es gibt für Arduinos u.a. 2 Libs, um kooperatives Multithreading durchzuführen,
beide heißen Scheduler,
eine ist von C.Maglie, die andere von M.Patel.
Die von Maglie ist nur für den Due geeignet, die andere auch für AVRs und auch ARMs (CMIIW) .

Du kannst bei beiden eine 2. loop() starten (und auch noch weitere zusätzlich), die per time slice scheduler mit der/den anderen loops pseudo-parallel abgearbeitet werden.
Bei kleinen AVRs muss man sehr auf den Speicher der loops achten, beim Due mit seinen 92kB RAM ist das deutlich unproblematischer.

Du kannst bei beiden eine 2. loop() starten

void loop () {
task_A ();
task_B ();
}

Geht auch ohne Library. Wenn die "tasks" es richtig machen, also keine Zeit brauchen, laufen sie parallel und gleichzeitig. Je nach dem wie eng man es sieht, können sie auch nur ganz wenig Zeit brauchen und laufen dann so gut wie gleichzeitig.
Aber "Prozesse" würde ich es nicht nennen. Nach meinem Sprachempfinden setzt das ein Betriebssystem voraus, das die Prozesse voneinander trennt.

michael_x:

void loop () {

task_A ();
task_B ();
}



Geht auch ohne Library. Wenn die "tasks" es richtig machen, also keine Zeit brauchen, laufen sie parallel und gleichzeitig. Je nach dem wie eng man es sieht, können sie auch nur ganz wenig Zeit brauchen und laufen dann so gut wie gleichzeitig. 
Aber "Prozesse" würde ich es nicht nennen. Nach meinem Sprachempfinden setzt das ein Betriebssystem voraus, das die Prozesse voneinander trennt.

das ist doch nicht das Thema! man kann immer 2 Funktionen nacheinander aufrufen, nachdem jede einzelne komplett “fertig” ist, das ist aber nicht pseudoparallel und kein Multithreading.
Pseudoparalleles Scheduling ermöglicht auch Sprünge aus dem laufenden Prozess heraus (kooperativ hier in den Schedulern per yield() oder sogar auch während delay() ), wenn eine Funktion “länger dauert”, und dann macht er auf der (über-)nächsten Zeitscheibe dort weiter, wo er zuvor aufgehört hat.
Auf diese Weise werden alle Prozesse wie bei einem Reißverschlusssystem miteinander verzahnt.
Dein “Sprachempfinden” und was du damit verbindest, ist hier auch nicht so wesentlich, denke ich.
Lies dir mal die Kommentare der Autoren dazu durch!

Dein "Sprachempfinden" und was du damit verbindest, ist hier auch nicht so wesentlich, denke ich.

Ja, so ähnlich habe ich deine Reaktion erwartet.
Auf sachdienliche Anmerkungen wird mit einer persönlichen Abwertung reagiert.
Psychologisch mittelmäßig interessant, aber einer zielführenden Kommunikation wenig zuträglich.

Merksatz:

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

Hier ist es klipp und klar, dass du nicht verstanden hast, was michael_x dir sagen wollte.
Aber das mag ja noch kommen.....

combie:
Ja, so ähnlich habe ich deine Reaktion erwartet.
Auf sachdienliche Anmerkungen wird mit einer persönlichen Abwertung reagiert.
Psychologisch mittelmäßig interessant, aber einer zielführenden Kommunikation wenig zuträglich.

Merksatz:

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

Hier ist es klipp und klar, dass du nicht verstanden hast, was michael_x dir sagen wollte.
Aber das mag ja noch kommen.....

von dir habe ich auch nichts anderes erwartet -
was hat schließlich ein persönliches Sprachempfinden mit den objektiven Features der Scheduler libs zu tun?
Nur darum geht es hier.

dsyleixa:
es gibt für Arduinos u.a. 2 Libs, um kooperatives Multithreading durchzuführen,
beide heißen Scheduler,
eine ist von C.Maglie, die andere von M.Patel.
Die von Maglie ist nur für den Due geeignet, die andere auch für AVRs und auch ARMs (CMIIW) .
http://www.arduino.cc/en/Tutorial/MultipleBlinks
https://github.com/arduino-libraries/Scheduler
https://github.com/mikaelpatel/Arduino-Scheduler
Du kannst bei beiden eine 2. loop() starten (und auch noch weitere zusätzlich), die per time slice scheduler mit der/den anderen loops pseudo-parallel abgearbeitet werden.
Bei kleinen AVRs muss man sehr auf den Speicher der loops achten, beim Due mit seinen 92kB RAM ist das deutlich unproblematischer.