Wie schreibt man ein Programm mit mehreren Tasks

Gast #39782
Was sind denn für Dich mehrere Tasks?

Wenn es das ist, was man gemeinhin darunter versteht, dann
brauchst Du wohl ein entsprechendes Betriebssystem dafür.
Aber vielleicht meinst Du ja auch was ganz anderes...
Gast #39783
Ich möchte einfach nur mehrere Programmabläufe gleichzeitig ablaufen 
lassen.
Etwa so:

task1()
{
  // Programm1
}

task2()
{
  // Programm2
}

Ich benutze einen AT90S4433, falls das wichtig ist.
Gast #39785
Es gibt eine Reihe von Kerneln für Echtzeitsysteme auf AVR,
kann man mit Gugel sicher finden.

Für einen so kleinen Prozessor würde ich mir sowas aber sicher
nicht antun.  Ich habe mir mal eine kleine Bibliothek geschrieben
für Timer-Events, die dann Callback-Funktionen abarbeiten, das
erfüllt letztlich einen ähnlichen Zweck (wenngleich völlig
anders in der Benutzung), selbst das braucht schon ein gutes
Stück an ROM.  Die Echtzeitkernel brauchen sowas auch, haben
aber noch zusätzlichen Overhead für die Thread- oder Taskverwaltung
(mehrere Stacks, Ressourcenverwaltung).
Gast #39786
Das scheint ja etwas aufwendiger zu sein als ich dachte.
Ich werde mal sehen was ich mit den Mini-Threads von
Claudio Lanconelli anfangen kann, falls es keinere einfachere
Lösung gibt.
Das Programm was ich damit verwirklichen möchte soll blos
für einen kleinen Roboter sein der Hindernissen ausweicht.
Also ein Programm das auf drei Sensoren, die entweder
eine eins oder eine null an den Mikrocontroller geben,
reagiert und zwei Motoren ansteuert.
Gast #39787
Ich weiß ja nicht wie schnell dein Roboter reagieren soll und wie 
umfangreich deine Sensor-Abfrage ist, aber ich würde sagen es reicht die 
Sensoren nacheinander abzufragen und danach entsprechend zu reagieren 
(AVR´s sind verdammt schnell!)

Gruß, Florian
Gast #39788
> ich würde sagen es reicht die Sensoren nacheinander abzufragen und danach 
entsprechend zu reagieren

Genau, oder beide Tasks in kleinere Stücke zerlegen, diese in einer 
Statemaschine verteilen und wenn ein kleines Stück abgearbeitet ist, 
abbrechen und zurückkehren zum Hauptprogramm, das dann die Statemaschine 
des anderen Tasks aufruft.

(möglicherweise zerpflückt das Forum die Einrückungen, also entsprechend 
hinzudenken)

main()
{
 while(1)
 {
  task1();
  task2();
 }
}

task1()
{
 switch(state_t1)
 {
  case 1:
   kleines Codestueck;
   state_t1=2;
   break;
  case 2:
   nächstes Codestueck;
   state_t1=3;
   break;
  ...
 }
}

task2()
{
 switch(state_t2)
 {
  case 1:
   kleines Codestueck;
   state_t2=2;
   break;
  case 2:
   nächstes Codestueck;
   z.B. Meßwertgrenze überschritten?
    -> ja: state_t1=1;
    -> nein: state_1=2; /* weiter warten */
   state_t1=1;
   break;
 }
}

Bei geschickter Aufteilung der einzelnen States, werden diese quasi 
parallel ausgeführt. Geschickte Aufteilung ist immer dann, wenn auf ein 
externes Ereignis aktiv gewartet werden müßte oder die Ausführung zu 
lange dauern würde und die Abarbeitung des/der anderen Task(s) 
blockiert.

Schmittchen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.