Multitasking (Quelle: Roboterclub-Freiburg)

PHP-Code:
  //*******************************************************************
//
// Multitasking ohne Betriebsystem
//
// Beispiel fr ASURO Roboter
//
// In diesem Programm laufen mehrere Programmteile quasi "gleichzeitig"
// Oft ist es bei der Roboterprogrammierung notwendig, dass mehrere
// Aufgaben zur gleichen Zeit durchgefhrt werden sollen.
// Die Hauptschleife wird mit 1/10 Sekunde durchlaufen, daher können
// Reaktionszeiten von 0,1 Sekunden erreicht werden.
//
// Die Front-Led blinkt unabh?gig von den Rckwärtsleds
// Gleichzeitg werden die Motoren gestartet, wenn der Zeitgeber der
// RückwertsLED's einen bestimmten Wert errreicht.
//
// 17.5.2007 ch
//
//*******************************************************************
#include "asuro.h"

int main(void)
{
    
uint32_t nextzeit=100// Zeitgebervariable mit 32 Bit
    
uint16_t funktion1_zeit=0// Zeitgebervariable fr 1.Funktion
    
uint16_t funktion2_zeit=0// Zeitgebervariable fr 2.Funktion
    
uint16_t funktion3_zeit=20// Zeitgebervariable fr 3.Funktion

    
Init();

    while(
1)
    {
//*******************************************************************
// Funktion1: Statusleuchtdiode blinken lassen
//*******************************************************************
        
        
if (funktion1_zeit==0)
        {
            
StatusLED(GREEN);
        }
        if (
funktion1_zeit==10// Nach 1 Sekunde auf Rot umschalten
        
{
            
StatusLED(RED);
        }
        
funktion1_zeit++;
        if (
funktion1_zeit>20funktion1_zeit=0;

//*******************************************************************
// Funktion1: Ende
//*******************************************************************
//*******************************************************************
// Funktion2: Rckwärtige Leuchtdioden abwechselnd schalten
//*******************************************************************
        
        
if (funktion2_zeit==0)
        {
            
BackLED(OFF,ON);
        }
        if (
funktion2_zeit==15// Nach 1,5 Sekunde auf Rot umschalten
        
{
            
BackLED(ON,OFF);
        }
        if (
funktion2_zeit==49)
        {
            
funktion3_zeit=0// hiermit wird die Funktion3 gestartet
        
}
        
funktion2_zeit++;
        if (
funktion2_zeit>50funktion2_zeit=0// 3 Sekunden

//*******************************************************************
// Funktion2: Ende
//*******************************************************************
//*******************************************************************
// Funktion3: Motoren benutzen
// Diese Funktion wird gestartet, wenn die Variable
// function3_zeit auf 0 gesetzt wird
//*******************************************************************
        
        
if (funktion3_zeit==0)
        {
            
MotorSpeed(255,255);
            
MotorDir(FWD,FWD); // Motoren vorwäts
        
}
        if (
funktion3_zeit==5// 0,5 Sekunden
        
{
            
MotorSpeed(255,255);
            
MotorDir(RWD,FWD);
        }
        if (
funktion3_zeit==10// 0,5 Sekunden
        
{
            
MotorSpeed(0,0);
        }

        if (
funktion3_zeit<15funktion3_zeit++; // Funktion beenden, wenn 15 erreicht

//*******************************************************************
// Funktion3: Ende
//*******************************************************************

        // Schleifendurchlauf auf 0,1 Sekunden synchronisieren
        
while(Gettime()<nextzeit); // warten, bis Zielzeit erreicht
        
nextzeit=Gettime()+100// Zeitgeber auf 100 Millisekunden= 0,1 Sekunde stellen
    
}