kann ich mehrere anwendungen mit arduino parallel programmieren?

5 Antworten

genau da spielt die "Zykluszeit" eine rolle, die ein controller innerhalb einer bestimmter zeit die Programmschleife abklappert...je schneller desto besser und der mensch empfindet die reaktionen der Hardware als fast zeitgleich...

Woher ich das weiß:Hobby – Zuerst Hobby, dann Beruflich, jetzt beides :)

Ja und nein.

Der Prozessor klappert stur seine Befehle ab, der wechselt nicht zwischen verschiedenen Programmabläufen um - das macht kein Computer.

Man muß das Programm so schreiben, dass der Wechsel passiert.

Kann man an den Stack, kann man per Timer die Stacks umschalten und der Return des Timers landet dann in dem Programmteil was ausgeführt wird bis der Timer wieder unterbricht und den nächsten Teil umschaltet. Das ist sehr schwierig, vor allem weil man nicht kontrollieren kann wo unterbrochen wird.

Bei so was beliebter ist das "Round Robin" Verfahren, zu Deutsch sozusagen "Ehne Mehne Muh!"

Man unterteilt die Programme in kleine Abschnitte und nummeriert die durch. Jeden Teil setzt man in ein Unterprogramm, z.B. A1, A2, A3, .... A12, A13 usw. Das selbe mit allen anderen Programmen also B, C, D USW.

Dann schreibt man ein main() in dem für jedes Programm nacheinander ein "Switch case" drin ist und jeweils eine Variable die sich die Nummer merkt.

Dann führt das zuerst A1 aus, dann B1, C1, ... wobei jedes mal wenn ein "switch case" zuende ist die Variable inkrementiert wird. So werden die einzelnen Blöcke gezielt "durcheinander" aber für das jeweilige Programm in der richtigen Reihenfolge ausgeführt. Verfeinern kann man das durch Mechanismen die Blöcke überspringen wenn die nicht gebraucht werden oder Programme eine Weile abschalten. Z.B. stellt "B" fest, dass es nichts zu tun gibt und meldet das dem "main" so dass B ein paar Takte nicht mehr ausgeführt wird und wenn es wieder ausgeführt wird, dann von vorne. Stürzt ein Programm ab, kann der Watchdogtimer dieses Programm neu starten (dessen Variable zurück auf 0 setzen) wärend alle anderen normal weiter laufen. Dazu braucht man nur ein Flag das dem WDT anzeigt welches Programm (A, B, C usw) aktiv war.

Aber in Deinem Fall dürfte einfacher sein, den Motor immer regelmässig zwischendurch zu bedienen, also einfach einen Timer nutzen der den programmablauf unterbricht, sich um den Motor kümmert und dann weiter macht. In den Timer setzt man dann die Programmteile die regelmässig zwischendurch bearbeitet werden müssen und der Timer sorgt dafür, dass diese Vorgänge immer pünktlich zu festgelegten Zeiten ausgeführt werden. So kann man z.B. auch eine PWM für den Motor gleich in einem programmieren!


dablub  03.02.2014, 18:51

Der Prozessor klappert stur seine Befehle ab, der wechselt nicht zwischen verschiedenen Programmabläufen um - das macht kein Computer.

threading ? multicore ?

0
Commodore64  04.02.2014, 14:26
@dablub

Das macht das Betriebssystem, nicht der Prozessor selber. Wie soll das denn gut gehen wenn der da spontan den ABlauf der Programme nach eigenem Ermessen abändert und wild im Code herumspringt!?

Und Multicore wird ebenfalls von Programmen, genauer dem Betriebssytstem gesteuert, Programme werden nicht einfach so zerrissen und verteilt - und damit völlig durcheinander - ausgeführt. Hier weist das Betriebssytem sogenannte Threads, also Teilaufgaben einem prozessor zu und kontrolliert den Ablauf so dass nicht durcheinander geht.

0

Es wird immer sequentiell abgearbeitet, du musst dir bewusst werden, was wie schnell ablaufen muss.

Zum Beispiel die Datenausgabe auf einem Display, da reicht es, wenn die jede Sekunde 1mal aktualisiert wird, das menschliche Auge muss ja die Zeit haben das zu erfassen.

Auch Motoren muss man nicht ewig schnell ansteuern und Sensoren auch nur in einer bestimmten Zeit abfragen.

Also mach dich vertaut mit "Timing".

du kannst mit interupts arbeiten ... die halten den aktuellen vorgang an, machen etwas anderes.... und kehren dann zu der stelle zurück an der sie stehen geblieben sind ...

ansonsten must du mit der einen schleife vorlieb nehmen, aber das sollte eigentlich kein problem darstellen