Programación multitarea

Hola como están
Llevo realizando un proyecto en los cual utilizo GPS y GSM la idea es que cuando alguien le dé un timbre al gsm responda con los datos del gps hasta ahí me funciona bien pero el problema está cuando aparte de recibir las solicitudes de datos del gps vía gsm quiero hacer un control de la velocidad constantemente con los datos del gps como podría hacer esas dos tareas solo puedo hacer una escucho los timbres o actualizo el gps constantemente .

no es posible hacerlo al mismo tiempo. pero si tu código esta optimizado veras que lo ejecuta tan rápido que es inapreciable.

Gracias por tu respuesta qué opinas si lo hago de esta manera dar mayor prioridad al timbre en el ciclo loop y atender la alarma de velocidad cada 30 segundos con la función millis()

void loop()
{

    
    if(gsm.available()>0)
    {
      if(beginGsm())
      {
          if(gpsTiny())
          {
           
            sms("q="+latitud+","+longitud+" "+velocidad,numero);
          }
          else
          {
            sms("El GPS no se encuentra disponible intentelo otra vez",numero);
          }
      }
    }
    else
    {
      if(millis()-tiempo>=30000)
      {
        tiempo=millis();
        if(gpsTiny())
        {
            
          if(vel>60.0)
          {
            infracciones++;
            sms(""+latitud+","+longitud+" ""Infracion de velocidad detectada "+velocidad,"\"xxxxxx\"");
          }
        }
       }
      }
}

Con serial puedes medir el tiempo de los bloques, para saber más o menos tiempo que tarda en ejecutarse, es lo que hago yo con los robots para saber que partes hay que optimizar.

    if(gsm.available()>0)
    {
      debugtime = millis();
       if(beginGsm())
       {
          [...]
       }
       Serial.print(millis()-debugtime);  
       Serial.print(" ms = T1");
    }
    else
    {
      if(millis()-tiempo>=30000)
      {
        tiempo=millis();
         if(gpsTiny())
         {
           [...]
         }
       Serial.print(millis()-tiempo); 
       Serial.println(" ms = T2");
       }
      }
}

La función millis() ten en cuenta que se desborda en 50 días >> http://arduino.cc/es/Reference/millis << por si haces una aplicación que este mucho tiempo encendida.

Un saludo!

Gracias por su ayuda me sirvió de mucho.
Una vez que tengo todo eso funcionado me surge un problema nuevo cuando hago el timbre al módulo GSM este me responde con los datos del GPS pero me di cuenta de que cada vez que le doy un timbre o el control de tiempo llega a los 30 segundos arduino sufre un reset automático probé las siguientes posibilidades:

Primero que no sea cuestión de alimentación separe los módulos con alimentación diferente para cada uno

Luego vi algo de que hay un error con el reset en la versión de arduino uno R 2 y le agregue un 1n4148 entre reset y 5V http://dreamingrobots.com/forums/viewtopic.php?f=8&t=258+

Al final creo que el problema está en la librería de tinygps (http://sundial.org/arduino/index.php/tinygps/)no sé qué causa esto pero me parece que va por ese lado esta librería usa esta forma de obtener los datos del GPS

boolean gpsTiny()
{
  bool newData = false;
  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (Gps.available()>0)
    {
      char c =Gps.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;        
    }
  }
   if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    
    flat == (TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    flon == (TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    
    vel=gps.f_speed_kmph();
    
                      char cadLat[10];
                      dtostrf(flat,10,6,cadLat);
                      latitud=String(cadLat);
                      
                      char cadLon[10];
                      dtostrf(flon,10,6,cadLon);
                      longitud=String(cadLon);
                      
                      char cadVel[4];
                      dtostrf(vel,4,1,cadVel);
                      velocidad="Velocidad :"+String(cadVel)+"Km/h";
                    
    

  }
      Gps.flush();
      return newData;  
}

Mi sospecha es que arduino ve el ciclo while como un ciclo infinito y resetea el arduino pero lo que no entiendo es como puede mandar el SMS con los datos del gps una ves que los manda llega el reset

creo que encontré el problema del reset automático.Se debe porque estaba usando la librería #include <stdlib.h> que me facilitaba las conversiones de float a String o viceversa borrando esta parte de las conversiones se soluciona pero a qué se debe esto la razón está en este enlace http://arduino.cc/forum/index.php?action=printpage;topic=78067.0 que dice que las variables del tipo String o arreglos consumen muchos recursos de nuestro 328P concretamente la memoria SRAM la cual es muy limitada (SRAM-->2 KB (ATmega328)).
Saludos