-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: "Multithreading" mit C ?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385

    "Multithreading" mit C ?

    Anzeige

    Hi,
    Ich hätte gerne, dass sich die Servos von meinem Roboterarm sich gleichtzeitig bewegen können, und am Besten noch so, dass sie, egal wie weit sie sich bewegen mussten, synchron zum Stillstand kommen.
    Bis jetzt habe ich meine Servos immer mit einer for-Schleife bewegt. Sofortiges setzen der Endposition für dazu, dass die 2 400 Ncm Servos, die den Oberarm bewegen, den kompletten Roboterarm aus der Verankerung reißen. Sie bewegen sich zusätzlich langsamer durch ein _delay_ms() in der Schleife.

    Code:
    int i=0;
    for(i=1; i<=255; i++) {
        servo_move(1, i);
        _delay_ms(20);
    }
    Hat jemand sowas schon mal gemacht oder ne Idee wie das gehen könnte? Wollte mir nur ungern 4 weitere Pozessoren kaufen.

    mfg
    jagdfalke

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,
    hier im Forum wurde mal eine Version von Multithreading für den Asuro gepostet, musst danach suchen, finde ich jetzt nicht.
    Das hat recht gut geklappt, alle LEDs blinken und faden gleichzeitig in unterschiedlicher Geschwindigkeit, obwohl nur mit warteschleifen programmiert.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Also ich mache das meistens so in der Art:
    Code:
    unsigned int Timer_1ms;
    unsigned char TaskFlags;
    
    #define TASK_1		0
    #define TASK_2		1
    
    SIGNAL(SIG_OVERFLOW1)
    {	
    	Timer_1ms++;
    	
    	if(Timer_1ms % 5 == 0)
    	{
    		TaskFlags |= (1 << TASK_1);
    	}
    	
    	if(Timer_1ms % 10 == 0)
    	{
    		TaskFlags |= (1 << TASK_2);
    	}
    }
    
    int main(void)
    {
    	for(;;)
    	{
    		if(TaskFlags & (1 << TASK_1))
    		{
    			TaskFlags &= ~(1 << TASK_1);
    			Funktion_1();
    		}
    		
    		if(TaskFlags & (1 << TASK_2))
    		{
    			TaskFlags &= ~(1 << TASK_2);
    			Funktion_2();
    		}
    	}
    }
    Also jeder Prozess hat ein eigenes Flag in irgendeiner globalen Variable.
    Ist eines dieser Flags gesetzt wird in der Hauptschleife entsprechend darauf reagiert und das Flag wieder gelöscht.
    In dem Beispiel wird also eine Funktion alle 5ms, und die andere - unabhängig davon - alle 10ms aufgerufen.

    Natürlich müssen die Flags nicht zwangsläufig durch einen Timer-Interrupt gesetzt werden, das sollte nur als einfaches Beispiel dienen.



    Das dürfte so ziemlich die einfachste Methode sein um "Multithreading" zu simulieren.
    (es geht naürlich noch besser, aber das sollte in den meisten Fällen ausreichen)
    So viele Treppen und so wenig Zeit!

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Ok, danke.
    Das mit den Timers hab ich mir zwar schon durchgelesen aber noch nicht so richtig kapiert. Aber ich verstehe was in deinem Code passiert.
    Thx

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2005
    Beiträge
    10
    es geht auch das man auf den Megas ein wirkliches Multitasking programiert. Also eine Echtzeitanwendung Programieren kann.
    Man muß hierzu ein betriebssystem benutzen ist nen bisschen komplizierter wie normales Programieren aber wenn man es mal raus hat geht es. ICh versuche grade mit einem solchen system einen 5 Achs roboter anszusteuern.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Soweit bin ich noch lange nicht, aber trotzdem danke für die Antwort. Vielleicht postest du mal einen Namen oder eine Website. Das interessiert bestimmt andere hier, die etwas mehr skill haben als ich.

    mfg
    jagdfalke

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2005
    Beiträge
    10
    Ja klar ist ne geile sache wenn man es kann
    RTOS Real Time Operating System
    http://www.freertos.org/

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    es geht auch das man auf den Megas ein wirkliches Multitasking programiert. Also eine Echtzeitanwendung Programieren kann.
    Man muß hierzu ein betriebssystem benutzen ist nen bisschen komplizierter wie normales Programieren aber wenn man es mal raus hat geht es.
    Also eigentlich muss man sich bei einem Prozessor der Befehle nur sequentiell bearbeiten kann für eines von beiden entscheiden...

    entweder Echtzeitanwendung oder Multitasking, beides zusammen geht nicht.
    (nicht ohne Grund sind viele Programme zur direkten Ansteuerung von CNC-Fräsen für DOS geschrieben)


    @jagdfalke
    so wahnsinnig kompliziert ist "echtes" Multitasking eigentlich garnicht...
    Es laufen dabei mehrere Programme quasi parallel ab, wobei jedes einen kompletten Satz Register und einen eigenen Stack hat.
    Um zu einem bestimmten Thread zu wechseln muss man dessen Registerinhalte (die irgendwo im RAM abgelegt wurden) in die Prozessorregister laden.

    Ein großer Vorteil bei dieser Variante ist, daß die threads erstmal keine Rücksicht aufeinander nehmen müssen.
    d.h. sie müssen nicht freiwillig das Kommando über den Controller abgeben, sondern es wird ihnen vom Betriebssystem entrissen.
    Daher können sich die verschiedenen threads auch nicht gegenseitig blockieren.

    Der wohl größte Nachteil ist der enorme Platzbedarf im RAM.



    Die von mir vorgeschlagene Methode ist platzsparender,
    allerdings muss man da eben bei der Programmierung darauf achten daß die aufgerufenen Funktionen nicht zu lang sind.
    So viele Treppen und so wenig Zeit!

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Da ich mich auch damit beschäftigen will, habe ich einige Links aufgehoben:

    http://www.roboternetz.de/phpBB2/zei...?p=85902#85902
    oder
    http://www.fictoor.nl/irbot/frameentry.html dort unter Download > Software > A.T.A.K
    http://www.mikrocontroller.net/forum...78.html#240790 AvrMultOS.zip
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2005
    Beiträge
    10
    das problem ist halt was man machen will will ich irgendwas abarbeiten und auf externe ereignisse reagieren dann kann er per Interruptgesteuerten Programmen zu zu langen reaktionszeiten kommen oder das system reagiert gar nicht weil er in dem langen Programstück feststeckt.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •