Zitat Zitat von robo.fr
eine "Einfachst" Multitasking Strukur zu entwerfen
Source von robo.fr
Hier mal ein Fragment meiner "Einfachst" Multitasking Strukur:
Code:
                  int   main (void)
{
         unsigned long  v_time = 0;

         unsigned long  v_P1_lasttime  = 0;  // PROZESS: Tasten auswerten
#define                 d_P1_wartezeit   50; // Zeit in ms

         unsigned long  v_P2_lasttime  = 0;  // PROZESS: Status-LEDs blinken
#define                 d_P2_wartezeit   200;// Zeit in ms
         unsigned char  v_P2_LEDonoff  = 0;

         unsigned long  v_P3_lasttime  = 0;  // PROZESS: Linien-Sensoren
#define                 d_P3_wartezeit   5;  // Zeit in ms
         unsigned int   v_P3_line [2];

         unsigned long  v_P4_lasttime  = 0;  // PROZESS: PID-REGLER
#define                 d_P4_wartezeit   2;  // Zeit in ms

   Init ();

   while (1)
   {
      /*----------------------------------------------------------------------
         Zeitbasis fuer die Prozesse aktualisieren
      */
      v_time = Gettime ();

      /*----------------------------------------------------------------------
         PROZESS: Tasten auswerten.
      */
      if (v_time > v_P1_lasttime)
      {
         v_P1_lasttime = v_time + d_P1_wartezeit;

         /*
            Tasten lesen ...
         */
         v_taster = PollSwitch ();
         if (v_taster != 0)
         {
            // Mach was mit der Taste
         }
      }

      /*----------------------------------------------------------------------
         PROZESS: Status-LED blinken lassen
      */
      if (v_time > v_P2_lasttime)
      {
         v_P2_lasttime = v_time + d_P2_wartezeit;

         if (v_P2_LEDonoff)
            LED_STATUS_YELLOW
         else
            LED_STATUS_OFF
         v_P2_LEDonoff ^= 1;
      }

      /*----------------------------------------------------------------------
         PROZESS: Linien-Sensoren
      */
      if (v_time > v_P3_lasttime)
      {
         v_P3_lasttime = v_time + d_P3_wartezeit;

         LineData (v_P3_line);
      }

      /*----------------------------------------------------------------------
         PROZESS: PID-Regler
      */
      if (v_time > v_P3_lasttime)
      {
         v_P3_lasttime = v_time + d_P3_wartezeit;

         // Motorregler-Aufruf
      }

      /*----------------------------------------------------------------------
         PERMANTER RECHENPROZESS
      */
      // Volle Rechenleistung ist hier verfügbar, ohne sich um ein
      // 'Timing' zu kümmern.
      // Natürlich darf hier keine Endlosschleife sein.
   }
}
Grundsätzlich wird (fast) das gleiche wie bei robo.fr erreicht.
Als großen Vorteil meiner Schreibweise sehe allerdings, dass ich einen 'Prozess' komplett innerhalb einer if-{ }-Struktur habe und es somit (auf alle Fälle für mich) übersichtlicher scheint.

Was ich aber auf alle Fälle für vorteilhaft halte, ist, dass bei mir die CPU immer die while(1)-Schleife durchläuft und nicht in ein Warten übergeht.
So besteht die Möglichkeit innerhalb der Schleife eine permanente Aufgabe mit 'Höchstgeschwindigkeit' bearbeiten zu lassen. Als Idee wäre da z.b. eine Strategieberechnung für eine Wegsuche.
Aber dadurch 'verliere' ich die Möglichkeit von 'Zeitabläufen' nach 10, 15, 50 (oder so) Einheiten bestimmte Dinge zu tun.
Da läßt sich doch bestimmt eine Kombination finden!

Edit: Man ist das blöd. Natürlich kann man die permante Aufgabe in die While-Schleife am Ende von robo.fr's Code stecken, wo er auf den Ablauf der kleinsten Zeiteinheit wartet!

Wenn nun auch alle Sensoren per Interrupt 'von alleine' ihre Dienste erledigen, ist alles 'fertig'. Das wollen wir natürlich keinesfalls

Zitat Zitat von robo.fr
das Projekt von Osser scheint mir recht anspruchsvoll zu sein
Da kann ich nur zustimmen, Das Prinzip ist mir zwar so einigermaßen klar, aber aktuell kann ich auch noch nicht finden wo da der beschrieben Fehler stecken soll. (Hab das Programm noch nicht bei mir laufen lassen. Erst (versuchen zu) verstehen, dann staunen)

Zitat Zitat von damaltor
bitte an die anführungszeichen denken
Hallo Damaltor. Wenn ich die benutzte, dann geht es aber nicht. Hab sie jetzt weggelassen (wie immer).