Hier mal ein Fragment meiner "Einfachst" Multitasking Strukur:Zitat von robo.fr
Grundsätzlich wird (fast) das gleiche wie bei robo.fr erreicht.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. } }
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
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 von robo.fr
Hallo Damaltor. Wenn ich die benutzte, dann geht es aber nicht. Hab sie jetzt weggelassen (wie immer).Zitat von damaltor
Lesezeichen