Go Down

Topic: Mehrere Funktionen gleichzeitig ansteuern (Threads)? (Read 2 times) previous topic - next topic

Aquarium

Hi,

kann man auch 3 oder 4 Aktionen (Pins) gleichzeitig und unabhängig von einander ansteuern?

Ein Bekannter meinte was von "Threads", aber da diese Frage mit den darauffolgenden Antworten ebenfalls so bezeichnet wird, komme ich mit der Suche nciht weiter... :(

Jomelo

#1
Apr 12, 2013, 07:35 am Last Edit: Sep 14, 2013, 07:58 pm by Jomelo Reason: 1
Mikrocontroller (außer sie haben zwei Kerne) arbeiten ihr Programm von oben nach unten ab. Echt paralleles arbeiten ist nur mit FPGAs /CPLDs (werden in VHDL Programmiert / synthetisiert) oder Mehrkernprozessoren möglich.
Das Threading beschreibt ein Verfahren bei dem auch nicht "echt" parallel gearbeitet wird, sondern sehr schnell hintereinander. Wobei die einzelnen Threads über ein Scheduler gesteuert werden.
Im Prinzip wird jeder Funktion / jedem Programm ein Intervall zugewiesen. Vom Scheduler wird dann die Funktion in diesem Intervall aufgerufen, wobei auch überprüft wird ob eine andere Funktion eine wichtigere Priorität hat. Es kommt auch vor, dass die Ausgeführte Funktion unterbrochen wird um eine Wichtigere Funktion auszuführen.

http://de.wikipedia.org/wiki/Prozess-Scheduler

Auf dem Arduino ist dies diese Struktur nur ansatzweise umsetzbar.

Es gibt mittlerweile ein Lib die eine ähnliche Funktionalität umsetzt:

simpleThreads for arduino

MaFu

Beschreib doch mal, was Du vorhast. Dann kann man ev. Lösungswege vorschlagen.
_______
Manfred

uwefed

Mehrere Pins können gleichzeitig angesteuert werden, wenn sie auf dem gleichen PORT liegen und Du den Port direkt ansteuerst (siehe http://playground.arduino.cc/Learning/PortManipulation ) Damit ändern sie gleichzeitig den Zustand und nicht hintereinander wie wenn Du sie mit zB mit 2 igitalWrite() änderst.Du kannst aber immer nur einen Sketch abarbeiten.
Grüße Uwe

jurs


kann man auch 3 oder 4 Aktionen (Pins) gleichzeitig und unabhängig von einander ansteuern?


Völlig "gleichzeitig" geht nicht, also ein paar millionstel oder tausendstel Sekunden werden zwischen den Aktionen immer liegen. Bei grottenschlechter Programmierung auch Sekunden. Unabhängig voneinander ist allerdings kein Problem.

Das Prinzip ist, für jede der Aktionen in der Loop eine Funktion zu haben:

void loop()
{
  unter_loop1();
  unter_loop2();
  unter_loop3();
  unter_loop4();
}

Und jede der unter_loop Funktionen arbeitet für sich selbst hin, und zwar OHNE die Verwendung irgendwelcher delay Funktionen. Stattdessen müssen delays über die Auswertung von Timern oder millis oder Timer-Interrupts realisiert werden.

Bei längerdauernden Aktionen mußt Du mit Statusvariablen arbeiten. Beispiel Blinken: Du schaltest den Blinker an und ermittelst den Zeitpunkt, wann er wieder ausgehen soll. Dann wird die Loopfunktion zum Blinken zwischendurch hunderte, tausende oder millionen mal aufgerufen und nichts passiert, bis die Zeit zum Ausschalten da ist. Dann schaltet die Blinkfunktion aus und setzt wieder die neue Aktionszeit für den Start des nächsten Blinkvorgangs.

Bei anderen "länger dauernden" Aktionen entsprechend.

Funktionen, die "länger dauern" als Du es unter "gleichzeitig" verstehst, sind in dem Programm dann komplett verboten und dürfen nicht verwendet werden.

Go Up