webentwicklung-frage-antwort-db.com.de

Unterstützt Arduino das Threading?

Ich habe ein paar Aufgaben, die mit Arduino zu tun haben, aber eine davon dauert sehr lange, also habe ich mir überlegt, Threads zu benutzen, um sie gleichzeitig auszuführen .. Ich habe eine Arduino Mega

[Update] Nach vier Jahren kann ich FreeRTOS in meinem Arduino Mega installieren. Hier ist ein Link

17
Snake Sanders

Kurz gesagt: NEIN. Aber Sie können es versuchen: http://www.kwartzlab.ca/2010/09/arduino-multi-threading-librar/

13

Noch nicht, aber ich verwende diese Bibliothek immer bei großen Projekten: https://github.com/ivanseidel/ArduinoThread

Ich setze den Rückruf in einen Timer-Interrupt und voilá! Auf dem Arduino laufen Pseudo-Threads ...

5
Ivan Seidel

Nur um diesen Thread etwas vollständiger zu machen: Es gibt auch protothreads, die einen sehr geringen Speicherbedarf haben (paar Bytes, wenn ich mich recht erinnere) und lokale Variablen für Thread beibehalten. sehr praktisch und zeitsparend (weitaus weniger Zustandsautomaten -> besser lesbarer Code).

Beispiele und Code: arduino-class/ProtoThreads-Wiki

Um Sie wissen zu lassen, welche Ergebnisse Sie erwarten können: Serielle Kommunikation @ 153K6 Baudrate mit Threads für: Blinkende Statusdioden, Zeitmessung, Auswertung der angeforderten Funktionen, Handhabung und Logik IO und alles auf atmega328. 

5
Mr. Girgitt

Kein echtes Threading, aber TimedActions sind für viele Anwendungen eine gute Alternative

http://playground.arduino.cc/Code/TimedAction#Example

Wenn eine Aufgabe blockiert wird dies natürlich auch die andere, während das Threading eine Aufgabe einfrieren lässt und die andere fortfahren wird ...

4
FrancescoMM

Arduino unterstützt keine Multithread-Programmierung. 

Es gibt jedoch einige Problemumgehungen, zum Beispiel die in dieses Projekt (Sie können es auch von der Arduino-IDE installieren). 

Es scheint, dass Sie den Zeitplan selbst definieren müssen, während in einer echten Multithread-Umgebung das Betriebssystem entscheidet, wann Aufgaben ausgeführt werden. 

Alternativ können Sie Protothreads verwenden. 

1
Francesco Boi

Sie können arduinos verwenden.

Es ist für die Arduino-Umgebung konzipiert. Eigenschaften:

  • Nur statische Zuordnung (kein Malloc/neu)
  • Unterstützt den Kontextwechsel beim Verzögern der Ausführung
  • Implementiert Semaphore
  • Leicht, sowohl CPU als auch Speicher

Ich verwende es, wenn ich neue Befehle von Bluetooth/Netzwerk/Seriell erhalten muss, während die alten ausgeführt werden, und die alten haben Verzögerung in ihnen .. Ein Thread ist der Server-Thread, der die folgende Schleife ausführt:

while (1) {
    while ((n = Serial.read()) != -1) {
        // do something with n, like filling a buffer
        if (command_was_received) {
            arduinos_create(command_func, arg);
        }
    }
    arduinos_yield(); // context switch to other threads
}

Der andere ist der Befehlsthread, der den Befehl ausführt:

int command_func(void* arg) {
    // move some servos
    arduinos_delay(1000); // wait for them to move
    // move some more servos
}
1
eyal

Die vorige Antwort ist richtig, jedoch läuft das Arduino im Allgemeinen ziemlich schnell. Wenn Sie also Ihren Code ordnungsgemäß zeitgesteuert ausführen, kann er mehr oder weniger gleichzeitig Aufgaben erledigen.

Es empfiehlt sich, eigene Funktionen zu erstellen und zu vermeiden, dass zu viel realer Code in die Standard-Void-Schleife eingefügt wird

1
lkrasner

Nein, das geht nicht, aber Sie können den Timer-Interrupt verwenden.

1
Oshi_007

Arduino unterstützt kein Threading. Sie können jedoch das Beste daraus machen und Ihren Code um Zustandsmaschinen herum strukturieren, die in Interleaving ausgeführt werden.

Obwohl es viele Möglichkeiten gibt, Ihre Aufgaben als Zustandsautomaten zu implementieren, empfehle ich diese Bibliothek ( https://github.com/Elidio/StateMachine ). Diese Bibliothek abstrahiert den größten Teil des Prozesses.

Sie können eine Zustandsmaschine als Klasse wie folgt erstellen:

#include "StateMachine.h"
class STATEMACHINE(Blink) {
  private:
    int port;
    int waitTime;
    CREATE_STATE(low);
    CREATE_STATE(high);

    void low() {
      digitalWrite(port, LOW);
      *this << &STATE(high)<< waitTime;
    }
    void high() {
      digitalWrite(port, HIGH);
      *this << &STATE(low)<< waitTime;
    }
  public:
    Blink(int port = 0, int waitTime = 0) :
      port(port),
      waitTime(waitTime),
      INIT_STATE(low),
      INIT_STATE(high)
      {
        pinMode(port, OUTPUT);
        *this << &STATE(low);
      }
};

Das Makro STATEMACHINE() abstrahiert die Klassenvererbungen, das Makro CREATE_STATE() abstrahiert die Erstellung des Statuswrappers, das Makro INIT_STATE() abstrahiert den Methodenumbruch und das Makro STATE() abstrahiert den Statuswrapper-Verweis in der Statuscomputerklasse.

Der Zustandsübergang wird vom <<-Operator zwischen der Zustandsmaschinenklasse und dem Status abstrahiert. Wenn Sie einen verzögerten Zustandsübergang wünschen, müssen Sie diesen Operator nur mit einer Ganzzahl verwenden, wobei die Ganzzahl die Verzögerung in Millissekunden ist.

Um die Zustandsmaschine zu verwenden, müssen Sie sie zunächst instanziieren. Einen Verweis auf die Klasse im globalen Raum zu deklarieren, während sie mit new in der Setup-Funktion instanziiert wird, könnte den Trick erfüllen

Blink *led1, *led2, *led3;


void setup() {
  led1 = new Blink(12, 300);
  led2 = new Blink(11, 500);
  led3 = new Blink(10, 700);
}

Dann führen Sie die Zustände in einer Schleife aus. 

void loop() {
    (*led2)();
    (*led1)();
    (*led3)();
}
0
Luiz Menezes