PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : multitasking für asuro?



Matze 3
14.04.2009, 09:16
gibt es multitasking für den asuro??

wenn ja wie kann ich das programieren?

dremler
14.04.2009, 09:52
wozu brauchst du das?

Besserwessi
14.04.2009, 10:05
Klassisches Multitasking ist beim µC eher weniger üblich. Meistens geht es ohnehin darum auf Sensoren zu reagieren. Dann bietet es sich an interrupts zu verwenden, ggf. auch einen Timer Interrut, wenn der Sensor selbst keinen Interrupt auslösen kann.

thewulf00
14.04.2009, 10:06
Multitasking ist eine Eigenschaft eines Betriebssystems, d.h. einer Software, um eine Hardware, die das nicht kann, anscheinend mit dieser Fähigkeit auszustatten.
Das bedeutet: Der Asuro kann das noch lange nicht, sofern Du den Hardwareteil des Asuros meinst. Die Frage müsste genauer lauten: "Hat schon jemand ein Multitaskingsystem auf dem Asuro realisiert und würde mir die Sourcen geben?"
Das Problem am Multitasking ist, dass man gleich von Tasks, also Prozessen, spricht. Das gibt es aber in dieser Form nicht auf einem µC, so dass das Prinzip des Multitaskings sofort hinfällig ist.

Etwas Ähnliches könnte man aber mit etwas trickreicher Programmierung realisieren. Aber das ist meines Erachtens bei einem µC unnötig. Um mehrere Abläufe auf einem µC zu parallelisieren (also Multitasking zu betreiben), gibt einem die Hardware genug Möglichkeiten (Timer, Interrupts) an die Hand.
Versuche einfach, Deine Vorhaben auf Hardwareebene mit geschickter Programmierung umzusetzen. Denn ein echtes in Software realisiertes Multitasking bedeutet automatisch einen großen Performanceverlust auf einem µC.

Valen
14.04.2009, 10:56
Suche, suche, ... und sie werden es finden. Da sind 13 (oder 12 plus deine) Threads uber multitasking im Asuro Abteilung alleine.

Osser
14.04.2009, 12:07
Hi,

hatte hier https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=27463&start=22 mal ein kleines MT Framework aufgesetzt um mehrere Tasks parallel abarbeiten zu lassen. Ist noch nicht ganz ausgereift aber geht für Testzwecke schon ganz ordentlich.

Gruss,

O.

PICture
14.04.2009, 12:29
Hallo!

Multitasking mit paralell laufenden Tasks ist bei nur einem Prozessor nicht möglich. Die einzelnen Tasks können nur nacheinander laufen. Wenn alle Unterprogramme sehr kurze Ausführungszeit haben, scheint es für einen Beobachter gleichzeitig zu sein. Paralell zum Programm können in einem µC nur Timer laufen.

MfG

Matze 3
14.04.2009, 12:56
ich brauche das multitasking...

ich habe ein programm... da fährt mein asuro ca. 15 secunden grade aus... und ich möchte in einem 2ten task die taster abfragen... weil der asuro könnte ja nur vor und nach den 15 sec die tasten abfragen...

wie kann ich das so programmieren das die taster gleichzeitig abgefargt werden??

Osser
14.04.2009, 13:26
Hi PICture,

Du hast natürlich Recht! Wollte in dem Zusammenhang lediglich meine Antwort nicht überfrachten mit Informationen die Ihm nicht weiter helfen.
Mein Projekt realisiert ein preemptives Multi-Tasking das parallel 1..n Tasks laufen lassen kann. Somit kann z.B. der Asuro im 1. Task angewiesen werden um geradeaus zu fahren, im 2. Task wird der Schalter geprüft und im 3. Task wird Ausgeführt was durch Task 1 und 2 festgelegt wurde.

Ein Task entspricht hierbei einer Funktion, die in einer Endlosschleife läuft, ganz einfach also.



O.

PICture
14.04.2009, 13:38
@ Osser

Das ist natürlch die einfachste Möglichkeit. :)

@ Matze 3

Ich kenne dein bisheriges Programm nicht, aber am einfachsten wäre in gleichen Zeitabständen, die z.B. durch ein Timerinterrupts festgelegt sind, den Strom der Motoren für Abfrage den Tastern unterbrechen.

Wenn ein Taster z.B. ca. 10ms (mit Entprellung) fürs Abfragen benötigt und die z.B. 5 Taster nacheinander in gleichen Zeitabständen z.B. 200 ms abgefragt werden, wird sich der mittlere Strom der Motoren nur um 5 % (5 x 10 ms / 5 x 200 ms) verringern, was die Motoren praktisch nicht verlangsamen würde und nicht bemerkbar wird. Das ist nur meine Idee, wie ich es machen würde und du kannst dir das geneuer durchdenken und ausrechnen.

MfG

BurningBen
14.04.2009, 13:47
warum kannst du während der motorfahrt denn die Taster nicht abfragen?
Benutzt du Sleep um die 15 Sekunden zu "verbraten"?

Du könntest mit nem Timer am Anfang die Motoren starten, und dann nach 15sek. wieder ausschalten. Dazwischen kann doch dein Programm machen was es/du will(st)

PICture
14.04.2009, 13:55
Hallo BurningBen!

Ich kenne den Asuro gar nicht, aber wie kann im schlafendem µC Programm laufen?

MfG

thewulf00
14.04.2009, 14:10
Nein, er meint das anders.
Dass der Bot fährt, entscheidet ja letztendlich nur ein Bit in einem Port. D.h. Ich setze das Bit und programmiere einen Timer so, dass er das Bit nach 15 Sekunden wieder löscht. (Der Timer macht das im Hintergrund mithilfe von Interrupts.)
Danach kann ich also ins Hauptprogramm gehen und machen, was ich möchte:
- Taster abfragen
- ne Melodie spielen
- Pi berechnen
- etc.

Die Taster könnte man darüberhinaus auch komplett auf Interrupts auslagern, so dass ein Timer sich um das fahren kümmert, ein Interrupt um die Tasten und mein Hauptprogramm dreht Däumchen. Und schon haben wir drei "Tasks". Während der Timer und der Interrupt kooperativ laufen, läuft das Hauptprogramm preemptiv.

PICture
14.04.2009, 14:33
Ja das geht, aber für mich ist deine Beschreibung nicht ganz klar. Angenommen wir haben nur ein Timer der in regelmässigen Abständen beim Überlauf ein Interrupt auslöst.

Vor dem Starten des Timers wird der Portbit für die Motoren gesetzt. Dann kann man bei jedem Interrupt in ISR die Tasten abfragen und die Interrupts zählen. Wenn bestimmte Anzahl von interrupts gezählt wurde, wird der Portbit für Motoren gelöscht. Das Programm wird nur für Ausfürungszeit der ISR unterbrochen. So habe ich das (hoffentlich richtig) verstanden. :)

MfG

Osser
14.04.2009, 14:36
Hi @All,

ja natürlitsch, logitsch!

Matze 3 hat halt gefragt ob da was mit MT geht und dementsprechend hab ich dann geantwortet. State Machines, Timer udgl. geht natürlich auch immer, kann aber sehr unübersichtlich werden bei komplexen Aufgaben.


O.

oberallgeier
14.04.2009, 15:04
... Paralell zum Programm können in einem µC nur Timer laufen ...Hmmm, und was ist mit dem ADC? Der wandelt bei mir Daten - während einiges andere "im Programm" abläuft. Oder sehe ich das falsch? Parallel dazu "wartet" der PCI und der extINT (bei mir) ob sich in der Welt draussen was tut . . . . und die kann ich doch, mal etwas pingelig gesprochen, doch auch nicht als Timer ansehen. Oder sehe ich das falsch?

PICture
14.04.2009, 15:18
Hallo oberallgeier!

Natürlich kann auch der ADC, wie ein Timer, paralell zum Programm laufen. Und der "interrupt on change" kann sogar den Prozessor vom Schlaf aufwecken. Ich habe aber leider nicht an alles gedacht, wenn ich schnell die Antwort geschrieben habe. :)

MfG

thewulf00
14.04.2009, 15:22
Das siehst Du richtig.

Alle Hardware-Aufgaben laufen parallel zum µC. Sprich Timer/PWM/RTC, Interrupts, ADC, TWI/I2C/USI, JTAG, UART/USART/RS232, SPI, Watchdog, EEPROM...

C-H-T
15.04.2009, 23:13
Ich unterbrech euch nur ungern bei den ganzen Interrupts.. Aber kann mir einer sagen wie ich den internen Timer vom Atmega auslesen kann? Wisst ihr was ich meine? Die C-Control Dinger haben so ne schöne Timer Variable die ich nutzen kann um mir halt nen eigenen Sekunden Timer zu basteln und mein Programm weiter laufen zu lassen.. da der interne timer vom controller ja eh immer läuft..
so zb in Basic


DEFINE Zeit Word

Zeit = Timer
...
...Schleife...
IF (Timer - Zeit) >= 50 THEN GOSUB Ausgabe
...
..

#Ausgabe
Zeit = Timer
PRINT..
RETURN



brauch halt die den Timer vom Atmega :( und vllt ne kleine angabe dazu.. 36 war 1ms oder?

mfg

thewulf00
16.04.2009, 07:17
Um einen Sekundentimer zu basteln, nimmst Du einen Timer, stellst ihn auf einen Wert ein, der ein Teiler von einer Sekunde ist und zählst in dem Timer eine Variable hoch. Sobald die Variable den Wert erreicht hat, der eine Sekunde ergibt, kannst Du irgendwas auslösen, eine Variable setzen, wie Du eben willst.

Ein wunderbares Beispiel dazu ist im Wiki. Unter "LED blinken lassen" oder so.

C-H-T
16.04.2009, 12:12
Weiß nicht ob wir aneinander vorbei schreiben, wieviele ticks hat denn der atmega? damit ich weiß wie hoch ich zählen lassen muss, weil sleep oder so kann ich ja nicht verwenden da er dauerhaft die sensoren abtasten muss womit mir ein warten nichts nützt zB msleep(1000); Sekunde+=1; wäre schlecht da der asuro ja eine sekunde lang nicht auf eingaben reagieren würde..

Oder hab ich da jetzt was falsch verstanden? Tu mich bei solchen "primitiven" Microcontrollern noch etwas schwer..

BurningBen
16.04.2009, 12:23
ich kenn mich selber mit timern nicht sonderlich gut aus.
Aber ich glaube, du musst du nen Prescaler einstellen, damit weisst du dann auch, wie schnell der zählt.

thewulf00
16.04.2009, 13:25
Guck bitte ins RN-Wissen (wiki). Da kannste das Beispiel nehmen, das ich meine. Dort steht alles beschrieben. Ein einer Variable stellst Du die Taktfrequenz ein, oder das Makefile macht sie (in der C-Version). Dann hast Du einen 10ms-Timer. Zähle dann einfach eine Variable bis 100 hoch, und Du kannst ein Ereignis Deiner Wahl auslösen. Das ganze passiert natürlich im Hintergrund.